不带索引的SQL LEFT OUTER JOIN的优化

时间:2019-03-05 13:00:24

标签: sql sql-server tsql

我有一个SQL请求可以在我的SQL Server上生成一个需要优化的视图:

SELECT some_stuff 
FROM some_table 
INNER JOIN another_table
       ON some_condition
LEFT OUTER JOIN third_table
       ON third_table.responsetype = another_table.eventcode
WHERE  ( another_table.externalsystemreferenceid <> '' )

根据SQL Server的执行计划,LEFT OUTER JOIN花费了很多时间(83%)。

我的第一个想法是在another_table.eventcode上放置索引(third_table.responsetype上已经有一个索引),但是此表经常更新,因此经常更新索引的成本可能不值得它。

所以我有两个问题:

  • 有没有一种方法可以优化没有索引的LEFT OUTER JOIN以及如何实现?
  • 一个更理论上的索引可以更好地理解索引)假设我想使用索引时不考虑影响,我应该将索引放在哪一部分上,为什么?
    • ON third_table.responsetype = another_table.eventcode(在哪个?两个上?)上?
    • 还是WHERE ( another_table.externalsystemreferenceid <> '' )

在此先感谢您的回复

2 个答案:

答案 0 :(得分:1)

您可以在表another_table上使用复合索引

columns  (  eventcode, externalsystemreferenceid ) 

,并且还应该将JOIN another_table中涉及的another_table列添加到复合索引中        在某种条件下

答案 1 :(得分:1)

所需的索引是:

  • thirdtable(responsetype, . . . )-. . .用于其他引用的列
  • anothertable(externalsystemreferenceid, eventcode . . )

第二个索引可能没有帮助,除非anothertable中几乎所有值都是空白。

您应该检查thirdtable上的索引更新是否昂贵。如果这是一个问题,则可能需要数据库的两个副本-一个用于事务处理,另一个用于查询,例如您要实现的一个副本。