Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select и огромное условие / 25 сообщений из 25, страница 1 из 1
20.11.2007, 17:58
    #34953031
Telta Avenger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
У меня есть обычный select:
Код: plaintext
select * from data_call
Но бывает необходимость приторочить к нему условия, чтобы отфильтровать ненужные записи.
Код: plaintext
select * from data_call where (id=100 or id=105 or id=280 or id=94)
И таких id бывает больше тысячи. Запрос нещадно тормозит. Есть ли способ убыстрить выполнение подобного запроса или заменить перечислние id чем-либо? Заранее благодарен за ответ!
...
Рейтинг: 0 / 0
20.11.2007, 18:15
    #34953140
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Where id in (100,105,280,94)

Будет ли тормозить - не знаю.
...
Рейтинг: 0 / 0
20.11.2007, 18:24
    #34953168
alex_v13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
pamir
Посмотри EXPLAIN для запроса - используется ли Bitmap Index Scan - если нет, то надо лечить, иначе на выборках IN(...) работать нормально не будет.

Проверь, разрешен ли bitmap_scan в конфиге Постгреса.
...
Рейтинг: 0 / 0
20.11.2007, 18:26
    #34953178
alex_v13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Ошибся в параметре - правильно он называется "enable_bitmapscan", должно быть "on" и раскомментировано.
...
Рейтинг: 0 / 0
20.11.2007, 18:31
    #34953198
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
alex_v13 pamir
Посмотри EXPLAIN для запроса - используется ли Bitmap Index Scan - если нет, то надо лечить, иначе на выборках IN(...) работать нормально не будет.

Проверь, разрешен ли bitmap_scan в конфиге Постгреса.Это мне? Пусть автор смотрит.
...
Рейтинг: 0 / 0
20.11.2007, 18:47
    #34953248
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Telta AvengerУ меня есть обычный select:
Код: plaintext
select * from data_call
Но бывает необходимость приторочить к нему условия, чтобы отфильтровать ненужные записи.
Код: plaintext
select * from data_call where (id=100 or id=105 or id=280 or id=94)
И таких id бывает больше тысячи. Запрос нещадно тормозит. Есть ли способ убыстрить выполнение подобного запроса или заменить перечислние id чем-либо? Заранее благодарен за ответ!
Если оно таки реально огромное, то может быть переполнение стека (у меня было).
Я вышел из положения через создание времянки, в которую вносил интересующие меня ID (их могли быть тысячи), а потом SELECT ... WHERE ID IN (SELECT id FROM tmp_table). Разницы в скорости - не ощутил. Замеры не проводил.
...
Рейтинг: 0 / 0
20.11.2007, 20:16
    #34953454
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
alex_v13 пишет:

> Посмотри EXPLAIN для запроса - используется ли Bitmap Index Scan - если
> нет, то надо лечить, иначе на выборках IN(...) работать нормально не будет.
> Проверь, разрешен ли bitmap_scan в конфиге Постгреса.

А как в Postgres с "OR optimization strategy" ?
Не умеет ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.11.2007, 09:29
    #34954037
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MasterZiv
А как в Postgres с "OR optimization strategy" ?
Не умеет ?

А что Вы под этой стратегией понимаете?
...
Рейтинг: 0 / 0
21.11.2007, 09:31
    #34954044
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Просто интересно. Если лень - не отвечайте.
Но откуда набирается тысяча условий? Пользователь набирает?
...
Рейтинг: 0 / 0
21.11.2007, 09:34
    #34954052
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MasterZiv
А как в Postgres с "OR optimization strategy" ?
Не умеет ?

Малость погуглил - кроме того что в SyBase она есть, она специальная и с ней бывают баги ничего не нашел

Так что делитесь знаниями с народом
...
Рейтинг: 0 / 0
21.11.2007, 09:41
    #34954070
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
_Андрей_МПросто интересно. Если лень - не отвечайте.
Но откуда набирается тысяча условий? Пользователь набирает?
Я не автор топика, ну да ладно ;), раскажу про себя
У меня есть достаточно сложный агрегатный запрос по которому в одну запись могут выгребаться произвольное количество других записей. В основном от 1 до 2-3к. И есть другая таблица, в которой живут форейны на эту таблицу, и когда юзверь выбирает запись из агрегированного селекта, то ему нужно показать все записи из форейновой таблички. Определять из каких именно записей собралась текущий агрегат - долго. Раньше делал на сервере в агрегате конкатенацию в строку через запятую ID, а потом клиенте добавлял эту строку в where. Потом перешел на временную таблицу.
...
Рейтинг: 0 / 0
21.11.2007, 13:16
    #34955090
