c# - 防止使用 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))
解决方案
仅使用 SELECT TOP 1 in exists
推荐阅读
- java - 在每个 JPA 事务中自动调用方法
- f# - 字典列表与字典序列
- centos7 - 在 CentOS 7 上使用 systemctl 创建服务
- keystonejs - 如何将 KeystoneJs 与 Sentry.io 集成
- python - logits 和标签必须是可广播的:logits_size=[32,1] labels_size=[16,1]
- angular - 根据元素的值切换“mat-cell”的内容
- visual-studio-2015 - NuGet 包管理器无法加载服务索引
- javascript - 将字符串编码为 ISO-8859-1
- c# - C# Linq 查询以查找以另一个数组中的字符串结尾的数组中的字符串
- sql - 多个条件的 SQL Server 计数