性能测试培训:sql server性能测试分析局部变量的性能影响
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了性能测试培训:sql server性能测试分析局部变量的性能影响,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2615字,纯文字阅读大概需要4分钟。
内容图文
![性能测试培训:sql server性能测试分析局部变量的性能影响](/upload/InfoBanner/zyjiaocheng/458/86952ae96e5744e39c9dfe11cc8dd5f7.jpg)
性能测试的分析都有一定的方法和思路,这次我们来看看sqlserver方面的性能的知识。
数据库开发者在存储过程和脚本中使用局部变量,但是,局部变量会影响查询的性能。我们创建一个表并插入一些测试数据:
USE AdventureWorks
GO
CREATE
TABLE
TempTable
(tempID UNIQUEIDENTIFIER,tempMonth
INT
, tempDateTime DATETIME )
GO
INSERT
INTO
TempTable (tempID, tempMonth, tempDateTime)
SELECT
NEWID(),(
CAST
(100000*RAND()
AS
INT
) % 12) + 1 ,GETDATE()
GO 100000
-- (EXECUTE THIS BATCH 100000 TIME)
-- Create an index to support our query
CREATE
NONCLUSTERED
INDEX
[IX_tempDateTime]
ON
[dbo].[TempTable]
([tempDateTime]
ASC
)
INCLUDE ( [tempID])
WITH
( ALLOW_ROW_LOCKS =
ON
, ALLOW_PAGE_LOCKS =
ON
)
ON
[
PRIMARY
]
GO
然后我们做一个简单的查询:
SET
STATISTICS
IO
ON
GO
SELECT
*
FROM
TempTable
WHERE
tempDateTime >
‘2015-10-10 03:18:01.640‘
Table ‘TempTable‘. Scan count 1, logical reads 80, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
检查这个执行计划以及索引检索的属性,你会发现预估行数是实际行数的两倍,但并不会太影响执行计划,因为优化器选择了最合适的查询方法:
![性能测试培训:sql server性能测试分析局部变量的性能影响 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424124935140.jpg)
查询优化器根据基本统计直方图来预估数据行数,即:EQ_ROWS + AVG_RANGE_ROWS (77 + 88.64286) DBCC SHOW_STATISTICS (‘dbo.TempTable‘, IX_tempDateTime)
现在我们修改 SELECT 语句以使用局部变量,你会发现查询优化器使用了一个不同的查询计划,这是一个更耗时的计划,为什么?
DECLARE
@RequiredDate DATETIME
SET
@RequiredDate =
‘2015-10-10 03:18:01.640‘
SELECT
*
FROM
TempTable
WHERE
tempDateTime > @RequiredDate
Table ‘TempTable‘. Scan count 1, logical reads 481, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
![性能测试培训:sql server性能测试分析局部变量的性能影响 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424124935354.jpg)
![性能测试培训:sql server性能测试分析局部变量的性能影响 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424124935409.jpg)
预估值和实际值差别更大,相当于查询优化器无法选择最适合的查询计划,因为错误的预估值。因为查询优化在执行时并不清楚局部变量值,导致无法使用统计直方图。
不等式运算符的情况
在我们的查询中使用的不等式运算符,因此查询优化器使用了一个简单的 30% 的算式来预估。
Estimated Rows =(Total Rows * 30)/100 = (100000*30)/100 = 30000
等式运算符的情况
DECLARE
@RequiredDate DATETIME
SET
@RequiredDate =
‘2012-07-10 03:18:01.640‘
SELECT
*
FROM
TempTable
WHERE
tempDateTime = @RequiredDate
如果在局部变量中使用等式运算符,那么查询优化器又会选择不同的公式,即 精确度 * 表记录总数. 执行下面查询可获取精确的值
DBCC SHOW_STATISTICS(‘dbo.TempTable‘, IX_tempDateTime)
All Density = 0.0007358352 Total Number of Rows in Table = 100000Estimated Rows = Density * Total Number = 0.0007358352 * 100000 = 73.5835
性能测试培训:sql server性能测试分析局部变量的性能影响
标签:
本文系统来源:http://www.cnblogs.com/laoli0201/p/4873056.html
内容总结
以上是互联网集市为您收集整理的性能测试培训:sql server性能测试分析局部变量的性能影响全部内容,希望文章能够帮你解决性能测试培训:sql server性能测试分析局部变量的性能影响所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。