kms писал(а) 29. Октября 2007 :: 17:21:orefkov писал(а) 29. Октября 2007 :: 17:15:kms писал(а) 29. Октября 2007 :: 16:10:orefkov
Условие "!=" теперь возвращает верный результат.
Но по-прежнему не использует индекс.
Ты не считаешь, что индекс должен использоваться?
"!=" неможет использовать индекс, смысла нет.
имхо для неуникальных неселективных индексов может и имело бы смысл оптимизация в виде "<" OR ">".
ну ладно, фиг с ним, по-существу согласен.
Тут вот в чем затык.
Я уже кидал сцылку
http://www.sqlite.org/optoverview.htmlОптимизатор SQLite так построен, что пытается подобрать такой индекс, чтобы сделать по таблице один проход, и соответственно, пасует перед OR. Ему нужно только AND. Не спорю, что в неких частных случаях можно было бы для каждого из OR сделать по одному проходу по таблице, однако в общем случае это невозможно, так как эти несколько проходов могут "пересечся" по одним записям, и придется еще исключать дублирующиеся записи, что может перевесить выгоду от нескольких проходов по таблице.
Короче, когда SQLite передает в мой модуль ограничения по полям, то ограничения "!=" даже не передаются.
Также следует обратить внимание, что при выполнении запроса ограничения по полям, попадающим в индекс, SQLite не проверяет, так как я ему гарантирую, что они выполняются. Условия же по полям, не попавшим в индекс, он проверяет сам. При этом возможны расхождения между тем, как поля сравниваю я, и как SQLite.
Я сейчас как раз над этим эксперементирую. Возможно, сделаю так, что все условия по полям таблицы, как попадающими в индекс, так и не попадающие, буду проверять сам.