Range поиск по двум полям

mwolf
Дата: 06.09.2004 20:04:15
С подобной проблемой, наверняка, сталкивались, поэтому хотелось бы услышать ваши советы.
Есть таблица
CREATE TABLE public.blocks
(
  loc_id int8 NOT NULLб
  start_ip_num int8,
  end_ip_num int8
) WITHOUT OIDS;
В ней прописаны соответствия диапазона ИП некоторой местности. Содержит около 2-х миллионов записей.

Меня интересует оптимизация вот такого запроса
select l.*
from locations l, blocks b
where
  l.loc_id=b.loc_id
  AND b.start_ip_num < число
  AND b.end_ip_num > число

На моём железе одну запись ищет ~1.5 сек.
В плане оптимизации по blocks идёт полное сканирование, индексы игнорируются полностью.
Как ускорить выборку?
Niemi
Дата: 06.09.2004 20:30:46
Попробуй добавить ORDER BY и посмотреть.
Sad Spirit
Дата: 06.09.2004 22:30:44
mwolf
С подобной проблемой, наверняка, сталкивались

С ней сталкиваются настолько часто, что она дажеесть в официальном FAQ (см. конец ответа).
Sad Spirit
Дата: 06.09.2004 22:32:21
...правда там не очень понятно. "число" надо привести к int8:
select l.*
from locations l, blocks b
where
  l.loc_id=b.loc_id
  AND b.start_ip_num < число::int8
  AND b.end_ip_num > число::int8
mwolf
Дата: 07.09.2004 12:59:46
Sad Spirit
...правда там не очень понятно. "число" надо привести к int8:

Мдяяя.
А я думал, что всё в этой жизни видел, но чтоб ТАКОЕЕЕЕ...
Большое спасибо за подсказку. Индексы начали использоваться, запрос выполняется за 30 мс.

То Niemi: с ORDER BY не совсем понял, это что даст?