|
|
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Хочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей). Какая субд с этим справится эффективно? А какая справится с этой задачей эффективно одним SQL-запросом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 15:14 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
А каков размер блока и средняя длина записей? От СУБД, имхо, особой разницы не будет. Максимум в чем тут можно ошибиться при разборе запроса - использовать индексный метод доступа или нет. Но это во многих СУБД можно подсказать. Намного больше влияют запрошенные мной величины и настройки конкретного инстанса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 16:25 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
miksoftА каков размер блока и средняя длина записей? не думаю что это важно, ведь перебор 10 миллионов записей делать никто не будет. табличка SomeTable произвольной структуры, Primary Key по полю Id (типа "Целое"). так будет выглядеть запрос? select * from SomeTable where Id in (тут 10 тыщ значений через запятую) А такой запрос случайно не вылезет за какие-нибудь ограничения сервера (например на кол-во элементов в IN, или на длину sql-запроса)? Вот в Firebird вылазеет ограничение на IN, хотя для него есть другой, более эффективный выход. Как с такими ограничениями в Orace и MSSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 16:41 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
автортак будет выглядеть запрос? select * from SomeTable where Id in (тут 10 тыщ значений через запятую) Он может выглядеть и не так. Важно знать откуда буреться эти 10 000 IDшников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 16:49 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
авторКак с такими ограничениями в ... MSSQL? Да никаких, собственно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 17:08 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
pkarklinавтортак будет выглядеть запрос? select * from SomeTable where Id in (тут 10 тыщ значений через запятую) Он может выглядеть и не так. Важно знать откуда буреться эти 10 000 IDшников. 10000 Id-шников есть в памяти приложения, нужно по ним выбрать данные из таблицы. Я помню долго парился с этим вопросом в Firebird, и вот захотел узнать - как обстоят с этим дела в других движках БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 17:26 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
pkarklinindex_id IN (1, 2) читать как: Код: plaintext ЗЫ. Результат запроса верный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 17:32 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
NickDee wrote: > Хочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на > ~10 миллионов записей). > Какая субд с этим справится эффективно? Любая, поддерживающая индексирование. Но 10 тыщ штук записей - довольно много. В таких случаях лучше обрабатывать данные в самой БД с помощью SQL. > А какая справится с этой задачей эффективно одним SQL-запросом? Тоже любая. ЕСЛИ ID-ы идут подряд, то вам лучше использовать кластерный индекс, если я конечно всё правильно понял, а вы ничего не утаили. СУБД, поддерживающих кластерные индексы, тоже много. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:09 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:15 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
в оракле можно еще передать в сторед процедуру массив из 10К элементами и потом с помощью TABLE и CAST юзать как обычную таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:21 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Yo.!в оракле можно еще передать... MS SQL 2008 -> table-valued parameters. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 08:36 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Yo.!в оракле можно еще передать в сторед процедуру массив из 10К элементами и потом с помощью TABLE и CAST юзать как обычную таблицу. извиняюсь за офтопик: и можно эту TABLE джоинить с обычными таблицами? если можно - можно пример синтаксиса? и можно ли это делать в 9-й версии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 09:14 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
закидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join. закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований. Why CORBA is DEAD? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 11:01 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 11:38 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
не получается Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 12:22 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
SergSuper или тип надо обязательно создавать? у тебя ALIM это набор из RLIM, вложеный. там как раз с этим CAST нужно колдовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 12:55 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
SergSuperне получается PL/SQL: ORA-22905: невозможно получить к строкам элементов не вложенных таблиц[/src]или тип надо обязательно создавать?ахтунг! в sql можно работать только с sql типами, те ALIM вам надо определить на уровне базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 14:09 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
SergSuperне получается Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Т.е. про то что с index by не получится работать из SQL никто не скажет ? Это ассоциативный массив (PL/SQL), а не коллекция (SQL). Сказанное не отменяет предыдущих ораторов по поводу объявления типа на уровне SQL и необходимости приведения типов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 14:22 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
NickDeemiksoftА каков размер блока и средняя длина записей?не думаю что это важно, ведь перебор 10 миллионов записей делать никто не будет.Это достаточно важно, т.к. на основе этой (не только этой, но в т.ч. и этой) информации оптимизатор будет принимать решение о методе доступа к таблице. Например, если размер блока 16 Кб, а размер записи 8 байт, то в каждый блок попадает примерно 2000 записей. А выбрать нам нужно примерно каждую тысячную запись. Если принять, что искомые записи распределены в таблице примерно равномерно, то получается, что нам придется прочитать все или почти все блоки таблице. В таком случае использовать индекс не эффективно, полное сканирование таблицы будет эффективнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 18:59 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
NickDeeХочется по списку ID-ов (~10 тыс. штук) получить записи из таблицы (на ~10 миллионов записей). Какая субд с этим справится эффективно? А какая справится с этой задачей эффективно одним SQL-запросом?Автор, а что мешает вам загрузить эти 10000 IDшников в базу, а потом JOIN с большой таблицей? Что за блажь такая, обязательно "пропихнуть" их через WHERE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2008, 20:59 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
А какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 07:01 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
МикросекундаА какие у уважаемых СУБД ограничения на размер текста запроса ? А то если запихнуть 10к идэшников в текст, то даже если по 6 цифр на один идэ + запятые, это будет больше 70к. MS SQL ~256 Mb ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 08:16 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
PostgreSQL - не нашел явного ограничения, похоже зависит только от доступной памяти 50-мегабайтный запрос SELECT 1 FROM tab WHERE id in (...) с миллионом значений отработал за 3 минуты, выжрав 1.7ГБ памяти сервера. Для 100МБ запроса уже не хватило :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 10:39 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Oracle - не более 1000 значений. MySQL - размер SQL запроса может быть не больше значения переменной max_allowed_packet (значение по умолчанию - 1 Мб). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 10:49 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Ребята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join. закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований. А если делаем так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:35 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=35605785&tid=1553035]: |
0ms |
get settings: |
28ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 169ms |

| 0 / 0 |
