相同的查询,不同的DB,相同的DB结构,相同的DB服务器,不同的执行计划

时间:2011-11-10 04:26:10

标签: sql sql-server

这个让我受伤了!

我们的一个客户端有一个SQL Server实例,包含2个DB,一个测试和一个生产。两个DB都是相同的,表结构,索引等。当在测试DB上运行某个查询(下面的结构)时,将在30秒内返回行。在生产DB上,行需要1.5小时才能返回!! Activity Monitor显示运行时没有等待类型的查询。所有统计数据都是最新的。比较执行计划时,主要区别是嵌套(prod)vs散列连接(测试)。我们可以在生产数据库上添加索引以提高性能,接收与测试服务器大致相同的执行时间,但记住测试服务器不需要这个额外的索引!

不幸的是,客户端不是技术因此使用视图加入视图(畏缩)。问题本身在性能方面得到了解决(通过在生产数据库上添加附加索引)。但是我们仍然无法弄清楚为什么测试数据库在没有附加索引的情况下执行查找。

任何人都能解开一些光明吗?我们很难过!

查询结构:

SELECT field1,
       field2,
       field3,
       DATEDIFF(mi, field5, field5) as 'Time'
  FROM MainView t
  JOIN SecondaryView i ON t.NonIndexedColumn = i.NonIndexedColumn
 WHERE date >= '2010/07/05'
   AND date < '2011/09/27'
   AND anotherDate IS NULL
   AND Code LIKE 'Abc%'
   AND Desc LIKE('%ABC%')

1 个答案:

答案 0 :(得分:-1)

可能是因为磁盘上的数据分布不同或“表碎片”。 如果导入了数据,例如,使用

INSERT INTO test.table
SELECT * FROM prod.table

语句,然后测试数据库中的数据没有生产空间那么多。但这取决于生产中数据的处理方式。

检查sys.dm_db_index_physical_stats功能

相关问题