alex_v13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
В моем проекте бывают выборки с размером IN(...) по 2-3 тысячи и все нормально живет. Если на порядок больше, то можно уже заморачиваться с временными таблицами.
...
Рейтинг: 0 / 0
21.11.2007, 14:58
    #34955555
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey Daeron
Если оно таки реально огромное, то может быть переполнение стека (у меня было).

Стек можно в конфиге увеличить. Архитектура приложения явно ошибочная, но размер стека не проблема.
...
Рейтинг: 0 / 0
21.11.2007, 15:36
    #34955701
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MBG Andrey Daeron
Если оно таки реально огромное, то может быть переполнение стека (у меня было).

Стек можно в конфиге увеличить. Архитектура приложения явно ошибочная, но размер стека не проблема.
Красота теряется. Кроме того начались проблемы с передачей строки на клиента.
...
Рейтинг: 0 / 0
22.11.2007, 01:20
    #34956939
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey Daeron пишет:

> А как в Postgres с "OR optimization strategy" ?
> Не умеет ?

> А что Вы под этой стратегией понимаете?

Это не только я понимаю.

select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
использовать индекс

==

select * from ATABLE where field1 = 'aa'
union
select * from ATABLE where field1 = 'bb'

-- может использовать индекс.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.11.2007, 01:21
    #34956940
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey Daeron пишет:
> - кроме того что в SyBase она есть, она специальная и с ней бывают баги

Да не только в Sybase она есть. Везде она есть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.11.2007, 09:29
    #34957215
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MasterZiv
> А что Вы под этой стратегией понимаете?

Это не только я понимаю.

А кто еще? Еще раз говорю - погуглите, термин принят только по отношению к sybase. Ни к Ораклу, ни к PG, ни к мускулю он никем не применяется.

MasterZiv
select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
использовать индекс

==

select * from ATABLE where field1 = 'aa'
union
select * from ATABLE where field1 = 'bb'


Код: plaintext
SELECT * FROM ma_data WHERE id=3 or id=50

QUERY PLAN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Bitmap Heap Scan on ma_data  (cost=9.80..17.78 rows=2 width=223) (actual time=0.139..0.139 rows=0 loops=1)
  Recheck Cond: ((id = 3) OR (id = 50))
  ->  BitmapOr  (cost=9.80..9.80 rows=2 width=0) (actual time=0.125..0.125 rows=0 loops=1)
        ->  Bitmap Index Scan on pk_ma_data  (cost=0.00..4.90 rows=1 width=0) (actual time=0.096..0.096 rows=0 loops=1)
              Index Cond: (id = 3)
        ->  Bitmap Index Scan on pk_ma_data  (cost=0.00..4.90 rows=1 width=0) (actual time=0.013..0.013 rows=0 loops=1)
              Index Cond: (id = 50)
Total runtime: 0.526 ms

Оно?
...
Рейтинг: 0 / 0
22.11.2007, 09:42
    #34957242
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MasterZiv
Andrey Daeron пишет:
> - кроме того что в SyBase она есть, она специальная и с ней бывают баги

Да не только в Sybase она есть. Везде она есть.

Если она есть везде, то чего бы её не быть в PostgreSQL???
И не совсем понятно почему
Код: plaintext
select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
не может использовать индекс.
...
Рейтинг: 0 / 0
22.11.2007, 10:26
    #34957366
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey Daeron Если она есть везде, то чего бы её не быть в PostgreSQL???
И не совсем понятно почему
Код: plaintext
select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
не может использовать индекс.Это йумор.
(МастаЗиф - известный шутник.)
...
Рейтинг: 0 / 0
22.11.2007, 10:29
    #34957376
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
ps: при использовании таблички в IN (SELECT ...) скорее всего результат будет хуже, чем при перечне IN(1,2,3...). Лучше, мне кажется, в этом случае пользовать INNER JOIN вместо IN (SELECT ...)
...
Рейтинг: 0 / 0
22.11.2007, 10:33
    #34957393
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Telta AvengerЗапрос нещадно тормозит.показывайте explain analyze

