powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / timestamp between const and const
11 сообщений из 11, страница 1 из 1
timestamp between const and const
    #33669012
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с полем f_date (timestamp). Есть индекс по этому полю
(btree, различных значений в столбце - десятки тысяч). Но при попытке
выполнить запрос типа
Код: plaintext
1.
2.
select * from mytable t where t.f_date between '2005-01-01 00:00:00' and 
'2006-02-01 00:00:00.000'
индекс почему-то не подхватывается и все идет через seq scan. Vacuum
analyze тоже не помогает. Если кто-то с подобным сталкивался - ткните
пожалуйста носом в решение или хотя бы в описание причины такого поведения.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669064
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=235004&hl=interval
посмотрите топик, авось прояснит ситуацию.
Код: plaintext
1.
select * from mytable t where t.f_date between '2005-01-01 00:00:00'::interval and '2006-02-01 00:00:00.000'::interval
это вас не спасёт?
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669289
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите explain analyze
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669292
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatпокажите explain analyze

Код: plaintext
1.
2.
3.
4.
explain analyze
SELECT *
FROM test.events_new e
WHERE e.date between '2006-01-01 00:00:00.000' and '2006-02-01 00:00:00.000'

Код: plaintext
1.
2.
3.
4.
QUERY PLAN
Seq Scan on events_new e  (cost= 0 . 00 .. 165271 . 65  rows= 2351735  width= 116 ) (actual time= 0 . 045 .. 37439 . 793  rows= 2429203  loops= 1 )
  Filter: ((date >= '2006-01-01 00:00:00'::timestamp without time zone) AND (date <= '2006-02-01 00:00:00'::timestamp without time zone))
Total runtime:  39366 . 427  ms
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669294
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niemi
это вас не спасёт?

Возможно спасло бы, но не хочет мой postgres 7.4.2 кастить строку с датой к interval'у. :(

Код: plaintext
1.
2.
3.
SELECT *
FROM test.events_new e
WHERE e.date between '2006-01-01 00:00:00.000'::interval and '2006-02-01 00:00:00.000'::interval

ERROR: invalid input syntax for type interval: "2006-01-01 00:00:00.000"
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669388
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будьте добры, покажите как создавали индекс по полю f_date.
...
Рейтинг: 0 / 0
timestamp between const and const
    #33669425
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiemiБудьте добры, покажите как создавали индекс по полю f_date.

Код: plaintext
1.
2.
3.
CREATE INDEX idx_events_date
  ON test.events_new
  USING btree ("date");

Неправильно?
...
Рейтинг: 0 / 0
timestamp between const and const
    #33670341
victor_kr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
План выполнения может еще зависить от количества записей, которые будут возвращены запросом. Если результат включает в себя большую часть таблицы, то индекс может и не использоваться. Можно, для проверки, попробовать изменить значения констант, чтобы результат включал мало записей и посмотреть, будет-ли использоваться индекс.
...
Рейтинг: 0 / 0
timestamp between const and const
    #33670342
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fynda
Код: plaintext
1.
2.
3.
SELECT *
FROM test.events_new e
WHERE e.date between '2006-01-01 00:00:00.000'::interval and '2006-02-01 00:00:00.000'::interval

ERROR: invalid input syntax for type interval: "2006-01-01 00:00:00.000"
И это правильно. Не путайтесь с интервалом, это сыршенно ублюдочный тип (должен представлять собой разницу дат, но не представляет, ибо для этого интервал обязан быть порядкозависимым функционалом, т.е. массивом упорядоченных относительных приращений, а не вектором из независимых величин), к тому же и дата в интервал не кастится. кастьте в свой timestamp/timestamptz
SELECT '2006-01-01 00:00:00.000'::timestamp
...
Рейтинг: 0 / 0
timestamp between const and const
    #33670415
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fyndaSeq Scan on events_new ... rows=2351735 ... actual rows=2429203 victor_krПлан выполнения может еще зависить от количества записей, которые будут возвращены запросом. Если результат включает в себя большую часть таблицы, то индекс может и не использоваться.Да, постгрес предполагает, что этот запрос вернет много строк (rows) и оказывается прав (actual rows). В этом случае, возможно, seqscan действительно окажется быстрее чем indexscan.

Попробуйте "set enable_seqscan to off" и затем "explain analyze ...".
...
Рейтинг: 0 / 0
timestamp between const and const
    #33672391
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, потому, что поле у вас типа timestamp, а по плану видно, что он сравнивается с типом timestamptz (timestamp with time zone). Попробуйте привести не к ::interval а к ::timestamp

======================
- Я подхожу к клетке с медведем панда...
Видите, какие у него черные круги под глазами?!
Медведь панда как бы всем своим видом говорит нам: "Не бухайте!"
======================
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / timestamp between const and const
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]