powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Эффективная выборка записей по списку ID
70 сообщений из 70, показаны все 3 страниц
Эффективная выборка записей по списку ID
    #35604507
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей).
Какая субд с этим справится эффективно?
А какая справится с этой задачей эффективно одним SQL-запросом?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604762
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А каков размер блока и средняя длина записей?

От СУБД, имхо, особой разницы не будет. Максимум в чем тут можно ошибиться при разборе запроса - использовать индексный метод доступа или нет. Но это во многих СУБД можно подсказать.

Намного больше влияют запрошенные мной величины и настройки конкретного инстанса.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604797
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА каков размер блока и средняя длина записей?
не думаю что это важно, ведь перебор 10 миллионов записей делать никто не будет.

табличка SomeTable произвольной структуры, Primary Key по полю Id (типа "Целое").

так будет выглядеть запрос?
select * from SomeTable where Id in (тут 10 тыщ значений через запятую)
А такой запрос случайно не вылезет за какие-нибудь ограничения сервера (например на кол-во элементов в IN, или на длину sql-запроса)?
Вот в Firebird вылазеет ограничение на IN, хотя для него есть другой, более эффективный выход.
Как с такими ограничениями в Orace и MSSQL?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604822
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортак будет выглядеть запрос?
select * from SomeTable where Id in (тут 10 тыщ значений через запятую)

Он может выглядеть и не так. Важно знать откуда буреться эти 10 000 IDшников.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604887
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак с такими ограничениями в ... MSSQL?

Да никаких, собственно:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  SUM(rows) AS NumRows
FROM
  sys.partitions
WHERE
  object_id = OBJECT_ID('dbo.Object') AND
  index_id IN ( 1 ,  2 )

 125   547   415 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE
  @sql nvarchar(max)

SET @sql = 'SELECT StateID FROM dbo.Object WHERE ID IN('

SELECT TOP  10000 
  @sql = @sql + CAST(ID AS varchar) + ',' FROM dbo.Object

SET @sql = STUFF(@sql, LEN(@sql),  1 , ')')  

exec sp_executesql @sql


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
(10000 row(s) affected)

Таблица "Object". Число просмотров 0, логических чтений 40634, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время выполнения SQL Server:
 Время ЦП = 31 мс, истекшее время = 39 мс.

Время синтаксического анализа и компиляции SQL Server: 
 время ЦП = 0 мс, истекшее время = 1 мс.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604945
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklinавтортак будет выглядеть запрос?
select * from SomeTable where Id in (тут 10 тыщ значений через запятую)

Он может выглядеть и не так. Важно знать откуда буреться эти 10 000 IDшников.
10000 Id-шников есть в памяти приложения, нужно по ним выбрать данные из таблицы.
Я помню долго парился с этим вопросом в Firebird, и вот захотел узнать - как обстоят с этим дела в других движках БД.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35604963
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklinindex_id IN (1, 2)

читать как:

Код: plaintext
index_id IN ( 0 ,  1 )

ЗЫ. Результат запроса верный.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35605303
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee wrote:
> Хочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на
> ~10 миллионов записей).
> Какая субд с этим справится эффективно?

Любая, поддерживающая индексирование.

Но 10 тыщ штук записей - довольно много.
В таких случаях лучше обрабатывать данные
в самой БД с помощью SQL.

> А какая справится с этой задачей эффективно одним SQL-запросом?

Тоже любая. ЕСЛИ ID-ы идут подряд, то вам лучше использовать
кластерный индекс, если я конечно всё правильно понял, а вы ничего
не утаили. СУБД, поддерживающих кластерные индексы, тоже много.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35605314
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee wrote:

> select * from SomeTable where Id in (тут 10 тыщ значений через запятую)

В такой постановке вопроса лучше 10 тыщ запросов вида

select * from SomeTable where Id = @id1

select * from SomeTable where Id = @id2


или один типа

select * from SomeTable where Id = @id1
union all
select * from SomeTable where Id = @id2
....

ЕСЛИ id-ы идут не подряд. Тогда лучше просто диапазон задать.

> А такой запрос случайно не вылезет за какие-нибудь ограничения сервера
> (например на кол-во элементов в IN, или на длину sql-запроса)?

Может запросто. Но такие идиоцкие запросы пишите не вы один, так
что многие современные СУБД к этому уже готовы.
А так - конечно надо проверять, и , понятно, если завтра их окажется не 10 тыщ,
а 20, то ...

> Как с такими ограничениями в Orace и MSSQL?

