Firebird sql查询优化

Firebird sql查询优化,sql,query-optimization,firebird,firebird2.5,Sql,Query Optimization,Firebird,Firebird2.5,我有一个很大的DB表(>300000条记录),我想根据一个参数查询字段,而不使用连接,如下所示: SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD IS DISTINCT FROM 1; 我已经在表w.r.t.IS\u NOT\u TO\u LOAD字段上创建了一个索引: CREATE ASC INDEX "IND_MY_TABLE_IS_NOT_TO_LOAD" ON "MY_TABLE" ("IS_N

我有一个很大的DB表(>300000条记录),我想根据一个参数查询字段,而不使用连接,如下所示:

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD IS DISTINCT FROM 1;
我已经在表w.r.t.
IS\u NOT\u TO\u LOAD
字段上创建了一个索引:

CREATE ASC INDEX "IND_MY_TABLE_IS_NOT_TO_LOAD" ON "MY_TABLE" ("IS_NOT_TO_LOAD");
我不太熟悉执行计划,但我希望查询使用索引计划,而不是自然执行计划

我是做错了什么,还是有更好的方法来优化我的查询

更新 我发现使用以下查询:

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD < 1;
从“我的”表格中选择F1、F2、…、IS_NOT_TO_LOAD,其中IS_NOT_TO_LOAD<1;

使用计划
计划(索引(IND_MY_TABLE_不是要加载的))
,但我没有使用它,因为我有时有0或null值,有时只有当WHERE子句可以使用主键或索引(WHERE中的字段必须存在于索引中)时,0

查询才能快速进行。您并没有这种情况,所以Firebird必须读取表中的所有记录,以确定哪个符合WHERE子句。
我建议使用您问题中的索引,但首先确保您没有IS_not_TO_LOAD=null(现在和将来)

IS NOT TO LOAD为空或IS NOT TO LOAD 1
给出了什么?请注意,这听起来像是一个低选择性的列,因此这可能是Firebird不喜欢使用索引的原因。@MarkRotterVeel它是一样的-它使用自然计划。。。