位置: 编程技术 - 正文

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

  • 酒类的包装物押金可以单独核算吗
  • 小规模纳税人城市维护建设税税率
  • 什么情况下核定征收转为查账征收
  • 建筑业差额纳税怎么算
  • 金税盘清卡怎么统计税额
  • 定额怎么确定
  • 测绘费发票需要备注么
  • 固定资产报废属于非常损失吗
  • 个体工商户必须缴纳社保吗
  • 销售自己使用过的物品
  • 房产公司要交房产税吗
  • 贷款计提利息会计分录
  • 个体户生产经营所得税税率表
  • 加油充值卡有优惠吗
  • 通用机打发票什么样子
  • 税务的电子钥匙是干嘛的
  • ca浏览器组件如何下载?
  • 当月税负率怎么算
  • 个体工商户是否需要缴纳印花税
  • 企业的固定资产可以按照其价值和使用情况
  • 【免费】多种方法手把手教你如何将自己做的网页做成网络链接(直接访问)
  • 收益相关的政府补助分录
  • 投标保证金退回的利息计入什么费用
  • 预收账款调增应纳税所得额
  • php数据库编程
  • php抓取
  • 长期股权投资初始计量和后续计量的区别
  • ajax的使用场景
  • 营业外收入不算收入吗
  • 运输中合理损耗计入存货成本吗
  • 税控盘用来干嘛的
  • 其他业务收入负数坐在贷方
  • 前端bs是什么
  • php微信公众号获取带参二维码
  • php开发程序
  • 月末制造费用可以有余额吗
  • 预付账款和预收账款哪个是负债
  • 发票入账怎么做分录
  • 财务报表不申报可以领票吗
  • 26个字母!
  • python中sample函数怎么用
  • 挂靠车辆进项税额是否可以抵扣
  • 不用交社保的几种情况
  • 没有收到房租发票
  • 已抵扣进项税额转出的会计分录怎么做
  • 小微企业免税额度是多少
  • 补贴费用申请书怎么写
  • 教育局给幼儿园的补贴
  • 解除劳动合同的合法程序
  • 税控盘会计分录怎么做
  • 营改增后建筑业税率
  • 简易征收是什么意思和一般纳税人
  • 出售无形资产属什么科目
  • mysql 5.7.30安装
  • 微软宣布9月30日停止在俄罗斯服务
  • win8怎么取消自动关机
  • 操作系统安全配置一般包括哪些内容
  • windows8如何添加打印机
  • mac登录apple id一直转圈
  • win7系统小喇叭有红叉没声音
  • js日期选择框
  • perl 文件
  • 网页打开新窗口怎么关闭
  • python算法具有哪五个性质
  • python matplotlab
  • node vm模块
  • android 多个权限合并 弹窗
  • python迭代算法举例
  • java scripts
  • 简述python语言
  • wxpython怎么用
  • androidstudio offline
  • 小规模纳税人季报网上申报流程
  • 河北电子税务局开票流程
  • 房地产开发商要交哪些税和费用
  • 提问:请问海淀区各税务所管辖范围都是哪里?
  • 噼里啪啦财务公司加盟
  • 湖北税务发票查询系统网
  • 江苏灵活就业医保交多少年
  • 财务年中工作总结简短
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设