|
|
|
Эффективная выборка записей по списку 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 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
В догонку тынц по теме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:40 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_LРебята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join. закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований. ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:42 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_Lто логика такая получается. Делаем криво запрос, а потом гоним на СУБД: "Фууу... какая вона слабая ... Вот у Оракула ....эт да!"не тута как раз на оракуля и гонят).. а вообще да бредятина откровеная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:42 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Yo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).а нафига вообще эти 10к идентификаторов тянуть на клиент? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:43 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
тыцYo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).а нафига вообще эти 10к идентификаторов тянуть на клиент?Почему "тянуть" ? Они вообще могут из произвольного источника происходить, а вовсе не обязательно с сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:45 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Yo.!Senya_LРебята, занакуя?! Занакуя мерять ограничения СУБД в таком вопросе? Чтобы померяться звонкостью звука в штанах? Есть же решение Ggg_oldзакидывате все айдишники на сервер в таблицу(временную например) и потом используете ее в join. закидывать можно раными способами, конкретный механизм зависит от сервера и ваших требований. ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента).Все же почитай . Речь о том, что вобще искать пересечение множеств через предикаты (фильтры) - это извращение и, скорее всего, свидетельствует о руках. miksoftПочему "тянуть" ? Они вообще могут из произвольного источника происходить, а вовсе не обязательно с сервера.Да речь идет именно об ID-шниках. Потому что другого внятного примера нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:46 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_LВсе же почитай .отличный пример!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:51 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Yo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента). А для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да? И вообще, о автор(10К инсертов с клиента) в приличном обществе как то непринято говорить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 13:56 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
2Senya_L перечитайте два моих поста, вы не вьехали в суть предложения. 2тыц в задаче сказано: "10000 Id-шников есть в памяти приложения, нужно по ним выбрать данные из таблицы." кочено нафантазировать можно чего угодно, но у меня к примеру похожая задача - клиент грузит список ид компаний своих клиентов по которым хочет получить репорт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:03 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_LYo.!ну например для того, чтоб не тратить на два порядка больше ресурсов на "закидывание" (10К инсертов с клиента). А для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да? И вообще, о автор(10К инсертов с клиента) в приличном обществе как то непринято говорить... ну допустим этот список приходит откуда то из файла почему бы тогда не сгенерить такой запрос? нахрена лишнии вставки/чтения? зачем быть таким категоричным и упёртым? Вы же не знаете всех условий задачи, а судите сходу ну высказали свою точку зрения - ну и достаточно, зачем еще топикстартера оскорблять? наверное у нас разные понятия о приличном обществе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:04 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
SergSuperзачем быть таким категоричным и упёртым? Вы же не знаете всех условий задачи, а судите сходу ну высказали свою точку зрения - ну и достаточно, зачем еще топикстартера оскорблять? наверное у нас разные понятия о приличном обществе Топикстартера оскорблять не хотел. Если в горячкАх зарвался, то прошу прощения. Насчет упертости ... Можно поспорить. Например, Вы упорно закрываете глаза на пост Senya_LА для каждой из 10000000 строк делать 10К проверок WHERE это как, кошерно, да???? Я поправил кол-во строк, заметьте. Их стало 10000000, как в старт-топике. SergSuperну допустим этот список приходит откуда то из файла почему бы тогда не сгенерить такой запрос? нахрена лишнии вставки/чтения? Вы приведите нормальный пример. Что за список приходит, с чем, зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:30 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
miksoftOracle - не более 1000 значений Не совсем верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:37 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_Lто логика такая получается. Делаем криво запрос, а потом гоним на СУБД: "Фууу... какая вона слабая ... Вот у Оракула ....эт да!" У некоторых людей регулярно используется обратная логика: раз СУБД не тянет, значит запрос кривой, и вообще решать эту задачу никогда никому не нужно, пользователю, который хочет, нужно объяснить, что он идиот и вообще, но главное СУБД супер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:39 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarermiksoftOracle - не более 1000 значений Не совсем верно.не раскажите как на самом деле?.. любопытно но проверять лень) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:44 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: s> У некоторых людей регулярно используется обратная логика: s> раз СУБД не тянет, значит запрос кривой, и вообще решать s> эту задачу никогда никому не нужно, пользователю, который s> хочет, нужно объяснить, что он идиот и вообще, но главное s> СУБД супер. А ты противоположную крайность не перекидываешься ? ИМХО, если сервер влоб не справляется с запросом, или он вылазит за ограничения, то 90% за то, что задачу можно переформулировать или решить менее затратными методами, чем испытывать сервак мегабайтными запросами :) В данном конкретном случае - для ФБ есть нормальное решение, но оно не влоб Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:46 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarer У некоторых людей регулярно используется обратная логика: Если кто-то не может молотком забить гвоздь в бетонную стену, то из них плохой: молоток, гвоздь или стена? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 14:47 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
тыцне раскажите как на самом деле?.. любопытно но проверять лень) Ограничение действует на количество значений внутри одного списка IN. Но никто не мешает сделать так: Код: plaintext или так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:02 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЕсли кто-то не может молотком забить гвоздь в бетонную стену, то из них плохой: молоток, гвоздь или стена? Замечательная аналогия, давай ее разовьем. Итак, есть пользователь, который живет в доме с бетонной стеной и хочет повесить на эту стену картину. Приходит в форум за советом. Ему среди прочего говорят: нет, молоток и гвоздь тебе не очень помогут, бери перфоратор. Так вот: в этот момент обязательно находится кто-нибудь, кто начинает объяснять, что: - надо брать правильные дома - а если дом неправильный, то можно и самому сложить правильную стену - а вешать картины вообще никому не нужно, лучше фотообои поклеить - и потому нефиг "наезжать" на замечательный молоток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:10 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarerтыцне раскажите как на самом деле?.. любопытно но проверять лень) Ограничение действует на количество значений внутри одного списка IN. Но никто не мешает сделать так: Код: plaintext или так: Код: plaintext Помимо этого, нет ограничения на количество наборов значений в списке. Конструкция Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:14 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarerТак вот: в этот момент обязательно находится кто-нибудь, кто начинает ...Упражнение в аллегориях дело интересное, конечно. Но я так и не услышал ответа на конкретный вопрос. Задам в третий раз Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А "молоток" выдержит? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:21 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_LЗадам в третий раз Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А "молоток" выдержит? ;) Классический пример к тезису "если не хотеть немного поработать головой, придется много работать руками". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:23 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Senya_LА для каждой из 1000000 строк делать 10К проверок WHERE это как, кошерно, да?А почему вы думаете, что "для каждой строки" придется делать "все проверки" ? Оракл, например, не стесняется в таких случаях использовать INDEX RANGE SCAN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:26 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
МикросекундаА ты противоположную крайность не перекидываешься ? Мм.... довольно типичный сценарий моего участия в топике выглядит примерно так: - спорят А и Б - я говорю в адрес А: вот здесь ты сказал глупость - куча зрителей во главе с А: так значит softwarer за Б! А ведь там X, Y и Z!! - я говорю в адрес Б: а ты сказал глупость вот здесь - Б, который был уверен, что я его поддерживаю, чувствует себя преданным - А злорадствует и одновременно понимает, что был прав, когда гнал на нехорошего меня - зрители вообще перестают что-либо понимать в происходящем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:32 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarer в этот момент обязательно находится кто-нибудь, кто начинает объяснять, что: - и потому нефиг "наезжать" на замечательный молоток. И это логично, поскольку в современных условиях на бетонную стену проще наклеить деревянную рейку (не помню как она называется), а уже на неё вещать картину. Но топикстартеры такого типа обычно как раз назначение гвоздя в стене не раскрывают и настаивают на использовании молотка. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:48 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovИ это логично, поскольку Дим, ты ухитрился в одной фразе поддержать точки зрения обеих принципиально не согласных сторон виртуальной дискуссии. Из этого мне приходится сделать вывод, что тебе настолько хочется поспорить, что ты уже не думаешь - о чем, собственно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 15:54 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarer Дим, ты ухитрился в одной фразе поддержать точки зрения обеих принципиально не согласных сторон виртуальной дискуссии. Вообще-то я всего лишь пытался пнуть топикстартера, не желающего отвечать на вопрос о странной логике выборки записей... Вот если в форуме по Дельфи встретится человек, который заговорит о быстром получении ста тысяч записей в грид, ты поинтересуешься у него "а, собственно, зачем"? Сабж же подразумевает, что пользователь не только просмотрел эти сто тысяч записей, но и пометил десять тысяч из них галочкой. Боюсь, что на фоне времени, которое на это было потрачено, слово "эффективность" теряет всякий смысл. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 16:06 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov softwarer У некоторых людей регулярно используется обратная логика: Если кто-то не может молотком забить гвоздь в бетонную стену, то из них плохой: молоток, гвоздь или стена? молоток, поскольку надо взять монтажный пистолет. есть способ скормить в список in хоть сто хоть тыщу идентификаторов без ущерба для здоровья сервера, через коллекции. Выше об этом говорилось, только вместо коллекции был ассоциативный массив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 16:08 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarer- зрители вообще перестают что-либо понимать в происходящем. Такой уж ты загадочный ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 16:10 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov softwarer Дим, ты ухитрился в одной фразе поддержать точки зрения обеих принципиально не согласных сторон виртуальной дискуссии. Вообще-то я всего лишь пытался пнуть топикстартера, Я в данном случае говорю исключительно о связавшем нас фрагменте беседы. Я привел некий сценарий, ты в своем ответе фактически сказал, что правы обе стороны этого сценария - при том, что одна из них считает вторую явно неправой и некорректно себя ведущей. Я вижу в этом некое противоречие. Dimitry SibiryakovВот если в форуме по Дельфи встретится человек, который заговорит о быстром получении ста тысяч записей в грид, ты поинтересуешься у него "а, собственно, зачем"? Нет, не поинтересуюсь. Я "пну" тех, кто бросится кричать "такое никогда и никому не требуется потому что моя СУБД не может этого сделать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 16:23 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Вообще-то я всего лишь пытался пнуть топикстартера, не желающего отвечать на вопрос о странной логике выборки записей... Логика простая: пользователь видит в гриде много записей, выделяет их и нажимает кнопочку, которая должна хитрым образом обработать выделенные записи. Вделить он их может как несколько, так и все (или почти все), нажав на "*" (инвертирование выделения). зы: я не считаю, что грузить 10 тыс записей на клиента - это бад дезигн, это удобство. Около 3500 записей, полученные запросом сорока полей из пятнадцати таблиц, грузятся в грид за 2 сек. (это в трёхзвенной архитектуре), далее локально работает грид от DevExpress (сортировка, фильтры по каждой колонке). зы2: Firebird 2.1 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 17:55 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 18:02 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
NickDee Вделить он их может как несколько, так и все (или почти все), нажав на "*" (инвертирование выделения). В этом случае надо применять NOT IN (). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 19:16 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
softwarerНет, не поинтересуюсь. Я "пну" тех, кто бросится кричать "такое никогда и никому не требуется потому что моя СУБД не может этого сделать". Честно скажу, если искренне говоришь, то не могу не уважать мнение. Только давайте вспомним тему топика, если кто забыл (что немудрено). Тема: автор Эффективная выборка записей по списку ID Много было сломано копий, много выдумано сравнений про "бетон и молоток". Но самое главное осталось за бортом. Я говорю про эффективность . Насколько будет эффективен запрос с предложенными условиями? Я не то чтобы не умею выражаться аллегориями, но не имею такой склонности. Посему предлагаю просто протестировать запрос с предикатом WHERE ... IN (<до_фига_элементов>). С передачей в виде запроса и с предварительной перекачкой набора IDшников на сервер. Я не силен в Oracle, но могу сравнить запросы с клиента в Firebird и MSSQL. Адептам Oraсle (и других СУБД) предлагаю провести аналогичный тест. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2008, 22:18 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov В этом случае надо применять NOT IN (). нужно понимать, что есть ещё и фильтр (как серверный "where", так и локальный). вот как выглядит эта несложная конструкция на Firebird: Код: plaintext 1. 2. 3. Код: plaintext 1. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 07:40 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
NickDee нужно понимать, что есть ещё и фильтр (как серверный "where", так и локальный). Вот к этому-то фильтру и нужно добавлять условие IN/NOT IN. И будет тебе счастье, поскольку, как сказал Ё!, сервер перейдёт на Range scan, что и повысит эффективность. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 12:08 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov NickDee нужно понимать, что есть ещё и фильтр (как серверный "where", так и локальный). Вот к этому-то фильтру и нужно добавлять условие IN/NOT IN. И будет тебе счастье, поскольку, как сказал Ё!, сервер перейдёт на Range scan, что и повысит эффективность. Во-первых: сложно(читай долго), во-вторых: пока ты у себя что-то фильтровал, другие юзеры уже могли натоптать пачку новых записей, это конечно тоже можно учесть, но мне кажется что несколько десятков миллисекунд сервера можно потратить и на доступ по ID-ам. А может даже такой способ в большинстве случаев эффективней индексированного (и частично неиндексированного) поиска по куче полей (не проверял). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 14:28 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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. Итого выводы: Разницы по скорости не заметно План в эксперименте в целом одинаковый На этапе построения плана оптимизатору неизвестно количество элементов в коллекции, что приводит к наколеночной оценке количества строк, и как результат, может привести к неоптимальному плану и необходимости использования хинта cardinality ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 15:52 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
P.S. Коллеги - я вполне понимаю, что этот эксперимент можно улучшить и сделать более глубокие выводы.. например таки заметить разницу между range scan и unique scan и отметить поведение оптимизатора. Я здесь не ставлю такой цели, я всего лишь хочу показать, что "сплеча наезжать на перечисление в where" совершенно не обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 15:58 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
в firebird конструкция "in" оказалась крайне не эффективна. Execute time на 1500 ID-шников (это максимум в FB) в 10 раз больше чем если воспользоваться join-ом (300 мс против 30) (Reads from disk to cache = 0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 18:57 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 19:04 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий последний релизнутый Firebird 2.1.1.17910 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 19:56 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 20:10 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий и тестовый кейс есть? Код: 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. В процедурке GET_BY_IN нужно заполнить 1500 элементов в "IN" :) EXECUTE PROCEDURE FILL_SOMETABLE - встявляет 10 миллионов записей (около минуты) Процедурку List заменил на List2, для простоты. Дальше можно открывать процедурки GET_BY_JOIN и GET_BY_IN в IBExpert-e и запускать их с фетчем(execute and fetch all) и сравнивать результаты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 20:48 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2008, 10:26 |
|
||
|
Эффективная выборка записей по списку ID
|
|||
|---|---|---|---|
|
#18+
Микросекунда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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2008, 11:51 |
|
||
|
|

start [/forum/topic.php?all=1&fid=35&tid=1553035]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 402ms |

| 0 / 0 |
