Sql 符合几个潜在条件的查询:正确的设计?

Sql 符合几个潜在条件的查询:正确的设计?,sql,sql-server,sql-server-2008,query-optimization,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或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
当我运行它时,它会花费很长时间,这是第一次加载数据;归档文件中总有大约300000条记录,但当前的记录在500到40000条之间波动


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

在每个表中有问题的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的in-join条件确实会使查询优化器陷入混乱,可能会使它做一些不太理想的事情。
UNION
s很昂贵,但很可能您的查询时间花在了连接上,简化连接可能会有很大帮助。

在每个表中有问题的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的in-join条件确实会使查询优化器陷入混乱,可能会使它做一些不太理想的事情。
UNION
s非常昂贵,但很可能您的查询时间花在了连接上,简化连接可能会有很大帮助。

您可能还希望使用UNION ALL,以便SQL Server不必在UNION步骤中过滤出重复项。你总是可以在事后过滤掉重复。问题:是否应该使用“where exists”而不是内部连接帮助?由于未检索到存档中的任何值。。。还是同一个执行计划?@RaphaëlAlthaus你是指一系列的
存在的地方
像我的回答一样联合在一起,还是一个
存在的地方
条件?如果是前者,它的性能应该与我的答案相同。如果是后者,我希望它会像OP一样缓慢。联合解决方案成功了;从26分钟缩短到1秒。这些小东西能带来多大的不同,真是令人惊讶,不是吗?您可能还想使用UNION ALL,这样SQL Server就不必在UNION步骤中过滤重复项。你总是可以在事后过滤掉重复。问题:是否应该使用“where exists”而不是内部连接帮助?由于未检索到存档中的任何值。。。还是同一个执行计划?@RaphaëlAlthaus你是指一系列的
存在的地方
像我的回答一样联合在一起,还是一个
存在的地方
条件?如果是前者,它的性能应该与我的答案相同。如果是后者,我希望它会像OP一样缓慢。联合解决方案成功了;26分钟减到1秒。这些小东西能带来多大的不同,真是令人惊讶,不是吗?