我没有从我的DBA那里找到一个明确的答案。我在DB2仓库...巨大的表。我经常使用rsubmit来练习临时表,例如......
execute (declare global temporary table session.tmp1(task char(9))on commit preserve rows not logged) by db2;
execute (create unique index session.indexa on session.tmp1(task)) by db2;
insert into session.tmp1 select * from connection to db2
(
select distinct a.column
from table1 a
where ...
for fetch only with ur
);
然后,当我需要特定的一组价值观时,我会加入它......
from session.tmp1 t
inner join tablex x on t.task = x.task
您会注意到我声明了一个索引(甚至是唯一索引)。我的问题是......如果原始db2表上的索引尚不存在,我将用于构建临时表...我创建的索引是否重要?此外,一位高级分析师告诉我,如果我按照"我在构建临时表时索引的属性/列,当我将其用于其他表时,它将显着加快连接速度。任何人都可以确认这些问题吗?可能看似微不足道......但我真的在寻找一些关于速度的提示,特别是当我正在击的桌子非常大的时候......
答案 0 :(得分:1)
锶。分析师"排序"备注:
这取决于场景:
如果在创建tmp表期间根本没有在计划中使用order by,并且在下面的join中查询计划没有显示需要订购数据,那么在tmp表中订购数据的时间将是比连接中保存的时间大。
如果在加入中数据是在加入之前订购的,那么添加订单可能会提高此步骤的速度(计划仍将显示数据的排序,因为它不知道数据是否已订购),但是获得的时间很可能最大等于您在订购tmp表时丢失的时间。因此,当您多次使用tmp表时,可能会节省一些时间。只使用一次,它就没用了。
您创建的索引:
索引将有助于以后加入/ tmp表中的条件。因此,如果您正在使用连接中的索引列或其中:Go for it。
这方面的一个例外是:有时当您加入表中的所有数据时,索引无益。它可能会被忽略(再次参见计划),或者甚至可能会在使用它时减慢速度。这是高度DBMS依赖的:Oracle:加入所有行时,大多数情况下全表扫描更快,MySQL / MariaDB:即使有完全连接,添加索引也可以节省数小时,SQL Server自己确定它非常好(通常使用索引) ),DB2:一旦确定了这一点,请在此发布。