Смотрите в документации. Это всё время меняется, надо смотреть конкр. версию.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35605321
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в оракле можно еще передать в сторед процедуру массив из 10К элементами и потом с помощью TABLE и CAST юзать как обычную таблицу.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35605747
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!в оракле можно еще передать...

MS SQL 2008 -> table-valued parameters. ;)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35605785
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!в оракле можно еще передать в сторед процедуру массив из 10К элементами и потом с помощью TABLE и CAST юзать как обычную таблицу.
извиняюсь за офтопик: и можно эту TABLE джоинить с обычными таблицами? если можно - можно пример синтаксиса? и можно ли это делать в 9-й версии?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606034
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join.
закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований.

Why CORBA is DEAD?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606164
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSuper
извиняюсь за офтопик: и можно эту TABLE джоинить с обычными таблицами? если можно - можно пример синтаксиса? и можно ли это делать в 9-й версии?

да, вроде с 8i можно: http://www.citforum.ru/database/oracle/cast/
передать масив из пхп вот так: http://php.net/manual/pt_BR/function.oci-bind-array-by-name.php

а в оракле примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> create or replace type a_t is table of varchar2( 32 );                                                                                      
                                                                                                                                      
Type created.

declare
 a a_t := a_t('DFCFIDGJDC','J@ELBOBLEI');
begin
 for cv in (select deptno from emp where ename in (select * from table(a)))
 loop
  dbms_output.put_line(cv.deptno);
 end loop;
end;
/                                                                                                                                              

 1 
 1 

PL/SQL procedure successfully completed.
у меня где-то на сайтике работает.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606270
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
type RLIM is record (D	varchar2( 128 )),
type ALIM is table of RLIM index by binary_integer;
mLim	ALIM;
mWhat	number;
begin
...
  select count(*) into mWhat from table(mLim);
end;

PL/SQL: ORA- 22905 : невозможно получить к строкам элементов не вложенных таблиц
или тип надо обязательно создавать?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606362
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SergSuper
или тип надо обязательно создавать?
у тебя ALIM это набор из RLIM, вложеный. там как раз с этим CAST нужно колдовать.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606598
тыц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperне получается
PL/SQL: ORA-22905: невозможно получить к строкам элементов не вложенных таблиц[/src]или тип надо обязательно создавать?ахтунг! в sql можно работать только с sql типами, те ALIM вам надо определить на уровне базы
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35606647
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperне получается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
type RLIM is record (D	varchar2( 128 )),
type ALIM is table of RLIM index by binary_integer;
mLim	ALIM;
mWhat	number;
begin
...
  select count(*) into mWhat from table(mLim);
end;

PL/SQL: ORA- 22905 : невозможно получить к строкам элементов не вложенных таблиц
или тип надо обязательно создавать?

Т.е. про то что с index by не получится работать из SQL никто не скажет ?
Это ассоциативный массив (PL/SQL), а не коллекция (SQL).
Сказанное не отменяет предыдущих ораторов по поводу объявления типа на уровне SQL и необходимости приведения типов
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35607664
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeemiksoftА каков размер блока и средняя длина записей?не думаю что это важно, ведь перебор 10 миллионов записей делать никто не будет.Это достаточно важно, т.к. на основе этой (не только этой, но в т.ч. и этой) информации оптимизатор будет принимать решение о методе доступа к таблице.
Например, если размер блока 16 Кб, а размер записи 8 байт, то в каждый блок попадает примерно 2000 записей. А выбрать нам нужно примерно каждую тысячную запись. Если принять, что искомые записи распределены в таблице примерно равномерно, то получается, что нам придется прочитать все или почти все блоки таблице. В таком случае использовать индекс не эффективно, полное сканирование таблицы будет эффективнее.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35607822
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeХочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей).
Какая субд с этим справится эффективно?
А какая справится с этой задачей эффективно одним SQL-запросом?Автор, а что мешает вам загрузить эти 10000 IDшников в базу, а потом JOIN с большой таблицей? Что за блажь такая, обязательно "пропихнуть" их через WHERE?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35608164
Микросекунда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35608205
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МикросекундаА какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к.


MS SQL ~256 Mb
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35608492
stopor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PostgreSQL - не нашел явного ограничения, похоже зависит только от доступной памяти

50-мегабайтный запрос SELECT 1 FROM tab WHERE id in (...) с миллионом значений отработал за 3 минуты, выжрав 1.7ГБ памяти сервера.
Для 100МБ запроса уже не хватило :)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35608525
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle - не более 1000 значений.

