SQL SERVER - 执行计划

时间:2014-03-26 14:20:46

标签: sql sql-server

我在两个数据库中都有一个VIEW。在一个数据库中,运行时间不到1秒,但在另一个数据库中运行1分钟或更长时间。我检查索引,一切都是一样的。行数之间的差异低于每个其他数据库的1000万行。

我检查了de exectuion计划,我发现的是,需要更多时间的数据库,我有3个哈希匹配(1个聚合和2个右外连接),在查询批处理中可以100%响应。在另一个数据库中,我在执行计划中没有这个。

谁能告诉我在哪里可以开始搜索问题?

谢谢你,抱歉英文不好。

1 个答案:

答案 0 :(得分:2)

您可以查看此link here以获取有关不同类型联接的快速说明。

基本上,根据您提供给我们的信息,以下是可能出错的一些替代方案:

  1. 一个DB有索引而另一个DB没有。
  2. 一个数据库中某些连接表之间的大小差异,足以改变所使用的连接类型。
  3. 虽然您的索引在两个数据库表组中可能是相同的,但正如您所说的那样......其他数据库可能已过时/错误统计或索引碎片过多,从而导致计划不佳。
  4. 修改

    关于下面的评论,重建索引确实类似于drop&重建索引。由于创建索引还会为这些索引创建统计信息,因此重建也会处理这些索引。但有时这还不够。

    虽然官方默认统计数据应该以实际数据的约20%采样率构建,但实际上采样率可以低至几个百分点,具体取决于表格的大小。它很少接近20%。因此,许多DBA使用FULLSCAN手动构建统计数据,以获得100%的采样率。

    统计数据在任何一种方式都需要相同的存储空间,因此除了维护计划所需的额外时间之外,确实没有任何缺点。在我目前的项目中,我们有几种情况,统计数据的默认采样率不够,并且仍会产生错误的计划。所以我们每隔几周就会定期用FULLSCAN更新所有统计数据,以确保性能保持最佳状态。