powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / select и огромное условие
25 сообщений из 25, страница 1 из 1
select и огромное условие
    #34953031
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 чем-либо? Заранее благодарен за ответ!
...
Рейтинг: 0 / 0
select и огромное условие
    #34953140
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Where id in (100,105,280,94)

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

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

Проверь, разрешен ли bitmap_scan в конфиге Постгреса.Это мне? Пусть автор смотрит.
...
Рейтинг: 0 / 0
select и огромное условие
    #34953248
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34953454
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_v13 пишет:

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

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

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

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

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

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

Стек можно в конфиге увеличить. Архитектура приложения явно ошибочная, но размер стека не проблема.
Красота теряется. Кроме того начались проблемы с передачей строки на клиента.
...
Рейтинг: 0 / 0
select и огромное условие
    #34956939
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34956940
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron пишет:
> - кроме того что в SyBase она есть, она специальная и с ней бывают баги

Да не только в Sybase она есть. Везде она есть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
select и огромное условие
    #34957215
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34957242
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Andrey Daeron пишет:
> - кроме того что в SyBase она есть, она специальная и с ней бывают баги

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

Если она есть везде, то чего бы её не быть в PostgreSQL???
И не совсем понятно почему
Код: plaintext
select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
не может использовать индекс.
...
Рейтинг: 0 / 0
select и огромное условие
    #34957366
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron Если она есть везде, то чего бы её не быть в PostgreSQL???
И не совсем понятно почему
Код: plaintext
select * from ATABLE where field1 = 'aa' or field1 = 'bb' -- не может
не может использовать индекс.Это йумор.
(МастаЗиф - известный шутник.)
...
Рейтинг: 0 / 0
select и огромное условие
    #34957376
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps: при использовании таблички в IN (SELECT ...) скорее всего результат будет хуже, чем при перечне IN(1,2,3...). Лучше, мне кажется, в этом случае пользовать INNER JOIN вместо IN (SELECT ...)
...
Рейтинг: 0 / 0
select и огромное условие
    #34957393
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34957578
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34957639
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
select и огромное условие
    #34975584
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron пишет:

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

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

> Оно?

Похоже да.

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

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


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