【发布时间】:2017-08-22 01:53:23
【问题描述】:
我有一个报告查询:
select
hp.KOD, hp.AD, hp.HES_ID,
sum(fs.BORC_TUTARI) B_T,
sum(fs.ALACAK_TUTARI) A_T,
max(hp.UST_HESAP_ID) UST_HESAP_ID,
max(hp. ALT_HESAP_SAYISI) ALT_HESAP_SAYISI
from
W_HES_PLAN hp, FIS_SATIRLARI fs, FIS_BASLIGI FB,
(select h.HESAP_KODU HESKOD, FS.HESAP_ID, FS.FIS_ID
from HESAP_PLANI H, FIS_SATIRLARI fs
where H.HESAP_ID = FS.HESAP_ID
group by h.HESAP_KODU,FS.HESAP_ID, FS.FIS_ID) CC
where
CC.HESKOD like HP.KOD+'%'
and FB.FIS_ID = FS.FIS_ID
and CC.HESAP_ID = fs.HESAP_ID
and CC.FIS_ID = FS.FIS_ID
-- and hp.KOD>='' and hp.KOD<='200'
group by
hp.KOD, hp.AD, hp.HES_ID
order by
HP.KOD
CC 表的子查询在 7 秒内返回 676.427 行,但所有查询在 23 分钟内返回 14.000 行。我无法理解。为什么更多行返回更短?有什么优化建议吗?
【问题讨论】:
-
如果您需要性能方面的帮助,请提供子查询本身和整体查询的查询执行计划。此外,我建议删除隐式连接,这样很难判断您的表是如何连接的。
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 年前),不鼓励使用它 -
从概念上讲,我不认为很难理解为什么整个查询需要更长的时间,即使它返回的行数更少。它依赖于内部查询,因此您希望它至少花费与内部查询一样长的时间。再加上你增加了外部东西的费用(包括
like)。就开销而言,“加法”可能更像是乘法。当您在结果中使用聚合时,行数也无关紧要。如果不聚合有多少行?这是一个反问,你不必回答。 -
FIS_BASLIGI表的作用是什么?您可能将它用作过滤器,但如果不是,因为您没有从中返回任何内容并且没有出现在 where 子句中,您可能可以将其删除。
标签: sql sql-server sql-server-2008 optimization