MySQL - размер SQL запроса может быть не больше значения переменной max_allowed_packet (значение по умолчанию - 1 Мб).
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609128
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение
Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join.
закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований.
А если делаем так
Код: plaintext
select * from SomeTable where Id in (тут  10  тыщ значений через запятую)
то логика такая получается. Делаем криво запрос, а потом гоним на СУБД: "Фууу... какая вона слабая ... Вот у Оракула ....эт да!"
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609147
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку тынц по теме
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609155
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_LРебята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение
Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join.
закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований.

ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609159
тыц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_Lто логика такая получается. Делаем криво запрос, а потом гоним на СУБД: "Фууу... какая вона слабая ... Вот у Оракула ....эт да!"не тута как раз на оракуля и гонят).. а вообще да бредятина откровеная
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609164
тыц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).а нафига вообще эти 10к идентификаторов тянуть на клиент?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609171
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тыцYo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).а нафига вообще эти 10к идентификаторов тянуть на клиент?Почему "тянуть" ? Они вообще могут из произвольного источника происходить, а вовсе не обязательно с сервера.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609178
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!Senya_LРебята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение
Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join.
закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований.

ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).Все же почитай . Речь о том, что вобще искать пересечение множеств через предикаты (фильтры) - это извращение и, скорее всего, свидетельствует о руках.
miksoftПочему "тянуть" ? Они вообще могут из произвольного источника происходить, а вовсе не обязательно с сервера.Да речь идет именно об ID-шниках. Потому что другого внятного примера нет
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609199
тыц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LВсе же почитай .отличный пример!)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609218
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента). А для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да? И вообще, о автор(10К инсертов с клиента) в приличном обществе как то непринято говорить...
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609265
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Senya_L
перечитайте два моих поста, вы не вьехали в суть предложения.

2тыц
в задаче сказано: "10000 Id-шников есть в памяти приложения, нужно по ним выбрать данные из таблицы."
кочено нафантазировать можно чего угодно, но у меня к примеру похожая задача - клиент грузит список ид компаний своих клиентов по которым хочет получить репорт.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609267
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LYo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента). А для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да? И вообще, о автор(10К инсертов с клиента) в приличном обществе как то непринято говорить...
ну допустим этот список приходит откуда то из файла
почему бы тогда не сгенерить такой запрос? нахрена лишнии вставки/чтения?

зачем быть таким категоричным и упёртым? Вы же не знаете всех условий задачи, а судите сходу
ну высказали свою точку зрения - ну и достаточно, зачем еще топикстартера оскорблять?
наверное у нас разные понятия о приличном обществе
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609380
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuperзачем быть таким категоричным и упёртым? Вы же не знаете всех условий задачи, а судите сходу
ну высказали свою точку зрения - ну и достаточно, зачем еще топикстартера оскорблять?
наверное у нас разные понятия о приличном обществе Топикстартера оскорблять не хотел. Если в горячкАх зарвался, то прошу прощения.
Насчет упертости ... Можно поспорить. Например, Вы упорно закрываете глаза на пост
Senya_LА для каждой из 10000000 строк делать 10К проверок WHERE это как, кошерно, да???? Я поправил кол-во строк, заметьте. Их стало 10000000, как в старт-топике.
SergSuperну допустим этот список приходит откуда то из файла
почему бы тогда не сгенерить такой запрос? нахрена лишнии вставки/чтения?
Вы приведите нормальный пример. Что за список приходит, с чем, зачем?
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609414
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftOracle - не более 1000 значений
Не совсем верно.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609431
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_Lто логика такая получается. Делаем криво запрос, а потом гоним на СУБД: "Фууу... какая вона слабая ... Вот у Оракула ....эт да!"
У некоторых людей регулярно используется обратная логика: раз СУБД не тянет, значит запрос кривой, и вообще решать эту задачу никогда никому не нужно, пользователю, который хочет, нужно объяснить, что он идиот и вообще, но главное СУБД супер.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609447
тыц
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarermiksoftOracle - не более 1000 значений
Не совсем верно.не раскажите как на самом деле?.. любопытно но проверять лень)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609452
Микросекунда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer пишет:

s> У некоторых людей регулярно используется обратная логика:
s> раз СУБД не тянет, значит запрос кривой, и вообще решать
s> эту задачу никогда никому не нужно, пользователю, который
s> хочет, нужно объяснить, что он идиот и вообще, но главное
s> СУБД супер.

А ты противоположную крайность не перекидываешься ? ИМХО, если сервер влоб не справляется с запросом, или он вылазит за ограничения, то 90% за то, что задачу можно переформулировать или решить менее затратными методами, чем испытывать сервак мегабайтными запросами :)

