SQLServer数据类型优先级对性能的影响

原文:SQLServer数据类型优先级对性能的影响

译自:

http://www.mssqltips.com/sqlservertip/2749/sql-server-data-type-precedence/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012814

问题:

我在我的应用程序中使用简单的查询/存储过程访问一个很大的表。但执行了很长时间。在where子句中,我使用了有索引并且高选择性(selective)并且没有用函数包裹的字段。但是看起来就像没有使用索引一样,问题出在那里?

解决方案:

出现这种微秒的问题原因可能是作为参数的数据类型与查询中的数据类型不一致。在这种情况下,SQLServer将会要么把where中的列,要么把参数的数据类型隐式转换为更高级或者更低级的数据类型。当作为被查询列被转换时(转换竞争中的牺牲者),将引起扫描(scan)来满足查询请求。让我们看看以下两个例子,第一个例子使用示例数据库AdventureWorks,我们将通过一个客户的AccountNumber在Sales.Customer表中查询这个客户。AccountNumber这一列的数据类型是varchar(10)并且上面有一个唯一索引。运行下面的查询并且查看执行计划,可以看到结果如我们所愿:

create proceduredbo.PrecedenceTest

(

@AccountNumber varchar(10)

)

as

begin

set nocount on

select *

from Sales.Customer

where AccountNumber = @AccountNumber

end

go

exec dbo.PrecedenceTest‘AW00030113‘

go

执行计划如下:

接着让我们在参数上做些小改动,把它改为nvarchar(10),然后重新执行语句:

alter procedure dbo.PrecedenceTest
(
 @AccountNumber nvarchar(10)
)
as
begin
 set nocount on
 select * 
 from Sales.Customer
 where AccountNumber = @AccountNumber
end
go
exec dbo.PrecedenceTest ‘AW00030113‘
go

执行计划显示,优化器选择了扫描TerritoryID上的索引。

检查Filter操作,可以看到AccountNumber列上被隐式转换了类型来匹配传入的参数。由于数据类型varchar比参数类型nvarchar级别更低,导致其所在的索引失效。

现在让我们验证一下,在较低级别的数据类型作为查找参数下的情况。在这个例子中,Person.Person 表的LastName列是nvarchar类型,并且上面存在一个可用的索引,存储过程传入的参数是varchar类型:

alter procedure dbo.PrecedenceTest(
 @LastName varchar(50)
)
as
begin
 set nocount on
 select * 
 from Person.Person
 where LastName = @LastName
end
go
exec dbo.PrecedenceTest ‘Tamburello‘
go

执行计划显示,优化器选择使用了索引查找:

点开Index Seek的详细信息,可以看到列LastName的数据类型因为传入参数的原因而隐式转换成更高级的nvarchar类型。

当索引列不再被转换所影响时,优化器可以自由地选择最优执行计划。

不管你是在应用程序或者在存储过程中定义查询参数,确保查询参数中的数据类型和查询列的数据类型相吻合能避免索引扫描和其他转换引起的问题。

补充:数据类型的优先级,从高到底:

  1. user-defined data types (highest)

  2. sql_variant
  3. xml
  4. datetimeoffset
  5. datetime2
  6. datetime
  7. smalldatetime
  8. date
  9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar (including nvarchar(max) )
  26. nchar
  27. varchar (including varchar(max) )
  28. char
  29. varbinary (including varbinary(max) )
  30. binary (lowest)

时间: 2024-07-31 23:01:22

SQLServer数据类型优先级对性能的影响的相关文章

SqlServer常见问题及案例(性能+维护)

缺少索引 案例:某次线上有很多接口请求失败,服务器上发现CPU使用率很高.通过活动分析器(最近耗费大量资源的查询)发现有几个查询的CPU时间(毫秒/秒)达到3000以上.推测是查询没有利用索引导致的,通过在相关表上加索引解决了问题. 分析:大部分性能问题都是因为缺失索引或索引失效导致的(书签查找).此次问题是由于基础表(配置表)之间的连接没有索引,当随着配置的数据越来越多,查询计算量会越来越大,当数据量达到一定量级(几千至几万)且并发比较高(几千)问题就会显现出来.这些问题可以在写查询时建立索引

