当前位置: 首页 > news >正文

《Microsoft Sql server 2008 Internals》读书笔记--第八章The Query Optimizer(7)

《Microsoft Sql server 2008 Internals》索引目录:

《Microsoft Sql server 2008 Internals》读书笔记--目录索引

前几篇主要介绍了查询结构优化中的几个关键概念:统计(Statistics)、基准估计(Cardinality estimation)和成本(costing) ,今天开始真正进入主题:
今天我们关注的是:索引选择

■Index Selection

索引选择是查询优化最重要的一点,索引匹配的基本思路是从Where子句、连接条件、或查询中的其他限定操作符中提取谓词,并转换这个操作为能被针对索引的操作。

两个基本的操作能被针对索引执行:

1、Seek(对一个单个值或索引键的一个值的范围range)

2、Scan the Index(向前或向后)

对Seek,初始的操作在B+树的根节点开始,沿b树向下到一个在索引键上的理想的索引位置。一旦完成,查询处理器会遍历所有的行以匹配谓词,或者直到范围中的最后一个值被找到。因为B+树的页在SQL Server中是链接的,使用这个结构查找所有的行成为可能,只要中间的B+树节点被遍历过。

查询优化器的一个工作是辨别出哪一个谓词能被应用到索引以尽可能快地返回行。某些谓词能被应用到某个索引,某些则不能。 如查询:
select col1,pkcol from myTable where col1=2 ,有一个形式为<column>=<constant>的谓词。如果该列有一个索引,则这个模式被匹配为一个Seek操作。生成的备选结果是针对一个非聚集索引执行一个seek,返回匹配的行。看一个基本索引的例子:

Create table IdxTest2010(col2 int,col3 int,col4 int);
Create index idex2010 on IdxTest2010(col2,col3);
select col2,col3 from IdxTest2010 where col2=5

注意:查询优化器也可以针对多列索引应用复合谓词,只要这个操作能被转换为开始和结束索引键。

因此,对于如下语句,可以得到相同的seek Plan:


能被转化为一个索引操作的谓词也被称作“可参数化的搜索”(sargable或search-Argument-able)谓词,这意味着这种谓词的形式可以被转化为一个索引操作。不能转化的则称为non-sargable谓词,它通常在索引seek后被应用,这样查询得以返回符合所有谓词的记录行。有时候让人感到迷惑的就是SQL Server通常在查询树的seek/scan操作中评估non-sargable谓词。这是一个优化进程,如果不这样做,SQL Server步骤如下:

1、Seek 操作:Seek至索引B+树中的一个键

2、锁页面(latch the page)

3、读取行

4、释放页面锁

5、返回行到筛选索引

6、 筛选:评估针对这些行的non-sargable谓词,如果通过鉴定,传递这些行到父操作。否则,转到第二步继续下一个候选行。

这个流程比最佳要慢一些,因为返回这些行到一个不同的操作符需要加载一个不同的列集和数据到CPU。通过保持逻辑在一个地方,整个评估查询的CPU成本下降了。在SQL Server中实际的操作类似如下:

1、Seek 操作:Seek至索引B+树中的一个键

2、锁页面(latch the page)

3、读取行

4、应用non-sargable谓词筛选,如果行没有通过筛选,转到第三步。否则,转到第五步。

5、释放页面锁

6、 返回行

这就是所谓的pushing non-sargable谓词(谓词被从一个筛选推进seek/scan)。这是一个物理优化,但它能展示处理多行的查询内部流程。

并不是所有的谓词都能被在seek/scan操作中评估。因为锁操作阻止其他用户甚至查看系统中的一个页,这个优化被保留给那些成本低廉的谓词。也就是所谓的non-pushing ,non-sargable谓词,例子包括:

■Predicates on Large Objects(包括varbonary(max),varchar(max),nvarchar(max))

■CLR函数

■一些T-SQL函数

谓词可搜索参数化能力,在数据库应用程序设计中是一个非常重要的因素。系统性能很差的一个原因是针对数据库的应用程序被写作这样一种方式:即谓词non-sargable。在很多情况下,这是可以避免的,如果主题能被标识得足够早,(按照一个可度量的顺序)修正这个issue有时会增加数据应用程序性能。

SQL Server在尽量(在一个查询中)应用针对可搜索参数化的谓词的索引时考虑多种方案。比如对于AND条件(Where col1=5 AND col2=a AND...),SQL Server会试着这样:

1、对于一个给定的列表(该列表中包含需要相等列、不等列、需要适合查询但不带谓词的列),首先试图找到一个精确匹配请求的索引。如果有这样一个索引,则使用它。

2、尽量找到一个索引集以适合等式条件,并为所有这样的索引执行一个内连接。

3、如果步骤2不能覆盖所有请求的列,考虑(在解决方案内)连接其他基于列集的索引。

