0

我正在研究如何提高以下 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

4

3 回答 3

0

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

临时不需要索引,但该部分中的所有连接都需要使用索引。

为什么不分别尝试 UNION 的每个部分,看看其中一个是否慢?

您可以使用 SET SHOWPLAN ON 吗?我认为您可能也需要能够做到这一点 - 您需要能够检查 Sybase 是否使用索引来正确连接。

TRN BENTITY 和 SENTITY - 已编入索引?如果不是,您的 IN 会有点慢,尽管它可能没问题,对 Sybase 将在内部索引的工作表进行单表扫描。也可以使用 EXISTS - 这可能/应该更好地工作。

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

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

我想这将是第二或第三部分

于 2012-09-05T08:19:16.603 回答
0

如果你仍然有这个问题:1)在 sql batch set showplan on set noexec on 上试试这个

查看 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

于 2017-02-15T17:41:05.353 回答
0

如何为这些表使用缓存。如果查询经常被使用。最好获得一个命名缓存并将表绑定到它。还将 tempdb 绑定到缓存。这将大大提高流程执行时间。如果临时表很大,那么您可以在其上创建一个索引,这可能有助于提高性能,但我需要更多详细信息。

于 2017-01-28T04:52:19.607 回答