使用多个 NOT IN 值优化基本 SELECT 查询
Optimizing basic SELECT query with multiple NOT IN values
创建基本 SELECT 查询的成本效益更高的方法。
选项一:
SELECT id
FROM table
WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...)
AND COL1 >= 20
AND COL2 <= 10
AND .... ;
或选项二:
SELECT id FROM table WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...);
COL0 是 FK 列。
首先需要做的是在 COL0 上建立索引。但是从那里..
- 例如,NOT IN 子句中包含的数字可以是 1 到 1000。
问题:
- WHERE 子句中的附加值是否会通过消除不应该出现在响应中的内容来帮助数据库更快地执行查询,或者只是检查是否符合附加值的额外工作?
- 理论上在 NOT IN 子句中有数百个 ID 值会被认为是错误的 "expensive" 设计?
我正在使用 Firebird 2.5。
数据库查询优化器将使用最佳索引来过滤最多行数。
所以你应该使用第一个方法并添加:
- col0、col1 和 col2 的单独索引
- 两者的综合索引(col0、col1、col2)
假设您有 1000 行,但只有 10 行 > 20
优化器将使用 col1
索引过滤掉 990 行,从而使其余查询更快。
此外,您可以将这些值保存在单独的 table tblFilter
中,而不是使用 NOT IN
SELECT id
FROM table T1
LEFT JOIN tblFilter T2
ON T2.col0 = T2.col0
WHERE T2.col0 IS NULL
创建基本 SELECT 查询的成本效益更高的方法。 选项一:
SELECT id
FROM table
WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...)
AND COL1 >= 20
AND COL2 <= 10
AND .... ;
或选项二:
SELECT id FROM table WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...);
COL0 是 FK 列。
首先需要做的是在 COL0 上建立索引。但是从那里..
- 例如,NOT IN 子句中包含的数字可以是 1 到 1000。
问题:
- WHERE 子句中的附加值是否会通过消除不应该出现在响应中的内容来帮助数据库更快地执行查询,或者只是检查是否符合附加值的额外工作?
- 理论上在 NOT IN 子句中有数百个 ID 值会被认为是错误的 "expensive" 设计?
我正在使用 Firebird 2.5。
数据库查询优化器将使用最佳索引来过滤最多行数。
所以你应该使用第一个方法并添加:
- col0、col1 和 col2 的单独索引
- 两者的综合索引(col0、col1、col2)
假设您有 1000 行,但只有 10 行 > 20
优化器将使用 col1
索引过滤掉 990 行,从而使其余查询更快。
此外,您可以将这些值保存在单独的 table tblFilter
NOT IN
SELECT id
FROM table T1
LEFT JOIN tblFilter T2
ON T2.col0 = T2.col0
WHERE T2.col0 IS NULL