精华内容
下载资源
问答
  • 概述今天主要总结下Oracle数据库中的会话临时表、事务临时表、中间表怎么区分,先介绍各自概念。在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个...

    概述

    今天主要总结下Oracle数据库中的会话临时表、事务临时表、中间表怎么区分,先介绍各自概念。

    在Oracle数据库中还有一种类型的表,叫做临时表。这个临时表跟永久表最大的区别就是表中的数据不会永远的存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清除。


    临时表的应用场景

    1.大表分割

    众所周知,为表创建合适的索引可以在很大程度上提高数据查询的速度。但是当某个表的数据量相当大,例如数据量为亿级时,那么创建索引将会花费大量的时间,而且,查询大的索引表,与直接查询数据表相比,在性能上几乎没有任何优势,此时,一个常用的方法就是分割大表,例如:将大表分割为多个小的临时表,然后对这些小表进行相应操作,最后对所有查询结果进行综合处理。

    d7a550f3ba0fc0461c8b93f4f3e18dad.png

    2.解决并行问题

    当多个进程同时对某张表进行操作时,往往会出现并行问题。

    3.作为数据缓存

    在程序段,可能需要对若干数据进行复杂运算。此时,可以创建一个临时表,并将这些数据存储在临时表中。因为可以像操作普通表一样操作临时表,这样,许多函数和sql语句都可以用来处理这些数据。


    会话级的临时表

    会话临时表,顾名思义,是指数据只在当前会话内有效的临时表。关闭当前会话或者进行新的连接之后,数据表中的内容就会被清除。

    语法如下:

    CREATE GLOBAL TEMPORARY ( ) ON COMMIT PRESERVE ROWS; 

    --ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。


    事务级的临时表

    事务临时表的话,当事务结束的时候,就会清空这个事务临时表。所以,当我们在数据库临时表中插入数据后,只要事务没有提交的话,该表中的数据就会存在。但是,当事务提交以后,该表中的数据就会被删除。而且,这个变化不会在重做日志中显示。

    语法如下:

    CREATE GLOBAL TEMPORARY ( ) ON COMMIT DELETE ROWS;

    --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)

    7848567d91b3e2323cb0ef490cfab08a.png

    中间表

    中间表是业务逻辑中的概念,就是将计算结果先保存在一个临时的表中,然后再从这个表中计算,减少程序的复杂度。临时表是中间表多采用的一种技术,使用 Oracle临时表功能可以免去中间表数据的维护工作。


    命令区分

     SELECT TABLE_NAME, TEMPORARY, DURATION FROM USER_TABLES WHERE TABLE_NAME LIKE 'T_T%';
    5f6964d309ceed9c6b9f103bc0fa9178.png

    下面是David Dai关于临时表的一个应用说明,我觉得非常形象的说明了临时表的应用场景:

    对于一个电子商务类网站,不同消费者在网站上购物,就是一个独立的 SESSION,选购商品放进购物车中,最后将购物车中的商品进行结算。也就是说,必须在整个SESSION期间保存购物车中的信息。同时,还存在有些消费者,往往最终结账时放弃购买商品。如果,直接将消费者选购信息存放在最终表(PERMANENT)中,必然对最终表造成非常大的压力。因此,对于这种案例,就可以采用创建临时表(ON COMMIT PRESERVE ROWS)的方法来解决。数据只在 SESSION 期间有效,对于结算成功的有效数据,转移到最终表中后,ORACLE自动TRUNCATE 临时数据;对于放弃结算的数据,ORACLE 同样自动进行 TRUNCATE ,而无须编码控制,并且最终表只处理有效订单,减轻了频繁的DML操作的压力。

    1:当处理某一批临时数据,需要多次DML操作时(插入、更新等),建议使用临时表。

    2:当某些表在查询里面,需要多次用来做连接时。(为了获取目标数据需要关联A、B、C, 同时为了获取另外一个目标数据,需要关联D、B、C....)

    关于临时表和中间表(NOLOGGING,保存中间数据,使用完后删除)那个更适合用来存储中间数据,我个人更倾向于使用临时表,而不建议使用中间表。

    一般对于复杂的sql语句处理,需要中间表作为临时数据存储。这里可以有2种选择,临时表(global temporary table)和实体表(即普通表).对于数据产生的undo而言,临时表和实体表产生的undo量差不多。但是对于redo,insert产生的redo量很少,相当于实体表的5%,可以认为很少。update产生的redo约为实体表的一般。如此,在不需要session间交换数据的情况下,应该建议使用临时表,而摒弃使用普通表来做数据中转。


    总之,如果在不需要session间交换数据的情况下,应该建议使用临时表,如果需要多个线程(多个会话)交换数据就需要使用中间表。

    后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

    60f587f8552a37c241ff8b9917b0ce41.gif
    展开全文
  • mysql 临时表:-- MaterialSortID和 MatClfID关联可以获得物料分类中文SELECT a.id,a.material_category,a.material_name,t.material_sort_name from scm_material_base a left JOIN scm_material_type t on a....

    mysql 临时表:

    -- 用MaterialSortID和 MatClfID关联可以获得物料分类中文

    SELECT a.id,a.material_category,a.material_name,t.material_sort_name from scm_material_base a left JOIN scm_material_type t on a.material_category=t.material_sort_id

    update scm_material_base a,scm_material_type b set a.material_category_name=b.material_sort_name where a.material_category=b.material_sort_id

    -- 计量单位表 通过 UnitID字段 关联

    SELECT * from scm_material_unit

    SELECT a.id,a.material_category,a.material_name,t.unit_name from scm_material_base a left JOIN scm_material_unit t on a.measure_unit=t.unit_id

    update scm_material_base a,scm_material_type b set a.material_category_name=b.material_sort_name where a.material_category=b.material_sort_id

    update scm_material_base a,scm_material_unit b set a.measure_unit_name=b.unit_name where a.measure_unit=b.unit_id

    -- 先去重

    SELECT min(id), material_code,count(1) from scm_material_base group by material_code HAVING count(1)>1

    SELECT * from scm_material_base where material_code ='0100000000290'

    SELECT DISTINCT material_code from scm_material_base

    DELETE FROM scm_material_base where id not in(

    SELECT min(id) from scm_material_base group by material_code )

    CREATE TEMPORARY TABLE tmp_table(

    SELECT min(id) from scm_material_base group by material_code

    );

    CREATE TEMPORARY TABLE tmp_table(

    SELECT min(id) from scm_material_base group by material_code

    );

    DELETE FROM scm_material_base where id not in(

    select * from tmp_table

    )

    select count(1) from scm_material_base

    展开全文
  • 如果要插入临时表中的记录数量很小/中等,一种可能性是使用文字子查询或值CTE而不是创建临时表.# MODELclass ExistingTable(Base):__tablename__ = 'existing_table'id = sa.Column(sa.Integer,primary_key=True)name...

    如果要插入临时表中的记录数量很小/中等,一种可能性是使用文字子查询或值CTE而不是创建临时表.

    # MODEL

    class ExistingTable(Base):

    __tablename__ = 'existing_table'

    id = sa.Column(sa.Integer,primary_key=True)

    name = sa.Column(sa.String)

    # ...

    假设还将以下数据插入临时表:

    # This data retrieved from another database and used for filtering

    rows = [

    (1,100,datetime.date(2017,1,1)),(3,300,3,(5,500,5,]

    创建包含该数据的CTE或子查询:

    stmts = [

    # @NOTE: optimization to reduce the size of the statement:

    # make type cast only for first row,for other rows DB engine will infer

    sa.select([

    sa.cast(sa.literal(i),sa.Integer).label("id"),sa.cast(sa.literal(v),sa.Integer).label("value"),sa.cast(sa.literal(d),sa.DateTime).label("date"),]) if idx == 0 else

    sa.select([sa.literal(i),sa.literal(v),sa.literal(d)]) # no type cast

    for idx,(i,v,d) in enumerate(rows)

    ]

    subquery = sa.union_all(*stmts)

    # Choose one option below.

    # I personally prefer B because one could reuse the CTE multiple times in the same query

    # subquery = subquery.alias("temp_table") # option A

    subquery = subquery.cte(name="temp_table") # option B

    使用所需的连接和过滤器创建最终查询:

    query = (

    session

    .query(ExistingTable.id)

    .join(subquery,subquery.c.id == ExistingTable.id)

    # .filter(subquery.c.date >= XXX_DATE)

    )

    # TEMP: Test result output

    for res in query:

    print(res)

    最后,获取pandas数据框:

    out_df = pd.read_sql(query.statement,engine)

    result = out_df.to_dict('records')

    展开全文
  • create tablespace wmdatafile 'E:\SQL\oracle\oradata\wm.dbf' size 50Mdefault storage (initial 500Knext 500Kminextents 1maxextents ...----first 创建空间wmcreate user wmdb identified by...

    create tablespace wm

    datafile 'E:\SQL\oracle\oradata\wm.dbf' size 50M

    default storage (initial 500K

    next 500K

    minextents 1

    maxextents unlimited

    pctincrease 0);----first 创建表空间wm

    create user wmdb identified by wmdb default tablespace wm;---创建用户mysql

    grant resource,connect to wmdb;----授予用户mysql权限

    drop tablespace test including contents and datafiles;----删除表空间

    drop user test cascade;---删除表空间

    alter tablespace test add datafile 'E:\SQL\oracle\oradata\test1.dbf' size 200M;---更改表空间

    create user statdba identified by password;---修改mysql用户密码

    alter user statdba identified by statdba;----修改statdba用户密码

    grant dba to mysql;--授予mysql DBA权限

    grant unlimited tablespace to mysql;--授予mysql不限制的表空间

    grant select any table to mysql;--授予mysql查询任何表

    grant select any dictionary to mysql;

    取消

    评论

    展开全文
  • TYPE = HEAP在较新的MySQL版本中已弃。您可以使用ENGINE = HEAP代替TYPE。以下是语法-ENGINE=HEAP;让我们首先创建一个。在这里,我们设置了Engine = HEAP-createTEMPORARYtableDemoTable->(->StudentIdint...
  • 作者:李立敏介绍在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全扫描,还是索引扫描,这些都...
  • 之前是SQLServer的,对mysql不熟,现在需要用到mysql。有个存储过程互相调用的问题: 存储过程p1,有两个参数a1,a2。...另一个存储过程p2,调用p1,用临时表接收p1的结果集。 在存储过程p2里调用p1该怎么写?
  • 平时查询数据库时为了查询更加快速,一般都会用到临时表,如select * into #t from tableA ,...如果临时表字段未知的时候怎么建立索引呢,可以以下sql把临时表的所有字段查出来,给所有字段建立索引DECLARE @COL...
  • --我想循环传入这些参数@DJBH,@SPBH,@SPLB,@SPMC,@SL,@DJ,@GYS,@SFJE,每次数值都不一样,不知道怎么传,循环好使,就是不知道怎么把参数传过来,sql里面没有数组,别人说能用临时表传 insert into Procure_child ...
  • 测试脚本,明明已经创建了,怎么老提示临时表名不存在,其实在高斯数据库中global 和local是性质一样的,其实这样的好处是,的时候创建,这样很大程度上减少了如果原表增加字段了,还要修改临时表的麻烦。...
  • hive 创建临时表,数据分析更方便

    千次阅读 2019-09-26 12:07:41
    所以,在日常工作中,怎么方便的创建临时几次的临时表呢??? hive 中写法可以是这样 with z1 as (这是你需要把第一个表的各种各种各种内容了放进来) ,z2 as (这是第二个表里的各种各种各种内容) ,z...
  • 平时查询数据库时为了查询更加快速,一般都会用到临时表,如select * into #t from tableA ,...如果临时表字段未知的时候怎么建立索引呢,可以以下sql把临时表的所有字段查出来,给所有字段建立索引 DECLARE @C...
  • 前两天看数据库的临时表空间满了,寻思ALTER SESSION set EVENTS 'immediate trace name DROP_SEGMENTS level 4'; 清理一下TEMP的表空间,结果sql执行了几个小时也没结束,TEMP依旧是满地,不知道该怎么处理了,...
  • 今天这篇文章,我就先给你举两个需要用到内部临时表的例子,来看看内部临时表怎么工作的。然后,我们再来分析,什么情况下会使用内部临时表。 union 执行流程 为了便于量化分析,我下面的表t1来举例。 ...
  • 求优化,只知道用临时表能优化,但是怎么用不太清楚。查了半天资料,没找到相关内容。 谢谢。。。。 :oops: [b]问题补充:[/b] 建表语句: create table DW_KEFU_ACTIVITY_DATA_M ( STATIS_MONTH VARCHAR2(20)...
  • 今天,在sql server 2008 中,在一个存储过程中创建了一个临时表#table1,打算在另外一个存储过程中使用这个临时表。可是悲剧的是,怎么都失败。更晕的是,我是在一个ASP.NET项目中调用的存储过程。其中调试错误的...
  • DELIMITER $$ USE `laolao`$$ DROP PROCEDURE IF EXISTS `parent_sport_sort1`$$ CREATE DEFINER=`root`@`%` PROCEDURE `parent_sport_...现在就是不知道这种情况临时表怎么用。 困扰了两天了,求大神们狠狠的教育
  • 在对数据库进行操作过程中我们可能会遇到这种情况,中的数据可能重复出现,使我们对数据库的操作过程中带来很多的不便,那么怎么删除这些重复没有的数据呢?  重复数据删除技术可以提供更大的备份容量,实现更...
  • 临时起意想对数据结构做的一些练习(当然是新手向的)进行总结,于是这篇文章就这么产生了。1. 在链接存储结构下,将线性表 ,以 m 位置为分界点的前后两部分元素换位成 。注:这里的线性表下标从1开始这题是相对...
  • XXX select XXX句式,但更让人纠结的是,所有将要被insert 的数据都是常数,即不存在可以被select成多行的!   倒是需要将一些常数变成多行或多条记录,怎么半呢?   我知道可以select 1,2,3这种形式将多...
  • 但这些记录必须一条insert语句插入数据库,这时候你会说可以insert intoXXX select XXX句式,但更让人纠结的是,所有将要被insert 的数据都是常数,即不存在可以被select成多行的!倒是需要将一些常数变成多行...
  • ## --包头 CREATE OR REPLACE PACKAGE TESTPACKAGE IS TYPE MYCURSOR IS REF CURSOR;... --最后想该游标来存放临时表中的数据集 来返回去 --OPEN RET_CURSOR FOR END GETRECORDS; END TESTPACKAGE;
  • 用户自定义的临时表,比如:create temporary table (id int, str1 varchar(100) );SQL执行过程中产生的内部临时表,...那么这两种临时表的计数器通常show global status like '%tmp_%tables%' 来查看。比如mysq...
  • 我的数据库是hive,但实际操作是sql操作的,所以想问怎么优化sql,因为实在是太长了,头说不行 ...求解,不用临时表可以么,join的过程中会有转换格式和添加固定字段的操作 跪谢 (头不让with as,不解)
  • 2009-08-06如何VF或者SQL软件中查找重你可以参考下面的语法测试一下吧:select 单位名称,count(单位名称)from(select * from 表1 union all select * from 表2 )as 临时表group by 单位名称having(count(单位名称)...
  • 大数据查询优化

    2018-05-20 11:21:56
    如果有2张1000W条数据的表,进行连接查询。怎么进行优化?1.建一张临时表,把一张的数据先过滤到临时表中,然后用临时表和另一张大数据表进行连接查询,这样速度会提高一点...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 257
精华内容 102
关键字:

临时表怎么用