[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: По-разному выполняются запросы на разных серверах
sergeiss
Надо чистить данные на сервере, но запросы выполняются чрезвычайно долго. Полез анализировать и получил следующую шнягу.

Вот есть такой запрос:
explain delete from stat_eri_form where (h<24 and date_ < '2010-09-01' and cellid <> -1) returning *

Запускаю на основном сервере с данными, получаю такую хрень:

Цитата
"Seq Scan on stat_eri_form  (cost=0.00..1154560.36 rows=10386350 width=6)"
"  Filter: ((h < 24) AND (date_ < '2010-09-01'::date) AND (cellid <> (-1)))"

То есть, индексы не используются.

Но если запускаю на ноуте, то получаю более понятный ответ!
Цитата
"Index Scan using eri_form on stat_eri_form  (cost=0.00..8.51 rows=1 width=6)"
"  Index Cond: ((date_ < '2010-09-01'::date) AND (h < 24))"
"  Filter: (cellid <> (-1))"

В данном случае индексы будут использоваться.

Описания таблиц и индексов, естественно, одинаковое. Разница только в общем количестве данных в таблицах (на ноуте 806840, на сервере 22301040).
Версия сервера Постгре 8.4. Не помню - может быть, следующая цифра в версии отличается.

Вопрос: какие у кого есть разумные версии происходящего?



Спустя 39 минут, 3 секунды (11.02.2011 - 13:29) linker написал(а):
Разные настройки постгри или версии.

Спустя 58 минут, 24 секунды (11.02.2011 - 14:28) sergeiss написал(а):
Такие общие предположения и у меня тоже есть smile.gif Вот только что-то я не припомню, чтобы какие-то настройки запрещали использовать индексы.

Кстати!!! Такая же проблема еще с 2-мя десятками таблиц. В одной БД, на ноуте, индексы учитываются. А на сервере - нет. Но для других таблиц EXPLAIN показывает, что индексы учитываются... Что за хрень такая???

Спустя 8 минут, 49 секунд (11.02.2011 - 14:36) linker написал(а):
Ну не знаю, попробуй OPTIMIZE TABLE, ANALYZE TABLE, если конечно такое есть в постгре.

Спустя 4 дня, 24 минуты, 34 секунды (15.02.2011 - 15:01) sergeiss написал(а):
Долго "втыкал" и пришел к тому, что сам Постгре определяет, надо ли ему использовать индексы в определенных запросах. Как он это делает - ХЗ. Но делает, зараза :) Хотя, возможно, в итоге на самом деле будет быстрее? Только странно это...

Вот что получил на одном и том же сервере, на одной таблице. Вся разница только в знаке сравнения даты. Запрос подготовлен 15 февраля (возможно, что это существенно???), данные в таблице есть с 25 января по 14 февраля включительно. Взята самая большая (по количеству записей) таблица, около 140 млн. строк.

explain
select * from block_181 where date_ >= '2011-02-07'

"Index Scan using date_only_181 on block_181 (cost=0.00..2547059.23 rows=47061945 width=20)"
" Index Cond: (date_ >= '2011-02-07'::date)"


explain
select * from block_181 where date_ <= '2011-02-07'

"Seq Scan on block_181 (cost=0.00..4652132.15 rows=112683813 width=20)"
" Filter: (date_ <= '2011-02-07'::date)"


PS. Уже написал и понял, что не проверил последний вариант, просто "больше 6 февраля". Получил следующее:
Цитата
explain
select * from block_181 where date_ > '2011-02-06'

"Index Scan using date_only_181 on block_181  (cost=0.00..2547059.23 rows=47061945 width=20)"
"  Index Cond: (date_ > '2011-02-06'::date)"

А тут использует индексы...

Спустя 1 минута, 39 секунд (15.02.2011 - 15:03) linker написал(а):
MySQL в запросе можно явно указывать какие индексы использовать.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.