
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
06.06.2017, 03:38
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Привет! Есть таблица logist отправки товаров по филиалам ID_TOVAR DATA_OPT KOLVO FROM_OF TO_OF На каждое поле навешан индекс. Иногда надо делать выборку товаров, которые были отправлены, например, в течении года и Сызрань и в Кемерово. Можно использовать что-то типа select * from logist where id_tovar in (select id_tovar from logist where to_of='Кемерово' and id_tovar in (select id_tovar from logist where to_of='Сызрань')) and data_otp>'01.01.2017' Но подобная конструкция выполняется долго: 1) блок select id_tovar from logist where to_of='Сызрань') выбирает 500 тыс записей за 45 минут 2) select id_tovar from logist where to_of='Кемерово' and id_tovar in (select id_tovar from logist where to_of='Сызрань') отрабатывает за 45 минут Мне быстрее: - создать таблицу temp1 для select id_tovar from logist where to_of='Сызрань' - создать таблицу temp2 для select id_tovar from logist where to_of='Кемерово' and it_tovar in (select id_tovar from temp1) - сделать select * from logist where id_tovar in (select id_tovar from temp2 ) and data_otp>'01.01.2017' Можете предложить более правильный или подходящий для данной задачи выход из ситуации. Создавать и удалять временные таблицы тоже не охота. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 04:22
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Водолей, зри эксплайн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 04:43
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Водолей, слишком мало вводных. непонятно, а сколько вообще строк в таблице? насколько полная и актуальная статистика по таблице и её индексам присутствует? в какой версии оракла происходит действие и на какой машине. а то может у тебя ноутбук заморенный в качестве сервера, а ты хочешь, чтобы база на нем летала. ну и про план запроса (для начала) уже озвучили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 05:20
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Oracle 10g на Windows 2008 64bit. Процессор - Intel Xeon 4 ядерный В таблице ~ 500 млн строк. Explain plan я делал и от туда я взял 45 минут на выборку записей по индексу. Статистика полумесячной давности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 05:38
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
ВодолейExplain plan я делал ты к врачу на прием когда придешь, тоже просто скажешь, что анализ крови делал? или всё же результата анализа врачу покажешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 05:51
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
ВодолейИногда надо делать выборку товаров, которые были отправлены, например, в течении года и Сызрань и в Кемерово.Если интересует информация только за год, то, как минимум, в каждый из IN-подзапросов следовало бы добавить условие, выбирающее данные за интересующий тебя диапазон времени. Вместо трех заходов в таблицу можно попробовать сделать один, далее аналитикой рассчитать флаг "и в Сызрань, и в Кемерово" и на следующем уровне запроса отфильтровать по этому флагу. если же охота лазать в таблицу три раза, то попробовать переписать IN-подзапросы на JOIN (возможно, оракл сам не смог этого сделать из-за отсутствия необходимых ограничений по полям таблицы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 05:53
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Водолей, как вариант, вместо IN-подзапросов использовать EXISTS. ведь тебя не интересуют ВСЕ поставки товара за год в указанный город. Тебя же интересует лишь факт, что такие поставки имели место быть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 06:12
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
ВодолейМожете предложить более правильный или подходящий для данной задачи выход из ситуации. Создавать и удалять временные таблицы тоже не охота.Можно пробовать двигаться в таких вот направлениях: Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 06:23
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
Добрый Э - Эх, Спасибо за развернутый ответ! Про вариант с join тоже думал. Попробую все три варианта и посмотрю на время выполнения каждого. P.S. про указание даты. Правильнее так to_date('01.01.2017','dd.mm.yyyy') ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 06:52
|
|||
|---|---|---|---|
|
|||
Как ускорить выборку по сложному запросу |
|||
|
#18+
ВодолейP.S. про указание даты. Правильнее так to_date('01.01.2017','dd.mm.yyyy') ?да. ибо иначе - получаешь NLS-зависимую бомбу замедленного действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 07:26
|
|||
|---|---|---|---|
Как ускорить выборку по сложному запросу |
|||
|
#18+
ВодолейKOLVOНа каждое поле навешан индекс.Зачем такому помогать? - Он сам себе стреляет в обе ноги. Всё равно не доползёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.06.2017, 09:31
|
|||
|---|---|---|---|
Как ускорить выборку по сложному запросу |
|||
|
#18+
Водолей..................... Иногда надо делать выборку товаров, которые были отправлены, например, в течении года и Сызрань и в Кемерово. Можно использовать что-то типа select * from logist where id_tovar in (select id_tovar from logist where to_of='Кемерово' and id_tovar in (select id_tovar from logist where to_of='Сызрань')) and data_otp>'01.01.2017' ................. НЕЛЬЗЯ использовать что-то типа этого К Вашему селекту постановка должна быть такая: "Найти товар который отправлялся в течении года и при этом он когда-то отправлялся в Кемерово и Сызрань" т.е. товар побывавший в 2001 году в Кемерово и 20016 в Сызрани, а в 2017 был отправлен в Урюпинск попадет в Вашу выборку. Если Вы хотите сделать выборку по написанному Вами условию воспользуйтесь одним из вариантов который написал Вам Добрый Э - Эх ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=52&tablet=1&tid=1885807]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 414ms |

| 0 / 0 |