MasterZivselect * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
использовать индекспочему нельзя использовать индекс в данном запросе?

или вы имели в виде, что нет СУБД, которая это умеет?

Andrey Daeron
Код: plaintext
1.
2.
3.
4.
  ->  BitmapOr
        ->  Bitmap Index Scan
              Index Cond: (id = 3)
        ->  Bitmap Index Scan
              Index Cond: (id = 50)
Оно?кажется, что это не совсем то. вот если бы постгрес еще понял, что условия id=3 и id=50 взаимоисключающие, то смог бы сделать просто Union(IndexScan(id=3),IndexScan(id=50)) обойдясь без битмапов.
...
Рейтинг: 0 / 0
22.11.2007, 11:28
    #34957578
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
LeXa NalBat
Andrey Daeron
Код: plaintext
1.
2.
3.
4.
  ->  BitmapOr
        ->  Bitmap Index Scan
              Index Cond: (id = 3)
        ->  Bitmap Index Scan
              Index Cond: (id = 50)
Оно?кажется, что это не совсем то. вот если бы постгрес еще понял, что условия id=3 и id=50 взаимоисключающие, то смог бы сделать просто Union(IndexScan(id=3),IndexScan(id=50)) обойдясь без битмапов.
Дык он и так может это сделать, или Вы под Union понимаете простую конкатенацию (по типу UNION ALL)?

ЗЫ Растекаясь мыслью по древу - задумался, как же он может быть таким догадливым. По идее он должен смотреть на признак уникальности индекса в IndexScan() . По идее, не так и сложно. Может быть это не оптимально? Или не даёт выигрыша? Реального? (например зобанены ж всякие индексы по типу hash и т.д.)
...
Рейтинг: 0 / 0
22.11.2007, 11:44
    #34957639
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey DaeronДык он и так может это сделать, или Вы под Union понимаете простую конкатенацию (по типу UNION ALL)?да, чтобы именно план был как для UNION ALL:
Код: plaintext
1.
2.
3.
4.
Append
  IndexScan
    (id=3)
  IndexScan
    (id=50)

Andrey DaeronЗЫ Растекаясь мыслью по древу - задумался, как же он может быть таким догадливым. По идее он должен смотреть на признак уникальности индекса в IndexScan() . По идее, не так и сложно.нет, думаю смотреть он должен именно на соотношение условий, потому что ему может прийти запрос IN ( 1, 2, 3, 4, 3, 3, 2, 5 ), в котором условия дублируются.

а как быть с таким запросом: id between 10 and 30 or id between 20 and 40? постгресу надо догадаться :-) и преобразовать его к between 10 and 40 и выполнить простым IndexScan.

Andrey DaeronМожет быть это не оптимально?думаю, это не реализовано потому что не так просто

Andrey DaeronИли не даёт выигрыша? Реального?используемый план с битмапами хорош, он дает возможно даже меньшее время возврата последней строки, чем Append(IndexScan). но первую строку он возвращает с задержкой, в отличие от Append(IndexScan).
...
Рейтинг: 0 / 0
29.11.2007, 16:11
    #34975584
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
Andrey Daeron пишет:

> А кто еще? Еще раз говорю - погуглите, термин принят только по отношению
> к sybase. Ни к Ораклу, ни к PG, ни к мускулю он никем не применяется.

Ну может быть. Может быть по-другому называется. Или никак не
называется. Но в MS-то оно точно есть.

> Оно?

Похоже да.

А без Bitmap Index ? С простым индексом как будет ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.11.2007, 16:41
    #34975719
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select и огромное условие
MasterZiv
> Оно?
Похоже да.
А без Bitmap Index ? С простым индексом как будет ?

Быть может я не прав. Но в PG, в текущем релизе, нет битмапных индексов. Bitmap Index Scan - это метод работы с индексом т.е. bitmap scan индекса.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select и огромное условие / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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