位置: 编程技术 - 正文

在SQL SERVER中导致索引查找变成索引扫描的问题分析(sql server数据导入导出的特点)

编辑:rootadmin

推荐整理分享在SQL SERVER中导致索引查找变成索引扫描的问题分析(sql server数据导入导出的特点),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql server导入导出,sqlserver导入和导出数据,sql server数据导入导出的特点,sql server数据导入导出的特点,sql server 导入,sql server数据导入导出的特点,sql server导入导出,sql server导入和导出详细教程,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试、总结、归纳。

1:隐式转换会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan)

Implicit Conversion will cause index scan instead of index seek. While implicit conversions occur in SQL Server to allow data evaluations against different data types, they can introduce performance problems for specific data type conversions that result in an index scan occurring during the execution. Good design practices and code reviews can easily prevent implicit conversion issues from ever occurring in your design or workload.

如下示例,AdventureWorks数据库的HumanResources.Employee表,由于NationalIDNumber字段类型为NVARCHAR,下面SQL发生了隐式转换,导致其走索引扫描(Index Scan)

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d0b1f2ea.png" alt="查看图片" />

我们可以通过两种方式避免SQL做隐式转换:

1:确保比较的两者具有相同的数据类型。

2:使用强制转换(explicit conversion)方式。

我们通过确保比较的两者数据类型相同后,就可以让SQL走索引查找(Index Seek),如下所示

注意:并不是所有的隐式转换都会导致索引查找(Index Seek)变成索引扫描(Index Scan),Implicit Conversions that cause Index Scans 博客里面介绍了那些数据类型之间的隐式转换才会导致索引扫描(Index Scan)。如下图所示,在此不做过多介绍。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d2ae.png" alt="查看图片" />

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d2b4bdb5.png" alt="查看图片" />

避免隐式转换的一些措施与方法

1:良好的设计和代码规范(前期)

2:对发布脚本进行Rreview(中期)

3:通过脚本查询隐式转换的SQL(后期)

下面是在数据库从执行计划中搜索隐式转换的SQL语句

2:非SARG谓词会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan)

SARG(Searchable Arguments)又叫查询参数, 它的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值的范围内的匹配或者两个以上条件的AND连接。不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>;、!<;、!>;NOT EXISTS、NOT IN、NOT LIKE等,另外还有像在谓词使用函数、谓词进行运算等。

2.1:索引字段使用函数会导致索引扫描(Index Scan)

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d2bdcd8f.png" alt="查看图片" />

2.2索引字段进行运算会导致索引扫描(Index Scan)

在SQL SERVER中导致索引查找变成索引扫描的问题分析(sql server数据导入导出的特点)

对索引字段字段进行运算会导致执行计划从索引查找(Index Seek)变成索引扫描(Index Scan):

一般要尽量避免这种情况出现,如果可以的话,尽量对SQL进行逻辑转换(如下所示)。虽然这个例子看起来很简单,但是在实际中,还是见过许多这样的案例,就像很多人知道抽烟有害健康,但是就是戒不掉!很多人可能了解这个,但是在实际操作中还是一直会犯这个错误。道理就是如此!

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d4aaa.png" alt="查看图片" />

2.3 LIKE模糊查询回导致索引扫描(Index Scan)

Like语句是否属于SARG取决于所使用的通配符的类型, LIKE 'Condition%' 就属于SARG、LIKE '%Condition'就属于非SARG谓词操作

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1d4bb.png" alt="查看图片" />

3:SQL查询返回数据页(Pages)达到了临界点(Tipping Point)会导致索引扫描(Index Scan)或表扫描(Table Scan)

关于临界点(Tipping Point),我们下面先不纠结概念了,先从一个鲜活的例子开始吧:

如上所示,当我们查询OBJECT_ID=1的数据时,优化器使用索引查找(Index Seek)

上面OBJECT_ID=1的数据只有一条,如果OBJECT_ID=1的数据达到全表总数据量的%会怎么样? 我们可以手工更新条数据。此时SQL的执行计划变成全表扫描(Table Scan)了。

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1dbc.png" alt="查看图片" />

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1df.png" alt="查看图片" />

临界点决定了SQL Server是使用书签查找还是全表/索引扫描。这也意味着临界点只与非覆盖、非聚集索引有关(重点)。

Why is the tipping point interesting&#;It shows that narrow (non-covering) nonclustered indexes have fewer uses than often expected (just because a query has a column in the WHERE clause doesn't mean that SQL Server's going to use that index)It happens at a point that's typically MUCH earlier than expected… and, in fact, sometimes this is a VERY bad thing!Only nonclustered indexes that do not cover a query have a tipping point. Covering indexes don't have this same issue (which further proves why they're so important for performance tuning)You might find larger tables/queries performing table scans when in fact, it might be better to use a nonclustered index. How do you know, how do you test, how do you hint and/or force… and, is that a good thing&#;

4:统计信息缺失或不正确会导致索引扫描(Index Scan)

统计信息缺失或不正确,很容易导致索引查找(Index Seek)变成索引扫描(Index Scan)。 这个倒是很容易理解,但是构造这样的案例比较难,一时没有想到,在此略过。

