bingtuag 发表于 2015-6-30 11:44:14

SQL Server 2000 升级到 SQL Server 2008 性能问题之一

  今天在 相同环境测试 2000 和 2008 性能
  让我意外的是 2008 明显比2000 慢很多
  测试sql:



SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT COUNT(1)
   FROM dbo.tbtext a
   INNER LOOP JOIN dbo.tbtext b
      ON a.id = b.idoption (maxdop 1)
SET STATISTICS IO Off
SET STATISTICS TIME Off
  表结构:



CREATE TABLE .(
    IDENTITY(1,1) NOT NULL,
    NULL
) ON
  
单这句测试,看执行计划根本看不出区别。
  |--Compute Scalar(DEFINE:(=CONVERT_IMPLICIT(int,,0)))
|--Stream Aggregate(DEFINE:(=Count(*)))
|--Nested Loops(Inner Join, WHERE:(... as .=... as .))
|--Table Scan(OBJECT:(.. AS ))
|--Table Spool
|--Table Scan(OBJECT:(.. AS ))
  2008r2:
  



/*
警告: 由于使用了本地联接提示,联接次序得以强制实施。
表 'tbtext'。扫描计数 1,逻辑读取 46 次
(1 行受影响)
表 'Worktable'。扫描计数 1,逻辑读取 290098 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'tbtext'。扫描计数 2,逻辑读取 262 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(1 行受影响)
SQL Server 执行时间:
   CPU 时间 = 32828 毫秒,占用时间 = 32846 毫秒。
SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

*/
  2000sp4:



/*
警告: 由于使用了局部联接提示,所以联接次序得以强制实施。
表 'tbtext'。扫描计数 1,逻辑读 131 次,物理读 0 次,预读 0 次。
SQL Server 执行时间:
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
表 'Worktable'。扫描计数 9999,逻辑读 180001 次,物理读 0 次,预读 0 次。
表 'tbtext'。扫描计数 2,逻辑读 262 次,物理读 0 次,预读 138 次。
SQL Server 执行时间:
   CPU 时间 = 17188 毫秒,耗费时间 = 17261 毫秒。
(1 行受影响)
SQL Server 执行时间:
   CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。
*/
  比较2000 和 2008的执行就能发现 2008 的cpu 时间明显比 2000 高,2008 的worktable 逻辑读取量,比2000的高,
  这个有个worktable 的扫描技术,2000的是9999,2008的是1,这个让人难免有的疑惑是什么情况,都是nest loop,worktable 扫描不应该是1才对。
  性能差怎么大会不会是 worktable 搞的鬼呢?
  那么就开始调节,过滤id 会有啥发现呢?



SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT COUNT(1)
   FROM dbo.tbtext a
   INNER LOOP JOIN dbo.tbtext b
      ON a.id = b.id
   WHEREa.id
页: [1]
查看完整版本: SQL Server 2000 升级到 SQL Server 2008 性能问题之一