SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之
|--Nested Loops(Inner Join, WHERE:([northwind].[dbo].[tbtext].[id] as [b].[id]=[northwind].[dbo].[tbtext].[id] as [a].[id]))
表 'tbtext'。扫描计数 2,逻辑读取 262 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SET STATISTICS TIME ON
SELECT COUNT(1)
表 'tbtext'。扫描计数 2,逻辑读 262 次,物理读 0 次,预读 138 次。
复制代码 代码如下:
SQL Server 执行时间:单这句测试,看执行计划根本看不出区别。
SQL Server 执行时间:
*/
SET STATISTICS IO ON
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SELECT COUNT(1)
2000sp4:
从2000到2008 不单单是多了sqlos和表面上的一些功能,很多执行计划的操作符都被重写了,像lazy spool 。
(1 行受影响)
*/
CREATE TABLE [dbo].[tbtext](
|--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1006])))
表 'tbtext'。扫描计数 1,逻辑读 131 次,物理读 0 次,预读 0 次。
复制代码 代码如下:
2008r2:
FROM dbo.tbtext a
当n < 386 时 逻辑读=3+4(n-1)
|--Table Scan(OBJECT:([northwind].[dbo].[tbtext] AS [b]), WHERE:([northwind].[dbo].[tbtext].[id] as [b].[id]<=(1000)))
SQL Server 执行时间:
WHERE a.id <= 1000 option (maxdop 1)
|--Stream Aggregate(DEFINE:([Expr1006]=Count(*)))
|--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,[Expr1009],0)))
复制代码 代码如下:
表 'Worktable'。扫描计数 1,逻辑读取 290098 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。通过调节id 的值,2000 我推出了一个公式 逻辑读= 10001+(17*n) ,
2008 的lazy spool适合选择度高的,选择度低的时候完全不行。
|--Table Scan(OBJECT:([Northwind].[dbo].[tbtext] AS [a]), WHERE:([a].[id]<=1000))
复制代码 代码如下:
SET STATISTICS TIME OffSET STATISTICS IO Off
|--Table Scan(OBJECT:([northwind].[dbo].[tbtext] AS [b]))
ON a.id = b.id
表 'Worktable'。扫描计数 1,逻辑读取 6006 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SELECT COUNT(1) FROM dbo.tbtext a INNER LOOP JOIN dbo.tbtext b ON a.id = b.id WHERE a.id <= 1000 option (maxdop 1)
比较2000 和 2008的执行就能发现 2008 的cpu 时间明显比 2000 高,2008 的worktable 逻辑读取量,比2000的高,
[id] [int] IDENTITY(1,1) NOT NULL,
SET STATISTICS IO ON
表 'tbtext'。扫描计数 1,逻辑读取 46 次
2008r2:
CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
ON a.id = b.id option (maxdop 1)
警告: 由于使用了局部联接提示,所以联接次序得以强制实施。
|--Table Spool
|--Table Scan(OBJECT:([Northwind].[dbo].[tbtext] AS [b]))
警告: 由于使用了本地联接提示,联接次序得以强制实施。
) ON [PRIMARY]
那么就开始调节,过滤id 会有啥发现呢?
/*
SET STATISTICS TIME ON
复制代码 代码如下:
复制代码 代码如下:
进入 lazy spool的数据完全不一样了,2008 只是进入了1000 条数据,但是2000 全都进去了。|--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))
当 386<=n<=770 逻辑读= 1932+5(n-386)
在逻辑读上面 2008 明显低于 2000. cpu时间也明显比2000少。
|--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))
各位朋友,是否都应该重写一下sql 呢?单单优化 索引 已经解决不了根本问题了。 SQL Server 执行时间:
但是2008的算法十分奇怪,
INNER LOOP JOIN dbo.tbtext b
表 'tbtext'。扫描计数 2,逻辑读取 262 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
所以在升级到2008 之前,
CPU 时间 = 32828 毫秒,占用时间 = 32846 毫秒。
|--Table Scan(OBJECT:([northwind].[dbo].[tbtext] AS [a]), WHERE:([northwind].[dbo].[tbtext].[id] as [a].[id]<=(1000)))
|--Nested Loops(Inner Join, WHERE:([b].[id]=[a].[id]))
|--Table Spool
复制代码 代码如下:
/*
INNER LOOP JOIN dbo.tbtext b
|--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,[Expr1009],0)))
性能差怎么大会不会是 worktable 搞的鬼呢?
(1 行受影响)
SET STATISTICS IO Off
表 'Worktable'。扫描计数 999,逻辑读 27001 次,物理读 0 次,预读 0 次。
|--Table Spool
FROM dbo.tbtext a
|--Nested Loops(Inner Join, WHERE:([northwind].[dbo].[tbtext].[id] as [b].[id]=[northwind].[dbo].[tbtext].[id] as [a].[id]))
(1 行受影响)
SELECT COUNT(1)
2000的逻辑读是线性增长,2008 是分段的线性增长,每个分段 f '(x) 都不一样。
SQL Server 执行时间:
CPU 时间 = 17188 毫秒,耗费时间 = 17261 毫秒。
FROM dbo.tbtext a
表结构:
CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
表 'Worktable'。扫描计数 9999,逻辑读 180001 次,物理读 0 次,预读 0 次。
这个有个worktable 的扫描技术,2000的是9999,2008的是1,这个让人难免有的疑惑是什么情况,都是nest loop,worktable 扫描不应该是1才对。
SET STATISTICS TIME Off
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/mssql/1626.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