В данном конкретном случае - для ФБ есть нормальное решение, но оно не влоб
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609453
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
У некоторых людей регулярно используется обратная логика:

Если кто-то не может молотком забить гвоздь в бетонную стену, то из них
плохой: молоток, гвоздь или стена?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609500
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тыцне раскажите как на самом деле?.. любопытно но проверять лень)
Ограничение действует на количество значений внутри одного списка IN. Но никто не мешает сделать так:

Код: plaintext
where id in (..) or id in (..) or id in (..) ...

или так:

Код: plaintext
where id in (select column_value from table (:values_list))
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609518
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕсли кто-то не может молотком забить гвоздь в бетонную стену, то из них
плохой: молоток, гвоздь или стена?
Замечательная аналогия, давай ее разовьем. Итак, есть пользователь, который живет в доме с бетонной стеной и хочет повесить на эту стену картину. Приходит в форум за советом. Ему среди прочего говорят: нет, молоток и гвоздь тебе не очень помогут, бери перфоратор.

Так вот: в этот момент обязательно находится кто-нибудь, кто начинает объяснять, что:

- надо брать правильные дома
- а если дом неправильный, то можно и самому сложить правильную стену
- а вешать картины вообще никому не нужно, лучше фотообои поклеить
- и потому нефиг "наезжать" на замечательный молоток.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609522
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerтыцне раскажите как на самом деле?.. любопытно но проверять лень)
Ограничение действует на количество значений внутри одного списка IN. Но никто не мешает сделать так:

Код: plaintext
where id in (..) or id in (..) or id in (..) ...

или так:

Код: plaintext
where id in (select column_value from table (:values_list))

Помимо этого, нет ограничения на количество наборов значений в списке.
Конструкция
Код: plaintext
where (id, 0 ) in ((..., 0 ),(..., 0 ),(..., 0 ),...)
вполне позволяет использовать более 1000 значений.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609545
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerТак вот: в этот момент обязательно находится кто-нибудь, кто начинает ...Упражнение в аллегориях дело интересное, конечно. Но я так и не услышал ответа на конкретный вопрос. Задам в третий раз Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А "молоток" выдержит? ;)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609552
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LЗадам в третий раз Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А "молоток" выдержит? ;)
Классический пример к тезису "если не хотеть немного поработать головой, придется много работать руками".
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609559
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А почему вы думаете, что "для каждой строки" придется делать "все проверки" ?
Оракл, например, не стесняется в таких случаях использовать INDEX RANGE SCAN.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609577
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МикросекундаА ты противоположную крайность не перекидываешься ?
Мм.... довольно типичный сценарий моего участия в топике выглядит примерно так:

- спорят А и Б
- я говорю в адрес А: вот здесь ты сказал глупость
- куча зрителей во главе с А: так значит softwarer за Б! А ведь там X, Y и Z!!
- я говорю в адрес Б: а ты сказал глупость вот здесь
- Б, который был уверен, что я его поддерживаю, чувствует себя преданным
- А злорадствует и одновременно понимает, что был прав, когда гнал на нехорошего меня
- зрители вообще перестают что-либо понимать в происходящем.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609622
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
в этот момент обязательно находится кто-нибудь, кто начинает объяснять, что:
- и потому нефиг "наезжать" на замечательный молоток.

И это логично, поскольку в современных условиях на бетонную стену проще
наклеить деревянную рейку (не помню как она называется), а уже на неё
вещать картину. Но топикстартеры такого типа обычно как раз назначение
гвоздя в стене не раскрывают и настаивают на использовании молотка.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609644
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИ это логично, поскольку
Дим, ты ухитрился в одной фразе поддержать точки зрения обеих принципиально не согласных сторон виртуальной дискуссии. Из этого мне приходится сделать вывод, что тебе настолько хочется поспорить, что ты уже не думаешь - о чем, собственно.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609668
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Дим, ты ухитрился в одной фразе поддержать точки зрения обеих
принципиально не согласных сторон виртуальной дискуссии.

Вообще-то я всего лишь пытался пнуть топикстартера, не желающего
отвечать на вопрос о странной логике выборки записей...
Вот если в форуме по Дельфи встретится человек, который заговорит о
быстром получении ста тысяч записей в грид, ты поинтересуешься у него
"а, собственно, зачем"? Сабж же подразумевает, что пользователь не
только просмотрел эти сто тысяч записей, но и пометил десять тысяч из
них галочкой. Боюсь, что на фоне времени, которое на это было потрачено,
слово "эффективность" теряет всякий смысл.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609677
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
softwarer
У некоторых людей регулярно используется обратная логика:

