sql - 这个连接提示危险吗?

标签 sql join sql-server-2000 join-hints

一位同事要求我查看一些表的索引,因为他的查询运行时间很长。一个多小时。

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/

相关文章:

sql - Oracle SQL 查询仅在一个进程中失败 : "ORA-01405: fetched column value is NULL"

sql - SQL Server 中的索引查找与索引扫描

mysql - 优化对同一个表 MySQL 的多个连接

mysql - 根据当前id连接两个表

t-sql - 针对 INFORMATION_SCHEMA 的查询超时

Java Mysql删除日期之间的记录语法错误

mysql - SQLException : You can't specify target table 'p' for update in FROM clause

mysql - 连接表时需要更快的 FIND_IN_SET 替代方案

sql - 如何将表的数据导出到 INSERT 语句中?

sql - 相关查询 : select where condition not max(condition in inner query)