У меня странная проблема с моей работой с sql-запросами. Когда я пользуюсь оператором = в ВЗАИМОДЕЙШИЙ ПРИСОЕДИНЕНИЕ запрос занимает около 30,514 минут, но в случае с < И> занимает всего 1,1717 секунд. Это по запросу:SQLITE Operatros "=" comapare с "< AND >" Разница в производительности
-- data_filehash.size>4095 AND data_filehash.size<4097 || 1.717 seconds
SELECT files.*, data_filehash.*
FROM v_filesp AS files
LEFT JOIN data_filehash ON files.id = data_filehash.file AND data_filehash.size>4095 AND data_filehash.size<4097
WHERE data_filehash.file IS NULL
-- data_filehash.size=4096 || 30.515 minutes
SELECT files.*, data_filehash.*
FROM v_filesp AS files
LEFT JOIN data_filehash ON files.id = data_filehash.file AND data_filehash.size=4096
WHERE data_filehash.file IS NULL
Результаты всегда такие же (33016 записей в моей базе); v_filep - вид; У меня есть индексы на data_filehash.size, data_filehash.file и первичный ключ на файлах (v_filesp) .id;
Я думаю, что это не нормально. Может быть, мне нужно что-то настроить, или я этого не понимаю.
Есть EXPLAIN план запроса для обоих запросов:
запрос Жека = (медленнее)
SEARCH TABLE files USING INDEX files_c_dup (c_dup=?)
SEARCH TABLE dirs USING INTEGER PRIMARY KEY (rowid=?)
SEARCH TABLE data_filehash USING INDEX index_size (size=?)
запрос с < И> (быстрее)
SEARCH TABLE files USING INDEX files_c_dup (c_dup=?)
SEARCH TABLE dirs USING INTEGER PRIMARY KEY (rowid=?)
SEARCH TABLE data_filehash USING INDEX index_file (file=?)
Последняя шаги разные, но что это значит. Как сказать db, что она должна использовать лучший алгоритм secend в первом запросе?
Показать [EXPLAIN PLAN ЗАПРОСА] (http://www.sqlite.org/eqp.html) выход для обоих запросов. –
Можете ли вы опубликовать схему для таблицы? имеет ли размер индекс? – chugadie