SQL Server 查询性能优化——索引与SARG(四)

上接SQL Server
查询性能优化——索引与SARG(三)

 说明:下文中所说的创立索引都是SQL Server
查询性能优化——索引与SARG(一)未遭初步部分所验证的目列表中的目录。

     
例:下面表格中说的索引1(
聚集索引)和索引5(非聚集索引)**

 

4: 小心使用OR操作符

 

     如上文SQL Server
查询性能优化——索引与SARG(三)中的例证中WBK_PDE_LIST_ORG_HISTROY表创建了索引2,即在[QTY_1] 字段建立目录,通过该索引.就好自大气笔录中.快速搜索有可记录之笔录(如齐文中的“
请不要开展负向查询
”中表格中之序号2,逻辑读取43次于,执行成本0.121935),再当为数不多之数目过滤COP_G_NO=’60207106’的笔录,因此得以发挥索引的职能。但假如以的凡OR 操作,则需要拥有字段都发目录可用,查询语句改成为如下:

SELECT  *  FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1=312 or COP_G_NO=’60207106′

而当COP_G_NO字段没有适用索引时,直接扫描整个数据表。

 

 

序号

 

逻辑读

实行本

查询语句

 

SELECT [WBOOK_NO] ,[COP_G_NO],[G_NO],[CODE_T],[QTY_1],[UNIT_1]

,[TRADE_TOTAL],[GROSS_WT] FROM [WBK_PDE_LIST_ORG_HISTROY]

 where qty_1=312 or COP_G_NO=’60207106′

 

 

索引2

 

1

表’WBK_PDE_LIST_ORG_HISTROY’。扫描计数1,逻辑读取1306 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

 

1306

 

 

 

1.03687

索引2,3

2

表’WBK_PDE_LIST_ORG_HISTROY’。扫描计数2,逻辑读取101 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

 

101

 

 

 

0.245731

索引4,5

3

表’WBK_PDE_LIST_ORG_HISTROY’。扫描计数2,逻辑读取6 潮,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

 

6

 

 

 

0.0125617

 

 

 

 

 

 

小结:

序号

所创建的索引

逻辑读

查询记录数量

执行成本

1

索引2

 

1306

90

1.03687

2

索引2,3

101

92

0.245731

3

索引4,5

6

92

0.0125617

 

 

自打总中所列的报表中,可以观看由于索引4,索引5用了include关键字,在创立索引时拿查询语句被需被之字段添加到了无聚集索引的叶级,从而以拓展询问时只是需要拜访到目录的叶级就足以,不欲通过RID操作去拜访数页中的数据,所以加强了查询速度。

实属查询优化器可以在目录中找到有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。但这样做的弊端是索引需要额外的磁盘存储空间。是优是劣,按实际情形展开调。

 

 

例外情况:

采取OR操作符时,如果多单标准中产生一个原则从不合适的目录,则其它规格还生目录也是不曾就此处之,只有满数据表进行围观或开展聚集索引围观,以确定全部底数量是否来合乎的笔录。

虽多单尺码都起目录,所欲的查询结果数量过多,SQL SERVER查询优化程序用电动采用全表扫描或聚集索引围观,以确定全部之数码是否生适合的记录。

如下例:

缔造非聚集索引4,5,没有索引1。

执行以下代码

SELECT [WBOOK_NO] ,[COP_G_NO],[G_NO],[CODE_T],[QTY_1],[UNIT_1],[TRADE_TOTAL],[GROSS_WT]

  FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1=2 or COP_G_NO='60207106'

表’WBK_PDE_LIST_ORG_HISTROY’。扫描计数1,逻辑读取1306 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

 

 

 总结:

无须觉得使有负向查询出现于查询条件WHERE子句被不怕决然当索引就从不效果,在WHERE子句被以非SARG并不一定导致全表扫描或聚集索引围观。SQL SERVER可以以某些非SARG状况被使用索引,以及询问中虽涵盖了部分非SARG但准好对是询问中的SARG部分采用索引。

啊绝不以为在查询语句被之询问条件WHERE子句被运用SARG就必会以及对应的目录,而非见面进展全表扫描或聚集索引围观。SQL SERVER查询优化程序会冲SARG使用状态所收获的查询结果的笔录数据是否过多,而控制是以相应的目录,还是以全表扫描或聚集索引围观。当然,无论情况怎样,在开展性调校时,最先也是无比直白的更动就是管非SARG改成为SARG。因为将非SARG改化SARG最要命的景象就是是全表扫描或聚集索引围观,查询结果的笔录数据比少,会很快使用相应索引,快速查出结果。

相关文章