位置: 编程技术 - 正文

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

  • 实收资本印花税按次还是按年
  • 房地产企业销售现房是否预缴增值税
  • 委托加工直接对外销售的消费税
  • 货物和运费一起开票怎么开
  • 递延收益是什么表
  • 公司举办的活动
  • 公司阅览室布置图片
  • 商品破损了应该怎么赔偿
  • 营改增后向境外提供有偿服务是否需要缴纳增值税?
  • 工会经费有关的增值税能否抵扣?
  • 园林设计属于什么
  • 税款滞纳金怎么入账
  • 个人转让住房交土地增值税吗
  • 股东对外投资
  • 其他应付款不需要支付是债务重组么
  • 印花税扣款
  • win11系统更新卡在25%
  • 升级打装备的手游
  • 进项税额转出是负数是什么意思
  • 先入费用后来发票怎么做账
  • rmb转
  • win10版本1909和22h2
  • dcom进程
  • ant design vue vue3
  • 企业会计核算利润表
  • 股权投资企业收益怎么算
  • 支付职工教育经费
  • 会计劳保用品有哪些东西呢
  • 猿类作文
  • vuejs axios
  • 命令grep
  • lpstat命令
  • django中httpresponse
  • 没有抄报税就申报了怎么办
  • 工会组织机构需要备案吗
  • 转出未交增值税最终怎么转平
  • 关联方占用资金应对措施
  • 投资款不打入公司账户可以吗
  • 小企业会计准则和企业会计准则的区别
  • 上年结转库存现金会计分录
  • mysql用户权限详解
  • mongodb安装教程win10
  • 缴纳上月应交未交税费
  • 分公司员工在总公司缴纳社保
  • 城市维护建设税属于中央还是地方
  • 收到政府的资本公积可以投入子公司吗
  • 其他业务收入如何填写申报表
  • 装修费未计入长期费用
  • 设计费要计入固定成本吗
  • 旅游服务住宿费可以抵扣吗
  • 库存现金多出来怎么调账
  • 以考核为由扣除工资
  • 待认证进项税额和待抵扣进项税额的区别
  • 企业凭证处理流程图
  • 生产型企业出口退税计算
  • 个人取得的劳务报酬需要交增值税吗
  • 在建工程转固规定
  • 短期薪酬主要包括
  • mysql数据库类型有哪些?如何选择合适的数据类型
  • sql server中事务有哪三种语句
  • sql server 复制表中行数据
  • 微软windows 10
  • win8怎么禁止开机启动项
  • windows7/vista/server(no slic)
  • 远程桌面登录显示其他用户
  • Windows Server 2008下利用Diskpart管理磁盘
  • bios怎么设置efi引导
  • windows7 excel
  • ubuntu命令行调节音量
  • win8系统怎么搜索软件
  • mac的dock栏怎么设置
  • 如何调整输入法框的大小
  • win8.1安装过程
  • jQuery插件封装时如要实现链式编程,需要
  • jQuery仿写百度百科的目录树
  • python实现识别相似图片小结
  • javascript图片
  • 北京朝阳地税搬哪去了
  • 美国网购消费者个人信息保护法
  • 平顶山属于河南还是河北
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设