powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Эффективная выборка записей по списку ID
25 сообщений из 70, страница 1 из 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
25 сообщений из 70, страница 1 из 3
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Эффективная выборка записей по списку ID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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