Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#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. Код: 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. Можно ли как-то специально указать в запросе, чтоб сначала применялись условия, указанные во WHERE, а потом уже делалась сортировка..? Спасибо за внимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2007, 21:56 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
Да, забыл сказать Индексы есть на News.PublicDate и News.RssId, и на поля, участвующие в JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2007, 21:59 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
WHERE "News"."PublicDate" > '2007-03-02 00:13:37' AND "UserChoosedChannels"."UserId" = '3' AND "News"."RssId" = "UserChoosedChannels"."RssId" AND "UserChoosedChannels"."Section" = 'lenta' 1. повторяете условие JOIN-а ("News"."RssId" = "UserChoosedChannels"."RssId") . Зачем? Вместо внешнего забабачьте внутреннее соединение, и выбросьте красненькое из WHERE далее 2. - напрашивается составные индексы по всем полям WHERE, 2.а. на таблу UserChoosedChannels по полям UserId,Section, порядок промеж них не важен(можете точнее определить из других соображений), вероятно добавить именно в _конец_ этого индекса , (...,RssId) (что не очевидно - зависит от оптимизатора, но из общих соображений - должно быть во многих случаях наилучшим решением) 2.б. News - возможно (надо проверять), вместо (или в дополнение к) индекса на PublicDate вам не помешает составной индекс на (RssId,PublicDate) (и именно в этом порядке). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 10:52 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
4321 Спасибо, сделал еще составной индекс по RssId и PublicDate в таблице News, и в UserChoosedChannels составной по UserId, Section и RssId. В результате время стало порядка 550ms.. но все равно картина та же - первоначальная сортировка во всей таблице по полю PublicDate, как и в первом посте. Если делать сортировку по RssId или Id - время выполнения порядка 30ms. Как я понимаю индекс по PublicDate не применяется.. может дело в методе доступа? все индексы делаю btree. Или есть способ принудительно указать использовать индекс в запросе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2007, 23:20 |
|
||
|
Оптимизация запроса
|
|||
|---|---|---|---|
|
#18+
holem 4321 Спасибо, сделал еще составной индекс по RssId и PublicDate в таблице News, и в UserChoosedChannels составной по UserId, Section и RssId. В результате время стало порядка 550ms.. но все равно картина та же - первоначальная сортировка во всей таблице по полю PublicDate, как и в первом посте. Если делать сортировку по RssId или Id - время выполнения порядка 30ms. Как я понимаю индекс по PublicDate не применяется.. может дело в методе доступа? все индексы делаю btree. Или есть способ принудительно указать использовать индекс в запросе? время, кстати сказать, вполне таки нормальное для такого запроса, НО (если охота пуще неволи)... так и не понял, вам нужно таки невнешнее объединение (т.е. в WHERE проверять не пустоту свзязанностей)? Если да - на кой у вас там именно лефт джойны? Если нет - то боюсь от такой последовательности не избавиться. Правда можно (если считать гарантированным наличие 10-ка требуемых левых частей для некоего поднабора данных (скажем 1000) попытаться сразу зарезать на порядки выборку по News т.е. придумать что-то наподобие: Код: 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. ======================================= PS кстати, можно еще например слепить на триггерах вспомогательную табличечку, включающую "UserChoosedChannels"."UserId","UserChoosedChannels"."Section" и соответсвенное "News"."PublicDate" ну и, соответсвенно NewsId,RssId, и т.п. - в силу необходимости вязаться к оным (если связь не много - много, (много вариантов того и другого при заданном RssId) возможно хватит служебно-поддерживаемого поля PublicDate в UserChoosedChannels)... и на нее таки навесить индекс по искомой тройке ("UserId","Section","PublicDate"). Тогда ваш запрос сведется к запросу к одной служебной табличке, (строго по ее индексу) + связка всего прочего по мере необходимости добавления полей. однако стоимость такой бодяги будет весьма велика - и размер записи не мал, и число, кажется, близко к декарту ключей. (хорошо, б если вся эта "табличка" физически, на диске, была просто индексом, ан, похоже, так не получается) Второй способ - написать хп-ку, где руками в лупе по SELECT * FROM "News" ORDER BY "News"."PublicDate" DESC ,в случае нахождения соответственных связок в прочих таблицах (вложенными лупами), выкидывать 10 первых записей и прикрывать лавочку. Можно ли такое поведение замутить чисто запросом, и как его для этого склепать - сказать трудно. Скорее всего - нет (если только структурой не гарантировано не более одной записи ньюс на исходящую запись - тогда можно попробовать записать то же через поля-подзапросы вместо джойнов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2007, 14:28 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=291&tid=2005215]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 397ms |

| 0 / 0 |
