--============================================

领导指点我去给某台数据库调优下,结果屁颠屁颠地干完,还自我感觉良好,刚刚别人博客时,才发现自己踩坑了!!

--============================================

有一很简单查询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--过滤索引和参数化的更多相关文章

  1. SQL Server-聚焦过滤索引提高查询性能(十)

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  2. 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息

    原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...

  3. SQL Server-聚焦过滤索引提高查询性能

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  4. mysql force index() 强制索引的使用

    mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? ...

  5. MySQL force Index 强制索引概述

    以下的文章主要介绍的是MySQL force Index  强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...

  6. 基础:从概念理解Lucene的Index(索引)文档模型

    转:http://blog.csdn.net/duck_genuine/article/details/6053430   目录(?)[+]   Lucene主要有两种文档模型:Document和Fi ...

  7. 不允许对索引显式地使用 DROP INDEX,该索引正用于 UNIQUE KEY

    [转载]http://blog.csdn.net/w87875251l/article/details/7929657 不允许对索引显式地使用 DROP INDEX,该索引正用于 UNIQUE KEY ...

  8. Lucene——Field.Store(存储域选项)及Field.Index(索引选项)

    Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...

  9. ORACLE Index Lookup索引访问路径总结

    在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...

随机推荐

  1. web 前端遇到的问题

    前端小白一枚,经常遇到一些小问题,但是解决完吧,又记不住,哎,好记性不如烂笔头咯 1. 如何在js代码中设置checkbox选中? $("#select").attr('check ...

  2. sshd_config优化

     sshd_config优化linux系统调优,参考百度搜索  linux ssh命令  /etc/init.d/sshd restart    重启ssh  193  ls  194  vim /e ...

  3. Factorial Trailing Zeroes (Divide-and-Conquer)

    QUESTION Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should ...

  4. Maven项目的拆分与聚合

    ---------------------siwuxie095                                     Maven 项目的拆分与聚合         1.对已有的 Ma ...

  5. swift 移除所有子控件

    /// 移除所有子控件 func removeAllSubViews(){ if self.view.subviews.count>0{ self.view.subviews.forEach({ ...

  6. fragment Activity之间传值的方法 之------------接口回调

    首先  定义一个  回调接口 public interface FragmentCallBack { public void callbackFun1(Bundle arg); public void ...

  7. vmware14中安装centos7并使用docker发布spring-boot项目

    1.vmare中centos7安装(同一路由器无线网络下) 1.1选择桥接模式 1.2修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33(这里不一 ...

  8. geoserver的rest服务介绍,搭建java程序

    在geoserver中使用 Restlet 来提供所有的rest服务,并且geoserver中所有的在/rest目录下的请求都被看作为一个restful server,下图就是rest服务的调用过程 ...

  9. Laravel 5 如何对部份 URI 禁用 CSRF 验证

    打开中间件 VerifyCsrfToken.php 在其 $except 属性中添加要禁用的 uri,如: api/user/add api/user/* api/*

  10. bat批量重命名文件

    @echo off setlocal enabledelayedexpansion set prefix="mai" set /a num=000 rem 排序/o:? -代表逆序 ...