Sybase查询优化

时间:2012-09-05 05:28:38

标签: sybase

我看到了如何提高以下sybase查询的性能。目前大约需要1.5小时。

 CREATE TABLE #TempTable
 (
 T_ID numeric,
 M_ID numeric,
 M_USR_NAME char(10),
 M_USR_GROUP char(10),
 M_CMP_DATE datetime,
 M_CMP_TIME numeric,
 M_TYPE char(10),
 M_ACTION char(15),
 )


select
T.M_USR_NAME,
T.M_USR_GROUP,
T.M_CMP_DATE,
T.M_CMP_TIME,
T.M_TYPE,
T.M_ACTION
from #TempTable T, AUD_TN B
where T.M_ID=B.M_ID
and T.T_ID in 
(
   select M_NB from TRN H where (M_BENTITY ="KROP" or M_SENTITY = "KROP")     
)

UNION

select
A.M_USR_NAME,
A.M_USR_GROUP,
A.M_DATE_CMP,
A.M_TIME_CMP,
A.M_TYPE,
A.M_ACTION
from AUD_VAL A, TRN H
where A.M_DATE_CMP  >= '1 May 2012' and A.M_DATE_CMP <= '31 May 2012'
and A.M_ACT_NB0=H.M_NB
and (H.M_BENTITY ="KROP" or H.M_SENTITY = "KROP") 

UNION

select
TR.M_USR_NAME,
TR.M_USR_GROUP,
TR.M_DATE_CMP,
TR.M_TIME_CMP,
TR.M_TYPE,
TR.M_ACTION

from TRN_AUD TR, TRN H
where TR.M_DATE_CMP  >= '1 May 2012' and TR.M_DATE_CMP <= '31 May 2012'
and TR.M_ACT_NB0=H.M_NB
and (H.M_BENTITY ="KROP" or H.M_SENTITY = "KROP") 

DROP table #TempTable

非常感谢任何帮助。请注意以下

上面没有索引的唯一表格是AUD_TN

干杯 RC

3 个答案:

答案 0 :(得分:0)

大概是填充了临时表,并且有很多行?

不需要对temp建立索引,但该部分中的所有连接都需要使用索引。

为什么不分别尝试UNION的每个部分来查找其中一个部分是否缓慢?

你还可以使用SET SHOWPLAN ON吗?我认为您需要能够做到这一点 - 您需要能够检查Sybase是否正在使用索引加入。

TRN BENTITY和SENTITY - 已编入索引?如果不是你的IN会有点慢,虽然它可能没问题,但是将一个表扫描到Sybase将在内部编制索引的工作表中。也可以使用EXISTS - 这可能/应该更好。

第二部分 - 都有SARGS(如果你不知道的话,在Sybooks中查找 - 搜索参数。)我不知道它们找到了多少行,但假设它只是一小部分,你应该看到一个索引在SARG中用于首先扫描哪个表,然后您应该看到索引连接(或者可能是合并连接)到第二个 - 但是使用索引。

第3部分 - 与第2部分的类似讨论。

我认为这将是第二或第三部分

答案 1 :(得分:0)

如何为这些表使用缓存。如果查询是定期使用的。最好是获取一个命名缓存并将表绑定到它。还将tempdb绑定到缓存。这将大大改善流程执行时间。如果临时表很大,那么你可以在它上面创建一个索引,这可能有助于提高性能,但我需要更多细节。

答案 2 :(得分:0)

如果您仍然打开此问题: 1)在sql批处理的顶部试试这个     设置showplan     

上设置noexec

查看SQL优化器是否正在获取预期的索引。如果where子句中的列上没有索引,请创建一个。如果可能,创建聚簇索引。

2)在第一个查询中,您可以使用

替换where子句中的子查询

创建表#T_ID(  M_NB数据类型 )

插入#T_ID 从TRN H中选择M_NB,其中(M_BENTITY =“KROP”或M_SENTITY =“KROP”)

并将where子句修改为:

其中T.M_ID = B.M_ID 和T.T_ID =#T_ID.M_NB