位置: 编程技术 - 正文

在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函数)

  • 税盘服务费抵扣增值税
  • 暂估入账纳税调整填哪里
  • 提供维修业务的税率
  • 怎么从其他公司挖人
  • 空白增值税专用发票丢失罚款
  • 佣金收入者是什么意思
  • 航天金税服务费诈骗
  • 质量不合格起诉状
  • 行政单位举办活动能发奖奖金吗
  • 哪些公司可以开咨询费发票
  • 开具增值税专用发票承诺函
  • 问10个问题
  • 什么是清算资金
  • 怎么查询公司有没有开社保户
  • 怎么知道定额发票是真是假的
  • 1697509666
  • 产品打样费计入什么科目
  • 跨年度的房租发票怎么做账
  • 潜在表决权如何影响表决权
  • touch id反应慢
  • PHP:mb_regex_set_options()的用法_mbstring函数
  • 失控发票的企业怎么处理
  • 如何在 Windows 11 上更改锁屏壁纸
  • media是什么文件
  • 广告费的会计科目
  • 所有者权益会计科目借贷方向
  • 外贸企业代理出口销售的出口退税手续
  • 商企预提待付费什么意思
  • 汇算清缴针对哪些对象
  • 小规模纳税人查询
  • php数组求最大值
  • 商品流通企业库存商品的核算方法主要有
  • re.findall()用法
  • thinkphp excel
  • php数据库分页是怎么实现的
  • php的oop的理解
  • 其他债权投资按公允价值计量,为什么计提减值准备
  • ctf web2
  • 计算机视觉的未来发展方向有哪些
  • python机器人编程控制
  • 会计凭证出现的问题
  • 销货退回与折让属于什么科目
  • 增量留抵税额退还举例
  • 出纳对现金的收付应该怎么做
  • 坏账准备计提比例一般是多少
  • sql随机抽样
  • 固定资产账务处理候文江视频
  • 收到退回的增值税,应当作为营业外收入核算对吗
  • 用友t6操作流程
  • 公司转投资是什么意思
  • 小规模纳税人收入不能超过多少
  • 外购货物用于在建工程分录
  • 不动产进项税额转出
  • 固定资产需要具备的条件
  • 项目资本金如何确定
  • 什么是增值税
  • 会计记账科目表
  • 产值和销售收入可以一样吗
  • 反记账是什么
  • 伤病假条
  • 使用sql server
  • unix系统命令大全
  • solaris挂载硬盘
  • window英语
  • Win10 Mobile/PC Build 10586.550曝光:主要修复bug和优化性能
  • linux oracle 01034
  • 双系统卸载deepin
  • 毕竟近义词语
  • win10使用入门教程
  • linux使用curl进行接口测试
  • 如何配置无线网络路由器
  • jquery弹出框样式大全
  • opengl示例
  • jquery层次选择器主要包括哪几种分类
  • jquery中validate
  • 滴滴发票怎么查行程
  • 成都市税务局公示名单公布
  • 怎么使用企业级app
  • 重庆市九龙坡税务局行政服务中心电话
  • 亏损可以结转吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设