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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: SQLServer数据类型优先级对性能的影响 译自: http://www.mssqltips.com/sqlservertip/2749/sql-server-data-type-precedence/?utm_source=dailynewsletter&utm_medium=email&utm_content=headline&utm_campaign=2012814   问题:          我在我的应用程序中使用简单的查询/存储过程访问一个很大的表。
原文: 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)


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
9月前
|
存储 SQL
Sql Server 中char、nchar、varchar、nvarchar这几种数据类型的区别
Sql Server 中char、nchar、varchar、nvarchar这几种数据类型的区别
141 0
|
9月前
|
SQL 存储 XML
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
75 0
|
存储 SQL Go
|
SQL 存储 数据库
数据库原理与应用(SQL Server)笔记 第八章 用户自定义数据类型与变量
数据库原理与应用(SQL Server)笔记 第八章 用户自定义数据类型与变量
数据库原理与应用(SQL Server)笔记 第八章 用户自定义数据类型与变量
|
存储 SQL XML
SQL Server数据库数据类型详解
SQL Server数据库数据类型详解
221 0
|
关系型数据库 索引 RDS
用 ssms 排查 rds for sqlserver 性能问题
ssms 即Microsoft sqlserver management studio , 需要在本地安装后才能使用. 本文以 sqlserver 2017 management studio 工具排查日常使用中遇到的性能问题.
2538 0
|
SQL C# 数据库
SQLSERVER执行性能统计工具SQLQueryStress
原文:SQLSERVER执行性能统计工具SQLQueryStress SQLSERVER执行时间统计工具SQLQueryStress 有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统计 1 SET STA...
1242 0
|
Oracle 关系型数据库
Oracle和sqlserver数据类型对应
原文:Oracle和sqlserver数据类型对应 Sqlserver类型 Oracle类型 binary     RAW(50) bit     NUMBER(2) char     CHAR(10) datetime     DATE decimal ...
1341 0
|
SQL Go 索引
SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。
原文:SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。 案例环境:           操作系统版本 : Windows Server 2008 R2 Standard  SP1           数据库版本   :  Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 案例介绍:   由于不能将生产环境的代码和数据贴上来,所以我构造了下面一个小案例,当然没法和生产环境的案例一致。
886 0

相关实验场景

更多