Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Добрый день, помогите ускорить запрос. Не могу понять почему Firebird (2.5.3) использует NATURAL. Есть база с таблицами: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. в таблице tovar_name 88000 записей в таблице tovar_zal 70000 записей Делаю запрос без сортировки : Код: sql 1. 2. 3. 4. 5. результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. результат FETCH ALL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Делаю запрос с сортировкой по полю с индексом : Код: sql 1. 2. 3. 4. 5. 6. 7. результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. результат FETCH ALL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Делаю запрос с сортировкой по полю с индексом с явным указанием PLAN : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. результат FETCH ALL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Понятно что запросы гораздо больше и поля чуть не те, все сократил чтобы было максимально понятно. Почему не используется верный индекс при JOIN двух таблиц, а NATURAL? Ведь индекс есть, почему проход по нему не делать, явно ведь быстрее. Я понимаю есть SORT BY, значит он должен склеить две таблицы полностью и потом выдать результат, даже FIRST не поможет. Но индекс же есть почему не клеить по нему? Вот и получается что, ни частичный фетч, ни добавление индекса не помогают пользователю у которого до 100 тыс наименований и хочет сортировать например по других полях, так бы добавил индекс и все, а так склейка происходит по NATURAL и это у пользователя на компе примерно 6-8 секунд :( В нете смотрел, пример как тут, но так и не понял почему используется NATURAL http://www.sql.ru/forum/389044/inner-join-dvuh-tablic-daet-plan-natural ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:14 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.ua, не там смотришь надо здесь http://www.ibase.ru/devinfo/dataaccesspaths.htm По сабжу. До трёшки Fb не умеет менять порядок соединения когда одна из таблиц читается навигацией по индексу. Смотри CORE-1482 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:26 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
у всех запросов планы нормальные. dimmon.ua Почему не используется верный индекс при JOIN двух таблиц, а NATURAL? потому что чтобы объединить два множества, элементы одного множества придется перебрать целиком. А соответствия им - да, ищутся по индексу. У тебя еще там мало данных, но и так видно, что reads from disk to cache у твоего плана с ORDER больше чем у SORT (9123 против 8231). И если данных будет больше, то и запрос с планом ORDER будет гораздо тормознее на FetchAll. кстати, у тебя нет индекса по tovar_zal.num, а он должен быть, хотя бы в результате построенного по этому стольбцу foreign key. Тогда план поменяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:29 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.ua, кстати раз у тебя ORDER выигрывает у SORT при полном фетче, то скорее всего память под сортировку мало выделено. Попробуй параметр TempCacheLimit увеличить раз в 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:30 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Симонов Денисне умеет менять порядок соединения когда одна из таблиц читается навигацией по индексу. нет. там про SORT vs ORDER. Это массовое заблуждение об однозначной выгоде ORDER, которое я подробно разбирал здесь: http://www.ibaseforum.ru/viewtopic.php?f=4&t=4175 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:32 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdvу тебя нет индекса по tovar_zal.num упс, не туда посмотрел. вместо индекса idx_tovar_zal_tovar_id нужно было просто создать foregin key. и, на будущее, dimmon.ua - не создавай неименованные constraints. Это неудобно при просмотре планов и поиске этих самых constraints. то есть, надо было писать ALTER TABLE tovar_name ADD constraint pk_tovar_name PRIMARY KEY (num) и, в первом запросе одна из таблиц все равно была бы natural. Поскольку в tovar_zal записей меньше, оптимизатор выбрал ее для натурального перебора. Еще раз повторяю, что это совершенно нормально, так производится объединение множеств. Если бы на tovar_zal было бы дополнительное условие отбора, и был индекс по такому полю, то индекс бы использовался и natural не было бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:38 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdv, ага я перепутал мальца. В том тикете был решён вопрос когда FIRST присутствует. Автору надо память под сортировку увеличить. Глядишь и выгода от ORDER улетучится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 15:48 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисГлядишь и выгода от ORDER улетучится выгода от ORDER есть только когда надо быстро получить первую порцию записей, или когда записей мало. Если записей много, то при FetchAll будет дикий дисковый I/O, и в итоге все окажется хуже SORT у автора же якобы выгода получилась на select ... where field = x order by field То есть когда индекс по field используется и для отбора, и для "вывода в указанном порядке". Со слов Еманова (вчера), эту фишка была в 1.5, в 2.x ее поломали, чинят в 3.0, и якобы до сих пор в 2.1 и 2.5 оно работает криво. Детали будут потом, и в т.ч. на упомянутых уже семинарах 17512349 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:05 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Каюсь, неименованные "constraints" как и "foregin key" это наследие, переделал tovar_zal на: Код: sql 1. 2. 3. 4. Результат такой же, работает только с явным указаниме плана: Код: sql 1. Мне не нужен Fetch All, я его для примера показал, мне бы обычный Fetch части данных бы срабатывал быстро, но пока используется NATURAL в плане, ничего не выходит, склейка так и идет по NATURAL :( Честно, вот читаю уже который раз и не могу понять: авторЕще раз повторяю, что это совершенно нормально, так производится объединение множеств. Если бы на tovar_zal было бы дополнительное условие отбора, и был индекс по такому полю, то индекс бы использовался и natural не было бы. индекс есть, а зачем доп. условие отбора? Я и до этого читал, вы также писали ранее, но реально туплю не понимаю, сори. В ORDER BY же указано поле и по нему есть индекс, почему не идет перебор по нему. Вы не подумайте что этот JOIN я делал только так, и явно и неявно и местами менял tovar_zal и tovar_name и ка хочешь :) Просто я не понимаю одного, есть две таблицы, есть поле первичного ключа у каждой таблицы, есть поле по которому идет JOIN (внешний ключ), есть поле сортировки. И по каждому из них есть индексы, почему NATURAL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:24 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdv, в трёшке выгода есть. Но именно на таком запросе. А не на JOINах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:28 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdvу автора же якобы выгода получилась на select ... where field = x order by field Суть в том что даже если букс у одного клиента, я просто добавляю индекс по нужному полю для клиента, и вопрос решен, но кроме добавления индекса по полю надо задавать и вручную план. Т.е. добавляю: Код: sql 1. И при выборке: Код: sql 1. 2. 3. 4. 5. 6. 7. получаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. а вот с явным указанием плана: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:30 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.ua, ну так напиши Код: sql 1. 2. 3. 4. 5. 6. 7. будет тебе сортировка по индексу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:32 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Елки, а я все искал куда этот "+0" вставить, читал но не мог понять куда :) Спасибо огроменное, это меня очень устраивает на данный момент, скрипт: Код: sql 1. 2. 3. 4. 5. 6. 7. выдает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 16:43 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.uaно пока используется NATURAL в плане, ничего не выходит рискну двинуть в массы лозунг - "NATURALа боятся только гомосеки". Потому что эта беда с "NATURAL - плохо, я его боюсь!" меня уже конкретно достала. NATURAL - САМЫЙ БЫСТРЫЙ способ перебора всей таблицы. Сколько раз я должен повторить про объединение множеств? И сколько раз ты будешь задавать один и тот же вопрос? Ты в уме можешь решить задачу? Есть массив А и массив Б. Нужно для массива А найти соответствующие ему элементы в массиве Б. Как ты это сделаешь? Про индексы не думай, представь просто набор каких-то элементов в памяти. dimmon.uaВ ORDER BY же указано поле и по нему есть индекс, почему не идет перебор по нему. потому что. dimmon.uaнадо задавать и вручную план. да никогда не надо задавать план вручную. dimmon.uaа вот с явным указанием плана: ты ответы читаешь, или только вопросы пишешь? или это какой-то вид троллинга? Тебе уже ЭТО объяснили, здесь. И дали ссылку на статью. При этом ты пятый раз спрашиваешь "почему." Зачем ты тычешь в Execute time, при этом сам же приводя время выполнения для fetch all? я для кого писал 17513776 17513464 17513438 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 18:24 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.ua, я еще на всякий случай добавлю, что 9000 страниц за 5 секунд - это 14мб/сек. На старом ноутбуке экспериментируешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 18:25 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdvСколько раз я должен повторить про объединение множеств? И сколько раз ты будешь задавать один и тот же вопрос? Ты в уме можешь решить задачу? Есть массив А и массив Б. Нужно для массива А найти соответствующие ему элементы в массиве Б. Как ты это сделаешь? Про индексы не думай, представь просто набор каких-то элементов в памяти. Пожалуйста. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Делаем запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. Допустим обычный Fetch вытаскивает 4 строки, Fetch All все данные. Как я понимаю, Firebird возмет таблицу tovar_zal (т.к. она меньше) в NATURAL сортировке т.е. без нее и будет подставлять по индексу поля num таблицы tovar_name, но он не возмет 4 строки, а будет связывавть таблицы полностью т.к. чтобы отсортировыать 4 строки по name нада склеить все, и после дать только 4 строки отсортированные по name не используя индекс. Именно в полной склейке и подальшей сортировкой не по индексу и будет букс. А вот если Firebird возмет таблицу tovar_name сразу по индексу name (что и делаем мы указывая явно План) и потом подклеит 4 записи опять таки по индексу num таблицы tovar_zal, то не надо клеить всю таблицу на что траитится время + сортировка уже есть и она бала сделана по индексу и только 4 записи. kdvда никогда не надо задавать план вручную. Поэтому и спрашиваю т.к. не хочу задавать его вручную. kdvпотому что. Почему? kdvЗачем ты тычешь в Execute time, при этом сам же приводя время выполнения для fetch all? Я не "тычу" я хотел показывал fetch all, только для общей картины, чтобы не задавали лишних вопросов, вроде какая версия, какая статистика, за какое время fetch all, т.е. хотел как лучше :) чтобы вам быфло проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 20:35 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
kdvdimmon.ua, я еще на всякий случай добавлю, что 9000 страниц за 5 секунд - это 14мб/сек. На старом ноутбуке экспериментируешь? Эксперимент был на embedded, проц E6700, windows xp, винт обычный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 20:37 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
dimmon.ua, на embeded тест не чистый. Надо было на нормальной версии проводить. Кстати про увеличение памяти про сортировку ты совет проигнорировал. Впрочем если надо получать быстро только первые записи, то сортировка по индексу в будет в тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 21:40 |
|
||
|
Скорость запроса (PLAN JOIN NATURAL)
|
|||
|---|---|---|---|
|
#18+
Симонов Денисна embeded тест не чистый. Надо было на нормальной версии проводить. Кстати про увеличение памяти про сортировку ты совет проигнорировал. Впрочем если надо получать быстро только первые записи, то сортировка по индексу в будет в тему Спасибо с TempCacheLimit вы мне еще в прошлый раз помогли :) 17377270 на эксперименте уже было увеличено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2015, 09:07 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38936134&tid=1562916]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
170ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 288ms |

| 0 / 0 |
