的地方,SQLServer2000升级到SQLServer2008的性能需要注意

测试SQL:
复制代码代码如下所示:
设置统计数据
设置统计时间
选择计数(1)
从dbo.tbtext一
内循环连接dbo.tbtext B
在张=数据选项(MAXDOP 1)
设置统计数据
设置统计时间

表结构:
复制代码代码如下所示:
创建表{ } { }(tbtext dbo。
{标识(1,1)不为null,
{值} null
在{主}上

在这一次测试中,执行计划和执行计划之间没有差别。
| --计算标量(定义:({ } = expr1006 convert_implicit(int,{ expr1009 },0))))
| --流聚合(定义:({ } = expr1009计数(*)))
| --嵌套循环(内连接,其中:({北风}。{ DBO }。{ tbtext }。{身份}是{黑}。{ } = { ID Northwind }。{ - }。{ tbtext }。{ } { }为ID。{id}))
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {一}))
|表阀芯
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {红}))
2008R2:
复制代码代码如下所示:
*
警告:由于使用本地连接提示,连接命令被强制执行。
table'tbtext。扫描计数1,逻辑读46次
(1行受影响)
table'worktable。扫描计数1,逻辑读取290098次,物理读0遍,读0遍,把逻辑读0次,把物理读0次,把0次吧。
table'tbtext。扫描计数2,逻辑读取262次,物理读0遍,读0遍,把逻辑读0次,把物理读0次,把0次吧。
(1行受影响)
SQLServer执行时间:
CPU时间= 32828毫秒,占用时间= 32846毫秒。
SQLServer执行时间:
CPU时间= 0毫秒,占用时间= 0毫秒。
* /

2000sp4:
复制代码代码如下所示:
*
警告:由于使用本地连接提示,连接命令被强制执行。
table'tbtext。扫描计数1,逻辑读取131次,物理读0次,0次吧。
SQLServer执行时间:
CPU时间= 0毫秒,耗时= 0毫秒。
table'worktable。扫描计数9999,逻辑读取180001次,物理读0次,0次吧。
table'tbtext。扫描计数2,逻辑读取262次,物理读0次,138次吧。
SQLServer执行时间:
CPU时间= 17188毫秒,耗时= 17261毫秒。
(1行受影响)
SQLServer执行时间:
CPU时间= 0毫秒,耗时= 0毫秒。
* /

比较2000和2008执行可以发现,2008的CPU时间显着高于2000,和2008的工作台逻辑读取高于2000。
这是一种工作台扫描技术,2000是99992008,这是嵌套环和工作台扫描不应该是1的必然疑问。
工作台性能差是什么
所以开始调整,过滤器ID会找到什么
复制代码代码如下所示:
设置统计数据
设置统计时间
选择计数(1)
从dbo.tbtext一
内循环连接dbo.tbtext B
在张=数据
在张1000选项(MAXDOP 1)
选择计数(1)
从dbo.tbtext一
设置统计数据
设置统计时间

2008R2:
select count(1)从dbo.tbtext内循环连接dbo.tbtext B =数据,选择1000张张(MAXDOP 1)
| --计算标量(定义:({ } = expr1006 convert_implicit(int,{ expr1009 },0))))
| --流聚合(定义:({ } = expr1009计数(*)))
| --嵌套循环(内连接,其中:({北风}。{ DBO }。{ tbtext }。{身份}是{黑}。{ } = { ID Northwind }。{ - }。{ tbtext }。{ } { }为ID。{id}))
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {一}),其中:({北风}。{ DBO }。{ tbtext }。{一} { }为ID。{id} <=(1000)))
|表阀芯
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {红}),其中:({北风}。{ DBO }。{ tbtext }。{身份}是{黑}。{id} <=(1000)))
复制代码代码如下所示:
table'worktable。扫描计数1,逻辑读取6006次,物理读0遍,读0遍,把逻辑读0次,把物理读0次,把0次吧。
table'tbtext。扫描计数2,逻辑读取262次,物理读0遍,读0遍,把逻辑读0次,把物理读0次,把0次吧。

2000sp4:
| --计算标量(定义:({ } = expr1002转换({ expr1006 })))
| --流聚合(定义:({ } = expr1006计数(*)))
| --嵌套循环(内连接,其中:({黑}。{ } = {一} ID。{id}))
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {一}),其中:({一}。{id} <= 1000))
|表阀芯
|表扫描(对象:({北风}。{ } { }为dbo。tbtext {红}))
复制代码代码如下所示:
table'worktable。扫描计数999,逻辑读取27001次,物理读0次,0次吧。
table'tbtext。扫描计数2,逻辑读取262次,物理读0次,0次吧。

输入懒惰的线轴的数据是完全不同的,2008刚刚进入了1000个数据,但2000个进去了。
在逻辑阅读中,2008明显少于2000。CPU时间明显小于2000。
通过调整id的值,2000引入了公式逻辑读= 10001 +(17×n),
但是2008算法很奇怪。
n = 386时逻辑读= 3 + 4(n-1)
当386≤n<= 770 = 1932 + 5(逻辑读n-386)
2000的逻辑读数是线性增长,2008是分段线性增长,每个段F′(x)是不同的。
2008的延迟阀芯适合高选择,当选择较低时不好。
从2000到2008,它不仅是更多的基于表面上的一些特点,和很多的执行计划的运营商正在改写,像懒阀芯。
所以在升级到2008之前,
朋友们,你应该重写SQL吗单凭指标的优化并不能解决根本问题。