一位同事要求我查看一些表的索引,因为他的查询运行时间很长。一个多小时。
select count(1)
from databaseA.dbo.table1
inner join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)
注意不同的数据库。这是从 DatabaseB 运行的
表 1 和表 2 的记录长度超过 200 万条。 Table3有十几条记录。
我查看了查询计划,优化器决定对表 1 和表 2 进行嵌套循环索引查找,并以表 3 作为驱动表!
我的第一个假设是表 1 和表 2 上的统计数据严重困惑,但在更新统计数据之前,我尝试添加连接提示:
select count(1)
from databaseA.dbo.table1
inner HASH join databaseA.dbo.table2 on (table1.key = table2.key)
inner join databaseB.dbo.table3 on (table1.key = table3.key)
15 秒内返回结果。
由于时间有限,我将结果传回给他,但我担心这可能会导致以后出现问题。
我应该重新审视统计问题并以这种方式解决问题吗?错误的查询计划是否是由于连接来自单独的数据库而导致的?
有人可以根据您的经验向我提供一些想法吗?
最佳答案
我首先怀疑统计数据。
您无疑知道,在 99% 的情况下应避免加入提示,并且仅在您有证据证明绝对需要时才使用。
关于sql - 这个连接提示危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402077/