我有一个 SQL 脚本,它针对各种条件查看 30-40 个“代码”,并从大约 3000 万行的大型 2 表(在 PK 上加入)源中找到匹配的记录。脚本完成后,我最终得到了一个近 8 亿多万的查找表。记录(2500 万 * ~35 个代码)。
每个代码都有自己的选择语句。他们中的大多数人都在寻找相同的来源,只是使用了不同的条件。一些代码的查询加入了一个额外的源表来获取lookup_value。
例如:
INSERT INTO LookupTable
SELECT 01 AS code, t1.lookup_value, t1.PK, t2.PK
FROM Table1 t1
JOIN Table2 t2 ON t1.FK = t2.PK
WHERE <code 1 condition> = true
INSERT INTO LookupTable
SELECT 02 AS code, t1.lookup_value, t1.PK, t2.PK
FROM Table1 t1
JOIN Table2 t2 ON t1.FK = t2.PK
WHERE <code 2 condition> = true
INSERT INTO LookupTable
SELECT 03 AS code, CASE WHEN t1.lookup_value IN 'A1','B1','C1' THEN 1 ELSE 0 END, t1.PK, t2.PK
FROM Table1 t1
JOIN Table2 t2 ON t1.FK = t2.PK
WHERE <code 3 condition> = true
INSERT INTO LookupTable
SELECT 04 AS code, CASE WHEN t3.lookup_value IN 'A1','B1','C1' THEN 1 ELSE 0 END, t1.PK, t2.PK
FROM Table1 t1
JOIN Table2 t2 ON t1.FK = t2.PK
JOIN Table3 t3 ON t1.FK = t3.PK
WHERE <code 4 condition> = true
-- ... <continues 30 more times>
(有些代码还有多查询语句、临时表等,但如果我能处理好上面的,我可以自己解决。)
就目前而言,该脚本需要大约 6 个小时才能在功能强大的服务器上运行。这是一个预先存在的系统,我没有重新设计它的工作方式的选项;需要巨大的查找表。
我不禁想到,扫描通过同样的 30 百万。行,30 多次是一种低效的方法!对更好的性能或至少更易于管理的代码有什么想法吗?
我一直在考虑创建 .Net CLR TVF 或索引视图,但我对新想法持开放态度!