5:谓词不是联合索引的第一列会导致索引扫描(Index Scan)

SELECT * INTO Sales.SalesOrderDetail_Tmp FROM Sales.SalesOrderDetail;CREATE INDEX PK_SalesOrderDetail_Tmp ON Sales.SalesOrderDetail_Tmp(SalesOrderID, SalesOrderDetailID);UPDATE STATISTICS Sales.SalesOrderDetail_Tmp WITH FULLSCAN;

下面这个SQL语句得到的结果是一致的,但是第二个SQL语句由于谓词不是联合索引第一列,导致索引扫描

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1dad.png" alt="查看图片" />

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_a1de7.png" alt="查看图片" />

SQL中Merge用法详解 MERGE语句是SQL语句的一种。在SQLServer、Oracle数据库中可用,MySQL、PostgreSQL中不可用。MERGE是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,

SQL SERVER数据库表记录只保留N天图文教程 本文通过图文并茂的方式给大家展示SQLSERVER数据库表记录只保留N天图文教程,具体方法步骤请看下文:第一步:首先设置SQLServer代理服务为自动启动:

详解sqlserver查询表索引 SELECT索引名称=a.name,表名=c.name,索引字段名=d.name,索引字段位置=d.colidFROMsysindexesaJOINsysindexkeysbONa.id=b.idANDa.indid=b.indidJOINsysobjectscONb.id=c.idJOINsyscolumnsdONb.id=d.

标签: sql server数据导入导出的特点

本文链接地址:https://www.jiuchutong.com/biancheng/347402.html 转载请保留说明!

上一篇:SQL Server数据复制到的Access两步走(sql server复制表数据)

下一篇:SQL中Merge用法详解(sql merge函数)

  • 纳税申报的具体要求
  • 固定资产累计折旧会计科目
  • 兼职劳务报酬需要发票吗
  • 企业所得税的营业成本
  • 领备用金填什么单子
  • 劳务公司如何避税与避费
  • 房地产开发企业土地增值税清算
  • 收到应收账款逾期短信
  • 期末账项调整的类型
  • 处置使用过的固定资产,税率按多少
  • 跨年多计提社保个人部分怎么调整
  • 建筑工程项目的全生命周期包括
  • 职工福利部门的工资
  • 投资收益率如何确定
  • 收入纳税明细怎么打印
  • 现金盘亏账务处理分录
  • 小规模纳税人未达到起征点的增值税怎么做账
  • 借现金还银行怎么做账
  • 受托加工物资产生的成本怎么做会计核算?
  • 预缴企业所得税额怎么算
  • 计提本月城市维护建设税,教育费附加500元
  • 补记以前年度收入怎么做账
  • 错账查找的方法
  • RPDFLchr.exe - RPDFLchr是什么进程 有什么用
  • win10系统如何更改工作组
  • 代扣代缴个税手续费返还政策
  • 录制权限怎么打开
  • php如何实现伪静态
  • 软件开发企业的税收优惠政策
  • PHP:imageantialias()的用法_GD库图像处理函数
  • 比利时的平菇能吃吗
  • 期末未缴税额是负数,本月申报为什么没有抵扣
  • php搜索代码
  • 投标代理费是什么意思
  • 纳税人在工作
  • python 子进程通信
  • 将织梦dedecms转换到wordpress
  • 收到餐饮费专用发票会计分录
  • mongodb使用场景总结
  • 现金流量表直接法的优缺点
  • 小型微利企业所得税优惠政策
  • 预付卡业务开票怎么开
  • 主营业务收入和营业外收入均属于收入
  • 开票机号可以随便填吗
  • 电脑计入固定资产了怎么抵企业所得税
  • 超市的库存商品是怎么记账的
  • 合同权利义务包含债务吗
  • 补交以前年度环保税
  • 印花税票 购买
  • 收到联营单位投入的款项98600元存入银行
  • 技术支持费用属于什么费用
  • 小企业会计准则2023电子版
  • 如何算增值税金额
  • 不动产什么时候取得所有权
  • 广告费和广告发布费什么区别
  • 收付实现制与权责发生制的例题
  • 什么情况下需要打狂犬疫苗
  • 利润表增加,资产负债表减少怎么回事
  • 营业税金及附加和税金及附加有什么区别
  • linux/fs.h
  • iis w3svc
  • ubuntu software database is broken错误该怎么解决?
  • 轻轻松松在树枝上摘果子用什么成语
  • win7安装sqlserver2005失败
  • 怎么把ubuntu装在u盘上
  • 关闭windbg
  • mstore.exe - mstore是什么进程 有什么用
  • win7插u盘电脑没反应怎么回事
  • opengl做简单的模型
  • node分页接口
  • androidstudio git
  • nodejs require原理
  • 浏览器判断手机品牌
  • 简述javascript中的函数
  • jquery+ajax+text文本框实现智能提示完整实例
  • 关于增值税纳税人的规定,下列说法正确的是
  • 电子税务局辽宁省
  • 地税局基层税务工作总结
  • 美国企业所得税税率2022
  • 预缴增值税是否要预缴城建税及附加
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设