使用多个NOT IN值优化基本SELECT查询

时间:2016-04-05 14:45:33

标签: sql optimization firebird2.5

这是创建基本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上的索引。但是从那里......

  1. 例如,NOT IN子句中包含的数字可以是1到1000。
  2. 问题:

    1. WHERE子句中的其他值是否可以通过消除不应该在响应中的内容来帮助数据库更快地执行查询,还是仅仅需要额外的工作来检查其他值的依据?
    2. 理论上,NOT IN子句中有数百个ID值会被认为是错误的,而且价格昂贵。设计?
    3. 我使用的是Firebird 2.5。

1 个答案:

答案 0 :(得分:2)

db查询优化器将使用最佳索引来过滤最多行。

所以你应该先使用aproach并添加:

  • col0,col1和col2的单独索引
  • 两者的综合指数(col0,col1,col2)

所以想象你有1000行,但只有10行col1优化器将使用NOT IN索引来过滤990行,使查询的其余部分更快。

您也可以将这些值保存在单独的表tblFilter

中,而不是使用SELECT id FROM table T1 LEFT JOIN tblFilter T2 ON T2.col0 = T2.col0 WHERE T2.col0 IS NULL
UIView