MSSQL为什么索引视图(物化视图)需要with(noexpand)强制查询提示
Tags: MSSQLSQL Server索引视图
第一次通过索引视图优化SQL语句,以及遇到的一些问题,记录一下。
语句分析
最近开发递交过来一个查询统计的SQL,说是性能有问题,原本执行需要4-5秒钟,这个业务本身对性能要求又比较critical,期望是在1s之内
在用尽各种办法之后(执行计划,统计信息,索引,改写SQL,临时表拆分),依然没有实质性的改观,
在观察SQL本身的特点之后,
有以下几个特点
1,查询语句整体为多表join,但是每个表自身的数据并不是非常大,百万级
2,查询结果在主表上一个较大的时间范围的数据进行Count的聚合操作
3,几张表之间除了连接条件,主要是进行了一些比较复杂的逻辑运算(下面截图可以看到,没多少IO,CPU时间却很高)
不过表的连接方式都是inner join,主要性能点就在于表关联之间的Hash join之间的逻辑运算,参考下图(是执行计划的一部分)
通过统计信息发现,该SQL语句的物理IO并不高,说明索引没有什么问题,通过索引改善IO可能改善空间很有限
时间主要花费在SQL语句的编译和的Hash join 运算
尝试改写借助SQL之后(纯改写SQL和借助临时表拆分语句),发现依然很难绕过Hash join,主要是表之间的逻辑运算最为耗时
最后想到可以先将运算好的的数据物理存储起来,然后改写查询的SQL语句完成等价的查询,
避免每次查询都做复杂的逻辑运算,应该可以有比较大的改善,于是就想到了索引视图
创建索引视图改写SQL