我正在重写一个旧的遗留系统。它有一个名为checkExisting()
. 旧系统使用查询从 MSSQL 数据库中提取对象,如下所示(使用 ADO DB):
SELECT ObjectId, Name.....
FROM tblRegisteredIncludes
WHERE UPPER("Name") IN ('PROGA.H', 'PROGB.H'............... list)
有很多类似的表,tblRegisteredIncludes
但是 SQL 是按表名分组的,并且使用带有对象名称列表的 IN 子句。
这执行得很快,因为 SQL Server 在一次扫描中收集了所有对象,并且Name
在表中的列上有一个索引。
但是,在新系统中,我不能使用相同的 SQL,因为WHERE
条件更复杂。它还使用 Source 字段,有时还使用条件中的其他字段。我有大量的单个 SQL 查询:
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
我已将tblRegisteredIncludes
表中的 Name-Index 替换为(Name,Source)
.
即使如此,我也预计 SQL 的总执行速度会慢一些,但不会超过 15-20%。相反,它要慢得多,有时甚至高达 100%。我尝试使用 UNION ALL 将 SQL 组合在一个大型 SQL 查询中:
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
UNION ALL
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
然后稍后处理生成的 ADO DB 记录集,但速度更慢!
我需要知道是否有一些有效的方法可以更快地执行这些查询?在使用 IN 子句和名称列表时,我需要达到与旧案例类似的性能。我可以提供执行计划。