Index--过滤索引和参数化
--============================================
领导指点我去给某台数据库调优下,结果屁颠屁颠地干完,还自我感觉良好,刚刚别人博客时,才发现自己踩坑了!!
--============================================
有一很简单查询SQL,类似:
SELECT * FROM TB1
WHERE C1='C1'
AND C2='C2'
AND C3='C3'
AND C4='C4'
发现该SQL执行很慢,一看是全表扫描,便考虑WHERE条件中每列的可选择行,表中有700W数据
查看C1的可选择性
SELECT COUNT(DISTINCT C1) FROM TB1 WITH(NOLOCK)
发现C1列去重后有140W,选择性比较高,优先作为索引的第一个键值列。
SELECT TOP(100) C1,COUNT(1) AS Rcount
FROM TB1
GROUP BY C1
ORDER BY Rcount
结果发现C1列中值为"无效"的行有几十万条,其余值最多也才300多条。这就让我纠结了,数据分布不均匀,很容易导致参数嗅探的问题,赶快讯询问开发,确认是否会使用“无效”来查询,得到明确答复不会使用(无用的数据没有删除而修改值为无效,好霸气的做法),于是乎,过滤索引瞬间冒出来
CREATE INDEX IDX_TB1_C1
ON TB1(C1)
WHERE C1<>'无效'
WITH(MAXDOP=6)
多么完美的解决方案啊,自我感觉良好中。。。
-------------------------------------------------------------------------------
过了两小时,加查索引使用情况
SELECT * FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID()
AND object_id=OBJECT_ID('TB1')
发现索引完全没有被使用,不可能啊,再次检查SQL脚本
(@P0 NVARCHAR,@P1 int,@P2 int,@P3 int)
SELECT * FROM TB1
WHERE C1=@P0
AND C2=@P1
AND C3=@P2
AND C4=@P3
以我多年的经验,我武断地判断隐式转换导致,因为这问题出现不是一次两次啦,C1列时VARCHAR类型的,于是乎,通知开发改程序,收工!!
--==================================================================================
真的收工了吗?当然没有,要不然我还啰嗦啥呢
在Amaranthus的大作中有这样一句话:
在没有recompile提示之下,过滤索引和过滤统计信息不会被应用到参数化的字段过滤。(In the absence of a RECOMPILE hint, filtered indexes and statistics will not be used in conjunction with parameterization that refers to the filter column.)
对于参数化的过滤条件,查询优化器无法确认未来传入的具体值满足过滤索引中的过滤条件,因此不会考虑使用过滤索引
解决办法:
1. 将索引过滤条件移除(由于查询不会使用“无效”,因此不会出现参数嗅探问题)
2. 在查询条件中显示加入过滤条件(SQL 中加入 AND C1<>'无效',有点画色添足的感觉)
吭只有踩过才知道啊!!!
--====================================================================================
妹子

Index--过滤索引和参数化的更多相关文章
- SQL Server-聚焦过滤索引提高查询性能(十)
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息
原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...
- SQL Server-聚焦过滤索引提高查询性能
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- mysql force index() 强制索引的使用
mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? ...
- MySQL force Index 强制索引概述
以下的文章主要介绍的是MySQL force Index 强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...
- 基础:从概念理解Lucene的Index(索引)文档模型
转:http://blog.csdn.net/duck_genuine/article/details/6053430 目录(?)[+] Lucene主要有两种文档模型:Document和Fi ...
- 不允许对索引显式地使用 DROP INDEX,该索引正用于 UNIQUE KEY
[转载]http://blog.csdn.net/w87875251l/article/details/7929657 不允许对索引显式地使用 DROP INDEX,该索引正用于 UNIQUE KEY ...
- Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...
- ORACLE Index Lookup索引访问路径总结
在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...
随机推荐
- 结对项目3-bug的三种状态
这周和小伙伴结对构造程序,来深刻理解软件测试中,bug发现的三种状态. 1:不能触发Fault 2:触发Fault,但是不能触发Error 3:触发Error,但是不能产生Failure 我们完成的代 ...
- 网站连接数据库连接不上原因是ip地址与端口号格式不对
192.168.1.1:8080这样连接一直出错, 后来改为192.168.1.1,8080就可以了 原因是格式不对,把冒号给为逗号就可以了
- 使用git提交代码到GitHub
0.下载Git Bash,在Windows系统可以用Git Bash通过简单的命令将代码提交到GitHub1.打开项目所在的文件夹,右键,"Git Bash Here"2.初次使用 ...
- Asp.net实现同页面内多图片自动上传并带预览显示
FileUpload控件实现单按钮图片自动上传并带预览显示 1.实现原理: 此方法适合针对有后台生成的图片相关内容,例如购物网站商品展示页面中的封面图片,图片的数量由后台访问数据库,并加载到页面.这种 ...
- Asia Stock Exchanges[z]
Asia Stock Exchanges July 7, 2009 This article is to summarise the trading rules of some Asia stocke ...
- 配置 Mysql 支持远程访问 并取消域名解析以提高链接速度
1 配置远程访问 1.1 修改 my.cnf [mysqld] 段 bind-address = 0.0.0.0 //支持所有 ipv4 1.2 建立远程访问用户 mysql> grant al ...
- linux信号量初识
以下程序使用信号量控制程序运行 "信号"量 "变"量 /*信号量(semaphore)是变量,是一种特殊的变量.它仅取正值. 对信息号量的操作只有2种:等待(w ...
- Jfinal框架是什么框架?适用于什么项目呢?
Jfinal框架是什么框架?适用于什么项目呢? jfinal 基于spring MVC研发的框架,操作简单.节省代码,适用于所有web项目.适合中小型项目开发.10分钟写出一个页面的增删改查.目前所在 ...
- 2018.10.12 NOIP模拟 字符处理(模拟)
传送门 sb模拟,考试跟着sb了90分. 代码
- 解决以showModalDialog打开的页面在提交表单时弹出新窗口的问题
源代码如下: 父页面: window.showModalDialog("../readfile/readFile.jsp","","dialogWid ...