首页 > 解决方案 > 防止使用 Exists 条件的 Select 查询每次重新评估

问题描述

我们有一个使用 JET db 引擎对 Access DB 运行的 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))

标签: c#sqldatabasems-accessjet

解决方案


仅使用 SELECT TOP 1 in exists


推荐阅读