Если кто-то не может молотком забить гвоздь в бетонную стену, то из них
плохой: молоток, гвоздь или стена?


молоток, поскольку надо взять монтажный пистолет.
есть способ скормить в список in хоть сто хоть тыщу идентификаторов без ущерба для здоровья сервера, через коллекции. Выше об этом говорилось, только вместо коллекции был ассоциативный массив
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609681
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer- зрители вообще перестают что-либо понимать в происходящем.

Такой уж ты загадочный ;)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35609715
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov softwarer
Дим, ты ухитрился в одной фразе поддержать точки зрения обеих
принципиально не согласных сторон виртуальной дискуссии.

Вообще-то я всего лишь пытался пнуть топикстартера,
Я в данном случае говорю исключительно о связавшем нас фрагменте беседы. Я привел некий сценарий, ты в своем ответе фактически сказал, что правы обе стороны этого сценария - при том, что одна из них считает вторую явно неправой и некорректно себя ведущей.

Я вижу в этом некое противоречие.

Dimitry SibiryakovВот если в форуме по Дельфи встретится человек, который заговорит о
быстром получении ста тысяч записей в грид, ты поинтересуешься у него
"а, собственно, зачем"?
Нет, не поинтересуюсь. Я "пну" тех, кто бросится кричать "такое никогда и никому не требуется потому что моя СУБД не может этого сделать".
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35610017
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Вообще-то я всего лишь пытался пнуть топикстартера, не желающего
отвечать на вопрос о странной логике выборки записей...

Логика простая: пользователь видит в гриде много записей, выделяет их и нажимает кнопочку, которая должна хитрым образом обработать выделенные записи. Вделить он их может как несколько, так и все (или почти все), нажав на "*" (инвертирование выделения).

зы: я не считаю, что грузить 10 тыс записей на клиента - это бад дезигн, это удобство. Около 3500 записей, полученные запросом сорока полей из пятнадцати таблиц, грузятся в грид за 2 сек. (это в трёхзвенной архитектуре), далее локально работает грид от DevExpress (сортировка, фильтры по каждой колонке).

зы2: Firebird 2.1 :)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35610043
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, NickDee!
You wrote on Wed, 22 Oct 08 14:55:58 GMT:

NickDee N> зы: я не считаю, что грузить 10 тыс записей на клиента - это бад дезигн, это удобство.
похоже боржоми пить уже поздно...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35610179
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee
Вделить он их может как несколько, так и все (или почти все), нажав на
"*" (инвертирование выделения).

В этом случае надо применять NOT IN ().
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35610377
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНет, не поинтересуюсь. Я "пну" тех, кто бросится кричать "такое никогда и никому не требуется потому что моя СУБД не может этого сделать". Честно скажу, если искренне говоришь, то не могу не уважать мнение.

Только давайте вспомним тему топика, если кто забыл (что немудрено). Тема:
автор Эффективная выборка записей по списку ID Много было сломано копий, много выдумано сравнений про "бетон и молоток". Но самое главное осталось за бортом. Я говорю про эффективность . Насколько будет эффективен запрос с предложенными условиями?
Я не то чтобы не умею выражаться аллегориями, но не имею такой склонности. Посему предлагаю просто протестировать запрос с предикатом WHERE ... IN (<до_фига_элементов>). С передачей в виде запроса и с предварительной перекачкой набора IDшников на сервер.
Я не силен в Oracle, но могу сравнить запросы с клиента в Firebird и MSSQL. Адептам Oraсle (и других СУБД) предлагаю провести аналогичный тест.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35610661
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
В этом случае надо применять NOT IN ().

нужно понимать, что есть ещё и фильтр (как серверный "where", так и локальный).

вот как выглядит эта несложная конструкция на Firebird:
Код: plaintext
1.
2.
3.
select SomeTable.Id, SomeTable.Name
from SomeTable
inner join (select List.Id from List(:IDLIST)) as DT (DTF) on (DT.DTF = SomeTable.Id)
план:
Код: plaintext
1.
PLAN JOIN (LIST NATURAL, SOMETABLE INDEX (PK_SOMETABLE))
вот что есть LIST:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
CREATE PROCEDURE LIST (
    intstr blob)
returns (
    id integer)
