2015-06-20 48 views
0

我还没有从我的DBA上找到明确的答案。我正在DB2仓库中......巨大的表格。我经常练习临时表与rsubmit,如...SAS临时DB2表 - 创建索引

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表​​上...我创建的索引是否会有问题?此外,一位高级分析师告诉我,如果我在创建临时表时按“索引”属性/列进行索引,那么当我将它用于其他表时,会显着加快联接。任何人都可以确认这些问题吗?可以“按订单”此言一出看似微不足道......但我真的找对速度的一些小技巧,尤其是当我打表是非常大的...

回答

1

高级分析师:

这取决于场景:

如果在创建tmp目录表的过程中没有顺序在该计划在所有使用,并在下面加入了查询计划不显示需要对数据进行排序,时间订购tmp表中的数据将大于联接中保存的时间。

如果在连接之前数据是在加入前订购的,添加一个订单可能会增加此步骤的速度(由于计划不知道数据已排序,因此计划仍将显示数据的排序),但获得的时间很可能最多等于您在订购tmp表时丢失的时间。所以当你多次使用你的tmp表时,它可能会为你节省一些时间。只使用一次,这是非常无用的。

创建索引:

该指数将有助于以后加入/其中在TMP表的条件。因此,如果您在连接或其中使用索引列:请执行此操作。

有一个例外是:有时候当你连接表中的所有数据时,索引是不利的。它可能会被忽略(再次参阅计划),或者它可能会在使用时降低速度。这是高度依赖于DBMS的:Oracle:在加入所有行时,大部分时间更快地进行全表扫描,即MySQL/MariaDB:即使使用完全连接,添加索引也可以节省数小时,SQL Server本身确定它很不错(通常使用索引),DB2:请确定后请在这里发布。

+0

通常情况下,对于我而言,加入临时表是每个程序都是重复的...因此很高兴知道该索引是相对的。谢谢。 – SMW