>>Конкретный пример
>>SELECT id FROM tab WHERE field1
>><= X and X <=
>>field2 ORDER BY field2-field1 LIMIT
>>1;
>
>field1 и field2 не timestamp ?
Нет, bigint до этого int были.
>Самый критичный блок в твоем
>запросе "ORDER BY field2-field1", тормозит
Нет, выборка целиком не более 10 записей. Без order by тормозит так же. Причем странно, если написать поиск по одному полю
WHERE X >= field1, то запрос выполняется моментально. Если же WHERE X BETWEEN field1 AND field2, то более секунды...
>Как построены индексы по field2
>и field1 ?
>
>CREATE INDEX "idx_1" on "tab" USING
>btree ( "field1", "field2");
>
>или по отдельности ?
Пробовал всяко. В итоге с отдельными индексами чуть быстрее, чем вообще без индексов и время запроса меняется. Ничего, я машину на сутки поставил, она мне статистику сделала.
А теперь самое интересное. Нужно ввести в базу из текстового файла около 600000 записей и потом проверить на диапазон 57000 значений X. Одну и ту же задачу я решил покрутить на разных серверах (тачка RH7.2, Athlon 1ГГц) и вот что получилось:
Postgresql:
insert (без индексов): 8 мин.
insert (с индексами но в отдельной транзакции): 6ч 23 мин
select: 23ч 48мин
select count(*): 1 сек
delete: 55 сек
Mysql:
insert (без индексов): 3.5 мин.
insert (с индексами но в отдельной транзакции): 4 мин
select: 20ч 32мин
select count(*): 0 сек
delete: 0 сек
microsoft sql 7.0 (на тачке с NT Pentium III 766):
insert (без индексов): 1ч 34 мин.
insert (с индексами но в отдельной транзакции): 1ч 35 мин
select: 11ч 12мин (как ни странно, самый быстрый по выборкам!)
select count(*): 3 сек
delete: 53 мин. (а здесь я не понимаю что такого сложного было)
firebird (interbase 6.1)
Начну с того, что заставить его работать было сложнее, чем другие. Жутко неудобный, хотя с большими возможностями. Синтаксис SQL сильно отличается, нет возможности сортировки по выражениям.
insert (без индексов): 25 мин.
insert (с индексами но в отдельной транзакции): 26 мин, но как-то странно подвис на завершающем commit, хотя в базу все внес.
select: 32ч 12мин (самый тормозной на выборках!!!)
select count(*): 8 сек
delete: 31 сек