as
declare variable i integer;
declare variable listid integer;
declare variable v integer;
declare variable cnt integer;
begin
  listid =  0 ;
  Cnt =  0 ;
  if (CreateIntList(IntStr, ListId, Cnt) <>  1 ) then
    execute procedure RunError('CreateIntList failed');

  I =  0 ;
  while (I < Cnt) do
  begin
    V =  0 ;
    if (ValueInList(ListId, I, V) <>  1 ) then
      execute procedure RunError('ValueInList failed');
    Id = V;
    I = I +  1 ;
    suspend;
  end

  if (FreeList(ListId) <>  1 ) then
    execute procedure RunError('FreeList failed');
end
CreateIntList, ValueInList, FreeList - UDF-функции
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35611292
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee
нужно понимать, что есть ещё и фильтр (как серверный "where", так и
локальный).

Вот к этому-то фильтру и нужно добавлять условие IN/NOT IN. И будет тебе
счастье, поскольку, как сказал Ё!, сервер перейдёт на Range scan, что и
повысит эффективность.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35611939
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
NickDee
нужно понимать, что есть ещё и фильтр (как серверный "where", так и
локальный).

Вот к этому-то фильтру и нужно добавлять условие IN/NOT IN. И будет тебе
счастье, поскольку, как сказал Ё!, сервер перейдёт на Range scan, что и
повысит эффективность.

Во-первых: сложно(читай долго), во-вторых: пока ты у себя что-то фильтровал, другие юзеры уже могли натоптать пачку новых записей, это конечно тоже можно учесть, но мне кажется что несколько десятков миллисекунд сервера можно потратить и на доступ по ID-ам. А может даже такой способ в большинстве случаев эффективней индексированного (и частично неиндексированного) поиска по куче полей (не проверял).
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35612365
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_LНо самое главное осталось за бортом. Я говорю про эффективность . Насколько будет эффективен запрос с предложенными условиями?
Во-первых, автор спрашивал "как эффективнее" - так? Поэтому насчет предложенных условий...

Senya_LПосему предлагаю просто протестировать запрос с предикатом WHERE ... IN (<до_фига_элементов>). С передачей в виде запроса и с предварительной перекачкой набора IDшников на сервер. .. Я не силен в Oracle, ...
"Предварительная перекачка" - это очевидный идиотизм, тестировать который нет нужды. Ну а чтобы удовлетворить Вас... Выборка из десяти миллионов строк одной тысячи (с десятью тысячами принципиальной разницы не будет, но тогда текст sql вылезет за пределы varchar, придется извращаться), сравниваем "список в in" и "передачу коллекции"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
Connected to Oracle Database 10g Enterprise Edition Release  10 . 1 . 0 . 5 . 0  
Connected as test

SQL> create table some_table as
   2   select rownum id, lpad ('*',  100 , '*') data 
   3   from dual
   4   connect by level <=  10000000 ;

Table created

SQL> alter table some_table add primary key (id);

Table altered

SQL> exec dbms_stats.gather_schema_stats (ownname => user);

PL/SQL procedure successfully completed

SQL> create type TIntTable is table of integer;
   2   /

Type created

SQL> set serveroutput on;
SQL> alter system flush shared_pool;

System altered

SQL> create or replace procedure select_by_where is
   2     stmt varchar2( 32000 ) := 'where id in (';
   3     crSomeTable sys_refcursor;
   4     recSomeTable some_table%rowtype;
   5     t1 timestamp;
   6     t2 timestamp;
   7     t3 timestamp;
   8   begin
   9     for i in  1 .. 999  loop
  10       stmt := stmt ||  5  * i || ', ';
  11     end loop;
  12     stmt := 'select /***1***/ * from some_table ' || stmt || '5000)';
  13     t1 := systimestamp;
  14     open crSomeTable for stmt;
  15     t2 := systimestamp;
  16     loop
  17       fetch crSomeTable into recSomeTable;
  18       exit when crSomeTable%notfound;
  19     end loop;
  20     close crSomeTable;
  21     t3 := systimestamp;
  22     dbms_output.put_line ('Where: open cursor = ' || (t2 - t1));
  23     dbms_output.put_line ('Where: fetch cursor = ' || (t3 - t2));
  24   end;
  25   /

Procedure created

SQL> exec select_by_where;

Where: open cursor = + 000000000   00 : 00 : 00 . 016000000 
Where: fetch cursor = + 000000000   00 : 00 : 00 . 031000000 

PL/SQL procedure successfully completed

SQL> select sql_id from v$sql where sql_text like '%***1***%'  and sql_text not like '%v$sql%';

SQL_ID
-------------
6bhbj6qkbvxjr

