提高在外表的列上过滤的查询的性能

时间:2017-10-27 11:50:07

标签: sql sql-server

我即将提高将大表连接到其他表的查询的性能:

  • 在导致其他表的外键上存在索引。
  • 查询使用"其他表格"过滤数据。列。
  • 一个提示 - 实体框架正在加入表格。
  • 主表有大约2000万条记录

例如:

  • 存在一个大表ItemsTable。
  • ItemsTable加入其他表" TypesTable"使用列typeId。
  • ItemsTable的typeId列上存在非聚集索引。

SELECT * 
FROM
    ItemsTable l
    JOIN TypesTable t ON l.typeId = t.id
WHERE 
    statusId <> 1 
    AND t.SomeFlag = 1

尽管外键上存在索引(示例中为typeId),但查询执行得很糟糕,

执行计划:https://www.pastiebin.com/59f33fed82bc0

我注意到创建了展平模式的视图(连接到类型表和&#34; someFlag&#34;连续返回)性能问题消失了。

我即将创建一个执行连接的视图。还有其他方法可以改善此类查询的性能吗?

我注意到可以通过向查询添加order by子句来解决问题。在上面的查询中,通过typeId&#34;添加&#34;顺序;使sql server使用在类型列上创建的索引。

1 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT TOP 10 *
FROM ItemsTable l JOIN
     TypesTable t
     ON l.typeId = t.id
WHERE statusId <> 1 AND t.SomeFlag = 1;

最佳索引可能是TypesTable(someFlag, id)ItemsTable(typeid, statusId)

如果大多数项目的状态为1,则您的查询效果会很差。