4、最后,执行一个连接到基表得到任何剩余的列。

在所有这些案例中,每个解决方案的成本被考虑,如果它最确认为最低成本的解决方案,则返回访方案。因此,一个将其他索引连接在一起的解决方案,被使用仅仅因为它被确定比其他基表中的所有行的scan要节约成本。其次,算法仅仅在本地查询树上执行。即使查询优化器在此过程中生成了一个特定的替代方案,它也不一定就是最后查询计划的一部分。成本被用于判定成本最低的完整计划。因此,索引选择是一个启发式,是更广泛的(用于帮助选择高效查询计划的)成本基础设施的一部分。

■Filter Index

SQL Server 2008推出一种新的功能,即在创建索引时可以带简单的谓词,以限制包含在索引中的行集。乍看之下,这个内容已经包含在索引视图中功能的一个子集。实际上,这个功能存在的意义在于:1、索引视图使用和维护时成本高昂。2、匹配索引视图内容的兼容性不是在所有SQL Server 版本中都被支持。 3、大量的不同SQL Server用户使用的场景比视图等内容要复杂得多,他们可能还是倾向于使用传统的关联查询场景。

筛选索引在Create Index语句中使用where子句。

Create table TestFilter1(col1 int ,col2 int ); go set nocount on BEGIN TransAction; Declare @i int set @i=0 while @i<40000 BEGIN Insert into TestFilter1(col1,col2) values(rand()*1000,rand()*1000); set @i=@i+1 END Commit Transaction go Create Index idx2011 on TestFilter1(col2) where col2>800
此时,如果执行以下查询,则得到筛选索引的支持:
select col2 from TestFilter1 where col2>800


如果执行以下查询,则得不到筛选索引的支持:

select col2 from TestFilter1 where col2>799

筛选索引未完待续。

下文将继续了解筛选索引(Filtered Indexes)

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn

http://www.cnnetsun.cn/news/4231121.html

相关文章:

  • 不同蓝牙产品怎么判定要不要做 BQB 认证?
  • 相关系数全解析:皮尔逊、斯皮尔曼、肯德尔的选择与实战避坑指南
  • 小模型崛起与API定价重构:模型选型与本地部署实战指南
  • Darknet版YOLOv3火焰烟雾检测实战:500数据集训练与部署指南
  • selenium+python实现自动登录脚本
  • 免费在线 3D 查看器 Online 3D Viewer:浏览器打开 STEP、STL 等 18 种格式的完整指南
  • 跑一次省百回:KeymouseGo 鼠标键盘录制自动化从零到调参完整教程
  • 【单片机毕业设计】带 LCD1602 显示的智能恒温饮水监测硬件系统设计 基于 ESP8266 WiFi 通信的智能饮水数据采集与监控系统(025304)
  • 【单片机毕业设计】基于 STM32 或 51 单片机的光感雨滴湿度一体化窗控系统开发 基于 STM32 或 51 单片机的步进电机驱动智能门窗控制系统设计(025604)
  • TPFanCtrl2 实战指南:3 套风扇曲线搞定 ThinkPad 双风扇控速
  • 英雄联盟客户端工具包完整指南:自动接受对局到自动选人,一个工具全干了
  • LeetDown 3步降级iPhone 5与iPad 4
  • 微信小程序设计规范实战指南:从视觉交互到性能优化的全链路解析
  • 家用冰箱不制冷?从制冷循环到PTC启动器的自助维修指南
  • Spring Boot集成Quartz任务调度:从核心原理到集群实战
  • ST-GCN骨骼动作识别实战:图卷积时空建模与工程实现
  • Redis哨兵故障转移全解析:从选举算法到生产实践
  • 华中杯A题解析:交通信号优化中的非稳态建模与鲁棒数据处理
  • C2000 DSP开发入门:从零搭建TMS320F28388D工程与LED点灯实战
  • Loop Engineering:从循环语法到系统化工程实践的演进
  • 计算机专业四年学习规划:从基础理论到工程实践的全景路线图
  • FreeRTOS任务通信机制详解:队列、信号量、互斥量、事件组实战
  • 嵌入式Linux性能瓶颈排查与优化:CPU、内存、I/O与启动时间全攻略
  • OpenClaw集成飞书自动化:破解权限继承难题的架构与实践
  • 机器人重写“胜利时退出”:任务成功判定与状态机设计
  • 爬虫工程师的生存法则:从技术验证到合规运营的实战指南
  • 从零构建个人高效工作流:核心思路、工具链与自动化实践
  • Maya零基础入门:从搭建卡通治愈小屋学会完整建模流程
  • macOS启动台图标网格自定义:终端命令调整行列布局
  • AI Agent协调工程与过程可观测:从概念到实战的工程化指南