SQL> select * from table (dbms_xplan.display_cursor ('6bhbj6qkbvxjr'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  6bhbj6qkbvxjr, child number  0 
-------------------------------------
select /***1***/ * from some_table where id in ( 5 ,  10 ,  15 ,  20 ,  25 ,  30 ,  35 ,  40 , 

... поскипано ...

Plan hash value:  1666979420 
--------------------------------------------------------------------------------
| Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU
--------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|    0  | SELECT STATEMENT             |              |       |       |     24  ( 100 
|    1  |  INLIST ITERATOR             |              |       |       |
|    2  |   TABLE ACCESS BY INDEX ROWID| SOME_TABLE   |   1000  |   103K|     24    ( 0 
|*   3  |    INDEX RANGE SCAN          | SYS_C0010485 |   1000  |       |      5    ( 0 
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
    3  - access(("ID"= 5  OR "ID"= 10  OR "ID"= 15  OR "ID"= 20  OR "ID"= 25  OR "ID"= 30  OR

... поскипано ...

 80  rows selected

SQL> create or replace procedure select_by_table is
   2     id_list TIntTable := TIntTable();
   3     cursor crSomeTable (id_list TIntTable) is
   4       select * from some_table where id in (select column_value from table (cast (id_list as TIntTable)));
   5     recSomeTable some_table%rowtype;
   6     t1 timestamp;
   7     t2 timestamp;
   8     t3 timestamp;
   9   begin
  10     id_list.extend ( 1000 );
  11     for i in  1 .. 1000  loop
  12       id_list (i) :=  5  * i;
  13     end loop;
  14     t1 := systimestamp;
  15     open crSomeTable (id_list);
  16     t2 := systimestamp;
  17     loop
  18       fetch crSomeTable into recSomeTable;
  19       exit when crSomeTable%notfound;
  20     end loop;
  21     close crSomeTable;
  22     t3 := systimestamp;
  23     dbms_output.put_line ('Table: open cursor = ' || (t2 - t1));
  24     dbms_output.put_line ('Table: fetch cursor = ' || (t3 - t2));
  25   end;
  26   /

Procedure created

SQL> alter system flush shared_pool;

System altered

SQL> exec select_by_table;

Table: open cursor = + 000000000   00 : 00 : 00 . 031000000 
Table: fetch cursor = + 000000000   00 : 00 : 00 . 016000000 

PL/SQL procedure successfully completed

SQL> select distinct sql_id from v$sql where sql_text like '%TINTTABLE%'  and sql_text not like '%v$sql%';

SQL_ID
-------------
8nv6pst8r1ar4

SQL> select * from table (dbms_xplan.display_cursor ('8nv6pst8r1ar4',  1 ));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  8nv6pst8r1ar4, child number  1 
-------------------------------------
SELECT * FROM SOME_TABLE WHERE ID IN (SELECT COLUMN_VALUE FROM TABLE (CAST (:B1
TINTTABLE)))
Plan hash value:  3292038186 
--------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cos
--------------------------------------------------------------------------------
|    0  | SELECT STATEMENT                    |              |       |       |    5 
|    1  |  NESTED LOOPS                       |              |    255  |  27540  |    5 
|    2  |   SORT UNIQUE                       |              |       |       |
|    3  |    COLLECTION ITERATOR PICKLER FETCH|              |       |       |
|    4  |   TABLE ACCESS BY INDEX ROWID       | SOME_TABLE   |      1  |    106  |
|*   5  |    INDEX UNIQUE SCAN                | SYS_C0010485 |      1  |       |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
    5  - access("ID"=VALUE(KOKBF$))

 23  rows selected

Итого выводы:

Разницы по скорости не заметно


План в эксперименте в целом одинаковый


На этапе построения плана оптимизатору неизвестно количество элементов в коллекции, что приводит к наколеночной оценке количества строк, и как результат, может привести к неоптимальному плану и необходимости использования хинта cardinality
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35612386
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Коллеги - я вполне понимаю, что этот эксперимент можно улучшить и сделать более глубокие выводы.. например таки заметить разницу между range scan и unique scan и отметить поведение оптимизатора. Я здесь не ставлю такой цели, я всего лишь хочу показать, что "сплеча наезжать на перечисление в where" совершенно не обязательно.
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35612998
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в firebird конструкция "in" оказалась крайне не эффективна. Execute time на 1500 ID-шников (это максимум в FB) в 10 раз больше чем если воспользоваться join-ом (300 мс против 30) (Reads from disk to cache = 0)
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35613015
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, NickDee!
You wrote on Thu, 23 Oct 08 15:57:26 GMT:

NickDee N> в firebird конструкция "in" оказалась крайне не эффективна. Execute time на 1500 ID-шников (это максимум в FB)
N> в 10 раз больше чем если воспользоваться join-ом (300 мс против 30) (Reads from disk to cache = 0)
на какой версии?
ибо сие правилось.

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35613103
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

последний релизнутый Firebird 2.1.1.17910
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35613117
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, NickDee!
You wrote on Thu, 23 Oct 08 16:56:14 GMT:

NickDee N> последний релизнутый Firebird 2.1.1.17910очень интересно.
и тестовый кейс есть?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35613163
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
и тестовый кейс есть?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
CREATE TABLE SOMETABLE (
    ID  INTEGER NOT NULL
);

COMMIT;

CREATE PROCEDURE FILL_SOMETABLE
as
declare variable i integer;
begin
  I =  0 ;
  while (I <  10000000 ) do
  begin
    I = I +  1 ;
    insert into sometable (id) values (:I);
  end
end

CREATE PROCEDURE LIST2
returns (
    id integer)
as
declare variable i integer;
begin
  I =  0 ;
  while (I <  1500 ) do
  begin
    I = I +  1 ;
    ID = I* 1000 ;
    suspend;
  end
end

CREATE PROCEDURE GET_BY_JOIN
returns (
    id integer)
as
begin
  for select SomeTable.Id
  from SomeTable
  inner join (select List2.Id from List2) as DT (DTF) on (DT.DTF = SomeTable.Id)
  into :id
  do
  begin
    suspend;
  end
end

CREATE PROCEDURE GET_BY_IN
returns (
    id integer)
as
begin
  for select Id
  from SomeTable
  -- тут в in 1499 элементов (можно откуда-нить скопипастить :)
  where id in ( 2000 , 3000 , 4000 , 5000 , 6000 , 7000 , 8000 , 9000 , 10000 , 11000 , .., 1500000 )
  into :id
  do
  begin
    suspend;
  end
end

COMMIT;

EXECUTE PROCEDURE FILL_SOMETABLE;

COMMIT;

ALTER TABLE SOMETABLE ADD CONSTRAINT PK_SOMETABLE PRIMARY KEY (ID);
COMMIT;

В процедурке GET_BY_IN нужно заполнить 1500 элементов в "IN" :)
EXECUTE PROCEDURE FILL_SOMETABLE - встявляет 10 миллионов записей (около минуты)
Процедурку List заменил на List2, для простоты.
Дальше можно открывать процедурки GET_BY_JOIN и GET_BY_IN в IBExpert-e и запускать их с фетчем(execute and fetch all) и сравнивать результаты
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35613790
Микросекунда
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee пишет:

N> Автор: NickDee
N> в firebird конструкция "in" оказалась крайне не
N> эффективна. Execute time на 1500 ID-шников (это максимум в
N> FB) в 10 раз больше чем если воспользоваться join-ом (300
N> мс против 30) (Reads from disk to cache = 0)

Попробовал твой пример:
78 мс против 280 мс на FB 2.0.3
125 против 460 на 2.1.0 (другая машина, хилая совсем)

соотношение 1:4 примерно, но не 1:10
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Эффективная выборка записей по списку ID
    #35614055
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МикросекундаNickDee пишет:

N> Автор: NickDee
N> в firebird конструкция "in" оказалась крайне не
N> эффективна. Execute time на 1500 ID-шников (это максимум в
N> FB) в 10 раз больше чем если воспользоваться join-ом (300
N> мс против 30) (Reads from disk to cache = 0)

Попробовал твой пример:
78 мс против 280 мс на FB 2.0.3
125 против 460 на 2.1.0 (другая машина, хилая совсем)

соотношение 1:4 примерно, но не 1:10


размер страницы 16K

IN:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
------ Performance info ------
Prepare time = 0ms
Execute time = 297ms
Avg fetch time =  0 , 20  ms
Current memory =  342   357   556 
Max memory =  342   508   284 
Memory buffers =  20   480 
Reads from disk to cache =  0 
Writes from cache to disk =  0 
Fetches from cache =  8   999 
JOIN:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
------ Performance info ------
Prepare time = 0ms
Execute time = 16ms
Avg fetch time =  0 , 01  ms
Current memory =  342   371   496 
Max memory =  342   522   280 
Memory buffers =  20   480 
Reads from disk to cache =  0 
Writes from cache to disk =  0 
Fetches from cache =  9   005 
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Эффективная выборка записей по списку ID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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