京东如何处理数据中心网络对应用性能的影响

?随着现代数据中心规模的不断扩张,网络拓扑和路由转发变得越来越复杂.传统的数据中心使用大型机和小型机,网络规模相对较小,普通的机框式交换机就能满足网络的需求.随着CLOS集群架构的普及,标准的x86服务器集群以低成本和高扩展性逐渐取代大型机和小型机而成为数据中心的主流. 下图就是一个典型的基于CLOS架构的数据中心解决方案,在这样的大规模网络中,如何让数据在传输过程中能以最快的速度从发送端到接收端,成为网络性能调优的关键因素. 京东IT资源服务部举办的未来数据中心核心技术研讨会上,京东人工智能,

c#SQLserver数据类型

c#SQLserver数据类型 Sql Server之数据类型详解 ??数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源. ??Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会

数据库表添加索引对性能的影响

1.添加索引后查询速度会变快 mysql中索引是存储引擎层面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是表中数据量很大的时候,正确的索引会极大的提高查询效率.简单理解索引,就相当于一本砖头厚书的目录部分,通过目录可以快速查找到想要找的内容具体所在的页码.在经常需要搜索的列上创建索引,可以加快搜索的速度.如果表中数据少的话,没必要用索引,如果表中数据很多的话,还是有索引比较好. 2.索引的优点 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 可以大大加快数据的检

smarty对网页性能的影响--开启opcache

在上一篇<smarty对网页性能的影响>中,默认没有开启opcache,于是我安装了一下zend opcache扩展,重新实验了一下,结果如下: 有smarty 用apache的ab命令进行压力测试,并发10个,不算大:同时用sar命令进行cpu利用率的统计.命令如下: ./ab -c 10 -n 100000 http://cq01-rdqa-dev072.cq01.baidu.com:8008/index.php sar -u 2 1000 >/tmp/smarty.sar &

HTTP的持久连接对Web服务性能的影响

我们的 Web 页面通常有很多对像(Object)组成.如:jss 样式表.图片.scripts.文档等.所以用户浏览一个网页文件时候,要向 Web 服务器发送多次请求(要从服务器上获取一个Object就要向服务器发送一个请求),浏览器根据 jss 样式表把从服务器获取的这些html页面对象合成一个完整的html页面展示给用户.        最早我们的浏览器是单线程的,意味着一次只能向浏览器发送一个Object请求,等到该Object传输完成了,再向服务发送第二个Object的请求.我们把它称

浅谈 js 下 with 对性能的影响

这几天多次看到有博主们在写 with 的文章,这货确实非常方便,但是却是个性能杀手,所以一直都是上不得台面的.那么他究竟会让效率低下到什么程度呢?先来看下 with 是如何的便捷吧.. // 正常调用 console.log(location.host); console.log(location.pathname); // 在 with 下 with (location) { console.log(host); console.log(pathname); } 如果不影响性能,确实是非常霸气

SQL Server中多表连接时驱动顺序对性能的影响

原文:SQL Server中多表连接时驱动顺序对性能的影响 本文出处:http://www.cnblogs.com/wy123/p/7106861.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 最近在SQL Server中多次遇到开发人员提交过来的有性能问题的SQL,其表面的原因是表之间去的驱动顺序造成的性能问题,具体表现在(已排除其他因素影响的情况下),存储过程偶发性的执行时间超出预期,甚至在调试的时候

软件对存储性能的影响&#8203;

存储系统的核心是软件,在磁盘存储时代,存储系统软件设计的好坏似乎对性能的影响并不是很大,很多存储软件的设计并不会去考虑计算机的体系架构,也不用去关心操作系统调度.内存拷贝等因素带来的性能影响.对于磁盘存储,事情的确是这样的,原因在于磁盘的性能远远低于CPU处理和访存性能.磁盘存储的性能瓶颈点就在于磁盘本身,因此过多的体系结构级别.竞争资源同步的优化,不会对存储性能带来显著优化. 在很久以前做过这方面的实践,当时觉得临界区的资源竞争会对IO性能造成影响,因此,对我们做的一套存储虚拟化系统进行锁资源