SqlServer 正确使用索引

http://www.cnblogs.com/lyhabc/archive/2013/02/07/2909027.html
http://www.cnblogs.com/lihuali/p/5899255.html
写SQL语句的时候很多时候会用到filter筛选掉一些记录,SQL对筛选条件简称:SARG(search argument/SARG)

1 where amount>4000 and amount<6000
上面这句就是筛选条件

当然这里不是说SqlServer的where子句,是说SqlServer对索引的利用

在SqlServer对于没有SARG运算符的表达式,索引是没有用的,SqlServer对它们很难使用比较优化的做法。

意思是说,如果你的SQL语句中没有where子句包括非SARG运算符,那么你的SQL语句是不会用到表格中的索引的

下面说一下哪些是非SARG运算符:

非SARG运算符包括

NOT、
<>、

NOT EXISTS、

NOT IN、

NOT LIKE

规律就是有“NOT” 关键字 或者 不等于的意思 基本上利用不了索引

还有一些内部函数,如果使用这些内部函数SQLSERVER也不会用到索引

内部函数,例如:CONVERT(),UPPER()等

时间: 2025-01-21 12:43:55

SqlServer 正确使用索引的相关文章

SQLServer 在线添加索引

SQLServer 在线添加索引 支持的版本 首先SQLServer只在Enterprise, Developer, Evaluation 版本支持在线添加索引 过程 假设对一个堆表做在线聚集索引的创建: 三个阶段:准备阶段.构建阶段.完成阶段: 准备阶段:此阶段非常短,会创建操作表的行版本,更新元数据创建一个索引,对表加S锁和IS锁: 构建阶段:此阶段是主要阶段,会对原表的数据做扫描.排序.合并 并通过bulk load插入目标索引,对表加IS锁:这个阶段用户的增.删.改.查操作会作用于原索引

刚开始学Jv跟着视频做了个登录界面验证结果com.microsoft.sqlserver.jdbc.SQLServerException: 索引 2 超出范围。

问题描述 com.microsoft.sqlserver.jdbc.SQLServerException:索引2超出范围.用户名:user密码:123456atcom.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)atcom.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(S

javascript使用for循环批量注册的事件不能正确获取索引值的解决方法_javascript技巧

本文实例讲述了javascript使用for循环批量注册的事件不能正确获取索引值的解决方法.分享给大家供大家参考.具体分析如下: 可能不少朋友会遇到一个问题,那就是当使用for循环批量注册事件处理函数,然后最后通过事件处理函数获取当前元素的索引值的时候会失败,先看一段代码实例: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name=&q

SQLSERVER如何查看索引缺失及DMV使用介绍_MsSql

当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事. 好在SQLSERVER提供了两种"自动"功能,给你建议,该怎么调整索引 第一种是使用DMV 第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问 这篇文章主要讲第一种 从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下, 这句话是不是缺少

SQLSERVER如何查看索引缺失及DMV使用介绍

当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事. 好在SQLSERVER提供了两种"自动"功能,给你建议,该怎么调整索引 第一种是使用DMV 第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问 这篇文章主要讲第一种 从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下, 这句话是不是缺少

SQLServer中使用索引视图(物化视图)

物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一样,可以创建 索引,主键约束等等,性能会有质的提升,但是其有缺点,会占用,可以设置它定时自动更新一次,也可以手动更新,当然也是可以设置及时更新的,但是会拉慢基表的增删改查操作,在这里我只讲思路,具体的话大家可以自己去研究. --创建物化视图,每天晚上22:00:00自动更新 create materialized view VM_PSNP

SQLSERVER聚集索引与非聚集索引的再次研究(下)

原文:SQLSERVER聚集索引与非聚集索引的再次研究(下) SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 上篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(上) 下篇主要说非聚集索引 先上非聚集索引的结构图  先创建Department8表 1 --非聚集索引 2 USE [pratice] 3 GO 4 5 CREATE TA

SQLSERVER中如何忽略索引提示

原文:SQLSERVER中如何忽略索引提示 SQLSERVER中如何忽略索引提示 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 SELECT id,name from TB with (index(IX_xttrace_bal)) where bal<100   当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时候这个索引提示可能会导致查询变慢 经过你的测试,发现确实是因为这个索引提示的关系导致查询变慢,但是SQL服务器已经

详解sqlserver查询表索引_MsSql

SELECT   索引名称=a.name  ,表名=c.name  ,索引字段名=d.name  ,索引字段位置=d.colid  FROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c ON b.id=c.id JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid WHERE a.indid NOT IN(0,255) --