Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Эффективная выборка записей по списку ID / 25 сообщений из 70, страница 1 из 3
20.10.2008, 15:14
    #35604507
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
Хочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей).
Какая субд с этим справится эффективно?
А какая справится с этой задачей эффективно одним SQL-запросом?
...
Рейтинг: 0 / 0
20.10.2008, 16:25
    #35604762
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
А каков размер блока и средняя длина записей?

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

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

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

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

Он может выглядеть и не так. Важно знать откуда буреться эти 10 000 IDшников.
...
Рейтинг: 0 / 0
20.10.2008, 17:08
    #35604887
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
авторКак с такими ограничениями в ... 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
20.10.2008, 17:26
    #35604945
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
pkarklinавтортак будет выглядеть запрос?
select * from SomeTable where Id in (тут 10 тыщ значений через запятую)

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

читать как:

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

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

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

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

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

Тоже любая. ЕСЛИ ID-ы идут подряд, то вам лучше использовать
кластерный индекс, если я конечно всё правильно понял, а вы ничего
не утаили. СУБД, поддерживающих кластерные индексы, тоже много.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.10.2008, 20:15
    #35605314
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
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
20.10.2008, 20:21
    #35605321
Yo.!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
в оракле можно еще передать в сторед процедуру массив из 10К элементами и потом с помощью TABLE и CAST юзать как обычную таблицу.
...
Рейтинг: 0 / 0
21.10.2008, 08:36
    #35605747
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
Yo.!в оракле можно еще передать...

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

Why CORBA is DEAD?
...
Рейтинг: 0 / 0
21.10.2008, 11:38
    #35606164
Yo.!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
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
21.10.2008, 12:22
    #35606270
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
не получается
Код: 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
21.10.2008, 12:55
    #35606362
Yo.!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
SergSuper
или тип надо обязательно создавать?
у тебя ALIM это набор из RLIM, вложеный. там как раз с этим CAST нужно колдовать.
...
Рейтинг: 0 / 0
21.10.2008, 14:09
    #35606598
тыц
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
SergSuperне получается
PL/SQL: ORA-22905: невозможно получить к строкам элементов не вложенных таблиц[/src]или тип надо обязательно создавать?ахтунг! в sql можно работать только с sql типами, те ALIM вам надо определить на уровне базы
...
Рейтинг: 0 / 0
21.10.2008, 14:22
    #35606647
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
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
21.10.2008, 18:59
    #35607664
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
NickDeemiksoftА каков размер блока и средняя длина записей?не думаю что это важно, ведь перебор 10 миллионов записей делать никто не будет.Это достаточно важно, т.к. на основе этой (не только этой, но в т.ч. и этой) информации оптимизатор будет принимать решение о методе доступа к таблице.
Например, если размер блока 16 Кб, а размер записи 8 байт, то в каждый блок попадает примерно 2000 записей. А выбрать нам нужно примерно каждую тысячную запись. Если принять, что искомые записи распределены в таблице примерно равномерно, то получается, что нам придется прочитать все или почти все блоки таблице. В таком случае использовать индекс не эффективно, полное сканирование таблицы будет эффективнее.
...
Рейтинг: 0 / 0
21.10.2008, 20:59
    #35607822
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
NickDeeХочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей).
Какая субд с этим справится эффективно?
А какая справится с этой задачей эффективно одним SQL-запросом?Автор, а что мешает вам загрузить эти 10000 IDшников в базу, а потом JOIN с большой таблицей? Что за блажь такая, обязательно "пропихнуть" их через WHERE?
...
Рейтинг: 0 / 0
22.10.2008, 07:01
    #35608164
Микросекунда
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
А какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
22.10.2008, 08:16
    #35608205
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эффективная выборка записей по списку ID
МикросекундаА какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к.


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

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

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


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