如何降低查询成本

时间:2014-02-04 17:35:54

标签: sql sql-server tsql join

我可以降低查询费用吗?

查看此查询的执行计划 - >查询2:查询成本(相对于批次):93%,唯一突出的是“哈希加入匹配(内部联合)成本:45%”

select t1.PrimaryKeyId, t1.AdditionalColumnId
from TableOne t1
    join TableTwo t2 on t1.ForeignKeyId = t2.PrimaryKeyId
    join TableThree t3 on t1.PrimaryKeyId = t3.ForeignKeyId
    join TableFour t4 on t3.ForeignKeyId = t4.PrimaryKeyId
    join TableFive t5 on t4.ForeignKeyId = t5.PrimaryKeyId
    join TableSix t6 on t5.ForeignKeyId = t6.PrimaryKeyId 
    join TableSeven t7 on t6.ForeignKeyId = t7.PrimaryKeyId
    join TableEight t8 on t7.ForeignKeyId = t8.PrimaryKeyId
    join TableEight t9 on t8.ForeignKeyId = t9.PrimaryKeyId
where 
    t1.isdeleted =  0  and
    t2.isdeleted =  0  and
    t1.startdttm >= @Begin_Date and t1.startdttm < @End_Date  and
    t1.paymentbalance = 0 and
    t8.pos_source_id in (select sit_source_id from @TableTen) and
    t2.transTypeId = 1 and
    t2.transitemtypeid in (1,7)


--- Table Counts 
SELECT COUNT(*) FROM TableOne = 4014596
SELECT COUNT(*) FROM TableTwo = 5409514
SELECT COUNT(*) FROM TableThree = 552980
SELECT COUNT(*) FROM TableFour  = 552976
SELECT COUNT(*) FROM TableFive  = 4376
SELECT COUNT(*) FROM TableSix   = 4376
SELECT COUNT(*) FROM TableSeven = 9
SELECT COUNT(*) FROM TableEight = 175
SELECT COUNT(*) FROM TableNine = 36098
SELECT COUNT(*) FROM @TableTen = 68

1 个答案:

答案 0 :(得分:1)

我建议使用t1(isdeleted, paymentbalance, startddtm)上的索引来满足where子句。如果只需要t1的几行,这将最有效。

哈希匹配非常有效。您可以改为进行索引查找。所以,也尝试这些索引:

t2(PrimaryKeyId, isdeleted, transtypeid, transittypeid)
t8(PrimaryKeyId, pos_source_id)

这些将阻止访问表的数据。索引“覆盖”了查询。