我看到了如何提高以下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
答案 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