我有一个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 <> '' )
?在此先感谢您的回复
答案 0 :(得分:1)
您可以在表another_table上使用复合索引
columns ( eventcode, externalsystemreferenceid )
,并且还应该将JOIN another_table中涉及的another_table列添加到复合索引中 在某种条件下
答案 1 :(得分:1)
所需的索引是:
thirdtable(responsetype, . . . )
-. . .
用于其他引用的列anothertable(externalsystemreferenceid, eventcode . . )
第二个索引可能没有帮助,除非anothertable
中几乎所有值都是空白。
您应该检查thirdtable
上的索引更新是否昂贵。如果这是一个问题,则可能需要数据库的两个副本-一个用于事务处理,另一个用于查询,例如您要实现的一个副本。