我们有一个使用JET数据库引擎针对Access数据库运行的SQL查询。不幸的是,我们无法创建任何存储过程或移动到SQL Server,这将是我的偏好。 [捂脸]。
问题是查询非常慢。处理请求大约需要2分钟,我们必须在4个不同的表上执行此操作,因此需要8分钟的处理时间。当我们独立运行每个select语句时,它们将花费1-2秒。当我们将它们放在一起并使用它减慢的EXISTS子句时。我们有一个带有两个表的数据库,第一个表大约有3000行,第二个表大约有5000行。我们想要选择第一个表中另一个表的字符串中存在值(FieldName)的所有行。我们不需要第二个表中的任何字段,只知道FieldName存在于VBScript列的某个位置。我相信这是写的方式,它针对每一行(3000 * 5000)对整个第二个表执行查询。无论如何都要更改此查询,以便不执行那么多查找?
SELECT A1.*
FROM
(SELECT *
FROM tblEncompasstoCB CB
WHERE ((NOT CB.VBScript IS NULL) AND (CB.VBScript <> ''))) AS A1
WHERE
EXISTS (SELECT * FROM tblMapping
WHERE (tblMapping.VBScript <> '')
AND (InStr(tblMapping.VBScript, IIF(INSTR(A1.FieldName, '~') > 0, MID(A1.FieldName, 1, INSTR(A1.FieldName, '~') - 1), A1.FieldName)) > 0))
OR
EXISTS (SELECT * FROM tblCustomMapping
WHERE (tblCustomMapping.VBScript <> '')
AND (InStr(tblCustomMapping.VBScript, IIF(INSTR(A1.FieldName, '~') > 0, MID(A1.FieldName, 1, INSTR(A1.FieldName, '~') - 1), A1.FieldName)) > 0))
存在时仅使用SELECT TOP 1