Sql 相同的查询、不同的数据库、相同的数据库结构、相同的数据库服务器、不同的执行计划

Sql 相同的查询、不同的数据库、相同的数据库结构、相同的数据库服务器、不同的执行计划,sql,sql-server,Sql,Sql Server,这把我打败了 我们的一个客户机有一个SQL Server实例,具有2个DB、一个测试和一个生产。两个数据库都是相同的,表结构、索引等。当在测试数据库上运行下面的某个查询结构时,将在30秒内返回行。在生产数据库上,返回行需要1.5小时!!活动监视器显示在无等待类型的情况下运行的查询。所有统计数字都是最新的。当比较执行计划时,主要区别在于嵌套的prod与hash连接测试。我们可以在生产数据库上添加索引以提高性能,接收的执行时间与测试服务器大致相同,但请记住,测试服务器不需要此附加索引 不幸的是,客户

这把我打败了

我们的一个客户机有一个SQL Server实例,具有2个DB、一个测试和一个生产。两个数据库都是相同的,表结构、索引等。当在测试数据库上运行下面的某个查询结构时,将在30秒内返回行。在生产数据库上,返回行需要1.5小时!!活动监视器显示在无等待类型的情况下运行的查询。所有统计数字都是最新的。当比较执行计划时,主要区别在于嵌套的prod与hash连接测试。我们可以在生产数据库上添加索引以提高性能,接收的执行时间与测试服务器大致相同,但请记住,测试服务器不需要此附加索引

不幸的是,客户端不是技术性的,因此使用视图连接到视图是很困难的。通过在生产数据库上添加附加索引,在性能方面解决了问题本身。但是我们仍然无法理解为什么测试数据库在没有附加索引的情况下执行find

有人能解释一下吗?我们被难住了

查询结构:

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%')

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

INSERT INTO test.table
SELECT * FROM prod.table
语句,则测试数据库中的数据没有生产数据库中的空间多。但这取决于生产中如何处理数据


Check function

查询运行时,perfmon stats如何?数据量如何??您的测试环境中有多少数据??如果您只有5-10%的生产数据,那么执行当然会显著不同……相同的行数,从相同的源系统提取相同的数据:您说它是相同的DB服务器,但它们有多相同?它们是否来自同一供应商、同一I/O系统、内存、处理器等相同的盒子,运行相同的O/S、相同版本的SQL Server、相同的service Pack等。即使听起来微不足道的差异也足以让SQL Server做出愚蠢的事情。与2个DBs相同的是在同一台服务器上,因此1个服务器、1个db服务器、,2.不影响执行计划的选择。