在几个潜在条件下匹配的查询:正确的设计?

时间:2012-05-03 20:21:27

标签: sql sql-server sql-server-2008 query-optimization

我正在进行查询,以查找与历史条目表中的记录匹配的新条目表中的记录,其中匹配可以在许多字段之一上。换句话说:

“显示所有记录,其中current.id = archive.id或current.name = archive.name或current.address = archive.address”

此查询的SQL如下:

SELECT current.id, current.name, current.address FROM current
INNER JOIN archive
ON
    current.id = archive.id OR
    current.name = archive.name OR
    current.address = archive.address

当我运行它时,它需要FOREVER,这是第一次加载数据;存档将始终有大约300,000条记录,但当前将在500到40,000之间波动。

有没有更好的方法来编写此查询?或者,我的查询是否可靠,但我的基础数据库可能有问题?

1 个答案:

答案 0 :(得分:4)

在每个表中的3个字段上创建索引可能会有所帮助(特别是在存档表中,如果它非常大),但请尝试这样做:

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.id = archive.id

UNION

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.name = archive.name

UNION 

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.address = archive.address

此查询允许您单独索引字段(您仍应该这样做),从而导致索引可能更小,整体性能更佳。

在连接条件中使用OR可能会使查询优化器陷入困境,可能会使其处于次优状态。 UNION是昂贵的,但更有可能的是您的查询时间花在了联接上,并且简化这可能会有很大帮助。