位置: 编程技术 - 正文

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

  • 公司租赁个人车辆税率是多少
  • 旅游业成本交税会计分录怎么做
  • 出口货物退免税政策
  • 税金及附加属于营业成本吗
  • 事业单位有那种
  • 法人的垫资在现金流量表中怎么填写
  • 普通发票作废要交税吗
  • 固定资产与累计折旧有对应关系吗
  • 房地产公司支付工程款账务处理
  • 合同方和付款方不一致,发票开付款方可以吗
  • 捐赠支出税前扣除政策
  • 增值税是购货方交还是销货方交
  • 品牌使用费的账务处理
  • 会计差旅费属于什么会计科目
  • 道路运输业税率多少
  • 建筑施工企业的分公司区域公司等较大的
  • 当前一般纳税人增值税税率
  • 所得税汇算清缴退款账务处理
  • 汇算清缴做完还能改账么
  • 旅游业小规模纳税人亏损怎么填报
  • 发票需要写真名吗
  • efi系统分区能删除吗win10
  • 企业季度税如何申报
  • php面向对象优点,缺点
  • 其他应付款期初余额在哪方
  • minilauncher是什么
  • 职工教育经费会计准则最新规定
  • 最早在哪一年手机可以上网
  • php text
  • 在途物资属于什么存货
  • 海关进口增值税怎么认证抵扣
  • php简单么
  • centos7配置自动获取ip
  • 购买完服务器之后要怎么做
  • “oracle”
  • vgdisplay命令无效
  • 用友u8删除凭证的步骤
  • php 用户
  • 注解@entity
  • 会计账簿记账规则最新
  • phpcms怎么用
  • python的next()
  • 发票校验码被章盖住了
  • 水电费进项税额转出情形
  • 土增尾盘销售应该如何申报收入
  • 企业筹建期间是什么
  • 单位买车和个人买车交税有何不同
  • 开个分公司有啥好处
  • mysql三种安装方式
  • 应付账款的余额表示什么
  • 应付票据是
  • 新开公司费用
  • 食品企业产品
  • 营改增税法
  • 进项发票已经认证,对方作废了
  • 什么经营范围可以开推广服务费
  • 待清算商户款项分录的摘要是什么
  • 购买农产品进行销售要交税吗
  • 营改增之后账务怎么处理
  • 签合同前的协议叫什么
  • 一般要做代理,授权书有什么用
  • 会计总账怎么做账
  • 凭证上的数字金额怎么填
  • access数据库导入到sqlserver
  • sqlserver日志已满
  • win7打开控制面板快捷键
  • rsync -i
  • win7系统教程
  • win7一开机就弹窗
  • 六个自由
  • opengl深度值与z值
  • 归档 oracle
  • Node.js中的http请求客户端示例(request client)
  • [置顶]bilinovel
  • shell脚本编程实例
  • java script入门
  • 安徽国税app
  • 云南地税局官网
  • 监理费合同按什么计算
  • 预缴税款怎么做账
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设