【发布时间】:2009-08-30 02:17:20
【问题描述】:
我对下面详述的 SQL 语句有疑问。该查询返回我需要的结果,但执行需要大量时间。我现在在数据库中有很多记录,页面通常不会加载。
SELECT dscan.guid, dscan.drive, dscan.folder, dscan.filename, source.guid
FROM source
RIGHT JOIN dscan ON (
(source.guid & '_dtr' = dscan.guid OR source.guid & '_dto' = dscan.guid OR source.guid = dscan.guid)
AND dscan.guid LIKE '%" & Replace(strSearch_guid, "'", "''") & "%'
AND dscan.filename NOT LIKE '.[_]%'
AND dscan.drive = 'Z:')
WHERE source.guid Is Null
ORDER BY dscan.drive, dscan.guid
根据我在网上找到的信息,JOIN 语句中的 OR 是一个问题,但我不知道如何解决这个问题。
我将数据库记录与文件名进行比较以识别错误 - 但文件名有时具有我必须考虑的“_dtr”或“_dto”附加信息。
【问题讨论】:
-
您确定问题出在
ORs 上吗?如果你把它减少到只有一个测试,它运行得很快吗?另外:这些表上定义了哪些索引? -
什么数据库和版本?
-
我很肯定 OR 是问题所在。如果我删除它们,SQL 执行得非常快。 source.guid 已编入索引,但 dscan.guid 未编入索引(此表受到相当频繁的大规模更新)。我曾尝试索引它,但它没有任何区别。从我在别处读到的内容来看,连接中的 OR 将导致索引被忽略。 DB 是 MS Access。
标签: sql performance join