2008-09-18 61 views
4

查询优化器估计,当实际行数为2000时,连接的结果只有一行。这会导致数据集的后续连接的估计结果为一行,其中有些行高达30,000。SQL Server post-join rowcount低估

计数为1时,QO为许多连接选择循环连接/索引搜索策略,这些连接速度太慢。我通过将可能的加入策略与WITH OPTION (HASH JOIN, MERGE JOIN)约束在一起解决了该问题,从而将总体执行时间从60+分钟提高到了12秒。不过,我认为QO由于行数不佳而仍然产生不太理想的计划。我不想手动指定连接顺序和详细信息 - 有太多的查询会影响它,因为它是值得的。

这是在Microsoft SQL Server 2000中,具有多个表选择的中等查询连接到主选择。

我认为QO可能高估了连接许多方面的基数,期望表之间的连接列具有较少的共同行。

在联接之前扫描索引的估计行数是准确的,它只是某些联接后的估计行数太低。

数据库中所有表的统计信息均为最新并自动刷新。

早期的不良联结之一是在所有人共有的信息通用的'人'表和大约5%的所有人属于的专业人员表之间。两个表(和连接列)中的聚集PK都是一个INT。数据库高度规范化。

我认为,问题的根源是坏的行数估计一定加入后,所以我的主要问题是:

  • 我怎样才能解决QO的职位加入行数估计是多少?
  • 有没有一种方法可以提示连接将会有很多行,而无需手动指定整个连接顺序?

回答

3

尽管统计信息是最新的,但扫描百分比并不足以提供准确的信息。我在每个有问题的基表上通过扫描所有行来更新表上的所有统计信息,而不仅仅是默认百分比。

UPDATE STATISTICS <table> WITH FULLSCAN, ALL 

查询还是有很多循环的连接,但连接顺序是不同的,在2-3秒内运行。

0

你不能用恰当的查询提示来刺激QO吗?

+0

你能更具体吗?你知道行数的提示吗?我有一个WITH OPTION(MERGE JOIN,HASH JOIN)提示,但我想要更精确的东西。 – 2008-09-18 15:05:33