2016-11-24 65 views
1

我有一个大的数据库表(> 300'000记录),我想根据一个参数查询字段,而加入如下:火鸟SQL查询优化

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD IS DISTINCT FROM 1; 

我已经在表上创建一个索引WRT IS_NOT_TO_LOAD场:

CREATE ASC INDEX "IND_MY_TABLE_IS_NOT_TO_LOAD" ON "MY_TABLE" ("IS_NOT_TO_LOAD"); 

我不是很熟悉的执行计划,但是我希望查询使用索引的计划,而不是自然的执行计划。

我在这里做错了什么,或者有没有更好的方法来优化我的查询?

UPDATE 我发现,使用下面的查询:

SELECT F1, F2, ..., IS_NOT_TO_LOAD FROM MY_TABLE WHERE IS_NOT_TO_LOAD < 1; 

使用计划PLAN (A INDEX (IND_MY_TABLE_IS_NOT_TO_LOAD)),但我没有用这个,因为我有时有0或空值,有时0

+0

什么'IS_NOT_TO_LOAD为空或IS_NOT_TO_LOAD <> 1'给?请注意,这听起来像一个低选择性的列,所以这可能是Firebird不喜欢使用索引的原因。 –

+0

@MarkRotteveel它是一样的 - 它使用自然计划... – neggenbe

回答

1

只有在WHERE子句可以使用主键或索引(WHERE中的字段必须存在于INDEX中)时,查询才可以快速。您没有这种情况,因此Firebird必须从表中读取所有记录以确定哪些符合WHERE子句。 我建议从你的问题中使用索引,但首先确保你没有IS_NOT_TO_LOAD = null(现在和未来)。