Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос? / 25 сообщений из 49, страница 1 из 2
25.08.2016, 12:27
    #39297732
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Есть таблица записей, условно говоря это строки документов, содержат товар (ID), дату (со временем), ну и ссылку на шапку документа.

На таблицу уже есть индексы по дате, продукту, документу.

Есть запрос по движению товара, рекомендован индекс по продукту, то есть он через индекс продуктов собирает данные по продукту по всей таблице (500 млн строк), а это может быть и 1000 и 150 тысяч, а потом отбирает их по дате.
Причем даже если делаешь отбор за 2 дня все равно выбирает все продукты к примеру 115 тысяч строк, то есть длится запрос может пол часа, а вот если за те же 2 дня отбираешь по дате, то он отбирает 800 тысяч и по ним отбирает уже продукт, но получается это все равно за 4 минуты, видимо потому что эти данные все лежат в одном месте, а не размазаны по нескольким файлам.

Ставила в подсказки индекс и по дате тоже (оба), но тогда и за пол года начинает отбирать по дате, и все тушите свет.

Напрашивается индекс продукт-дата, делала причем даже делала DESC по дате, индекс получился какой-то очень громоздкий, 16 гб и постоянно висел в памяти почти весь, и был по объему даже больше, чем хранимая в памяти часть таблицы.
Не то.

Может какие-то хитрости есть? может партиционирование поможет, хотя не могу понять как.
...
Рейтинг: 0 / 0
25.08.2016, 12:38
    #39297744
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845Может какие-то хитрости есть?
Нанять специалиста.
...
Рейтинг: 0 / 0
25.08.2016, 12:45
    #39297752
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
mefman,

У нас разработчик есть на это дело, но он чего-то ускорять ничего не стремится, и так сойдет.
Просто интересно, что тут можно предпринять.
...
Рейтинг: 0 / 0
25.08.2016, 12:47
    #39297758
Как оптимизировать запрос?
mefmannata44845Может какие-то хитрости есть?
Нанять специалиста.который сможет сформулировать тему менее литературно, но более содержательно.
...
Рейтинг: 0 / 0
25.08.2016, 12:53
    #39297765
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Давайте кратко: нужен отбор и по дате и по продукту, если используешь индекс по продукту идет по всей таблице от сотворения, а потом отбирает по дате, если используешь индекс по дате даже за 2 дня отбирает офигенный объем данных, а потом из них отбирает нужный продукт, период месяц-полгода по дате дают просто нереальные объемы.
...
Рейтинг: 0 / 0
25.08.2016, 13:43
    #39297833
Taciturn12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Если идет отбор и по дате и по номеру документа, то в идеале нужен составной индекс. Для поиска используются значения хранящиеся в индексе. Если индекс содержит только одно поле указанное в условии отбора, то база читает в кэш все значение найденные по этому индексу, т.к. чтобы применить второе условие отбора нужны данные второго поля, а для этого эти данные нужно прочитать. Если у вас номера документов повторяются в разные даты тогда решение только составной индекс (при условии что таблица большая). По хорошему под вопросом оптимизации запроса нужно помещать сам запрос, который оптимизируется.
...
Рейтинг: 0 / 0
25.08.2016, 13:49
    #39297838
Taciturn12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845Напрашивается индекс продукт-дата, делала причем даже делала DESC по дате, индекс получился какой-то очень громоздкий, 16 гб и постоянно висел в памяти почти весь, и был по объему даже больше, чем хранимая в памяти часть таблицы.
Не то.


И что же в написанном не устраивает? если в таблице 3 поля и индекс создается по 2 из ним, почему он должен быть маленьким? он должен быть сравним с размером таблицы.
То что объем индекса в кэше больше таблицы, так чего вы хотите, если почти все данные хранятся в индексе? база обращается к таблице только когда требуется id шапки документа, в других случаях нужная информация уже получена из индекса.
...
Рейтинг: 0 / 0
25.08.2016, 13:56
    #39297845
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845Давайте кратко
Если кратко - нужен autotrace, или скрин sql-monitora.
Ну и сам запрос конечно.
...
Рейтинг: 0 / 0
25.08.2016, 13:58
    #39297849
partition by range
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845,

Пробовали таблицу партиционировать (напр. по месяцам) по дате + локальный индекс по продукту?
...
Рейтинг: 0 / 0
25.08.2016, 14:05
    #39297864
Taciturn12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
partition by range,

В принципе вариант тоже может помочь, другое дело что согласятся ли переводить таблицу в партицированную, все-таки составной индекс более универсальный вариант. Но если партицирование не проблема то попробуйте оба варианта и выберете в итоге.
...
Рейтинг: 0 / 0
25.08.2016, 14:07
    #39297867
Taciturn12
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Ой, вместо цитирования ответить нажал )
...
Рейтинг: 0 / 0
25.08.2016, 14:35
    #39297908
опс...
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845, советую хотя бы схематично табличку с полями, плана запроса сюда накидать.
иначе 80% заглянувших в топик даже читать не станут ваше литературное описалово проблемы.
...
Рейтинг: 0 / 0
25.08.2016, 14:41
    #39297914
heroin2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
если сделать индекс по функции trunc(), он будет поменьше таблицы и скорее всего будет лучше восприниматься оптимизатором, чем индекс по дате.
...
Рейтинг: 0 / 0
25.08.2016, 14:52
    #39297933
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
heroin2если сделать индекс по функции trunc(), он будет поменьше таблицы и скорее всего будет лучше восприниматься оптимизатором, чем индекс по дате.советую прочитать раздел про типы данных и автора темы.
...
Рейтинг: 0 / 0
25.08.2016, 15:15
    #39297972
heroin2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
-2-, спасибо!
автор вроде бы не пишет что ищет тоже со временем, если ты об этом
...
Рейтинг: 0 / 0
25.08.2016, 15:49
    #39298019
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
heroin2если ты об этомпроблем задействовать индекс нет:nata44845Ставила в подсказки индекс и по дате тоже (оба), но тогда и за пол года начинает отбирать по дате, и все тушите свет.и с другой стороны. В чем польза от trunc? Продемонстрируй конкретными числами.
...
Рейтинг: 0 / 0
25.08.2016, 17:03
    #39298108
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
heroin2,

Во-во, такая мысль меня тоже посещает. Индекс по продукту - дате со временем получается слишком ветвящимся из-за того что по одному продукту может идти 10-50 продаж за одну дату, и в датах на каждом уровне по 1 листу.

Индекс только по дате будет иметь больше листьев на уровне, но опять же будет ли он использоваться если запрос вида
ДАТА>='01.01.2016 00:00:00' и ДАТА<='01.02.2012 23:59:59'

Ведь в индексе дата обрезана, получается для 01.02.2012 придется все равно лезть в таблицу уточнять.
Полезет?
...
Рейтинг: 0 / 0
25.08.2016, 17:06
    #39298112
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
ПС. В таблице не 3 столбца, 3 столбца это рабочие, по которым данные отбираются, а их там еще штук 50, строки длинные...
...
Рейтинг: 0 / 0
25.08.2016, 17:17
    #39298125
nata44845
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Запрос приблизительный

SELECT /*+USE_CONCAT ORDERED INDEX(X X_BY_PRODUCT) INDEX(Y Y_PK)*/
X.ID as P54526635,X.DOCUMENT as P54526637
FROM X,Y
WHERE ((X.CLASS IN(14286850,14286851)) AND (X.DATE>=TO_DATE('23.08.2016','DD.MM.YYYY'))
AND (X.DATE<=TO_DATE('26.08.2016','DD.MM.YYYY')) AND (X.PRODUCT='8C000000000165F8')
AND (X.DOCUMENT=Y.ID) AND (X.STATE>0) AND (X.TYPE<>42401878))
...
Рейтинг: 0 / 0
25.08.2016, 17:21
    #39298128
компресс
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
на индекс положить, если места не хватат
...
Рейтинг: 0 / 0
26.08.2016, 00:00
    #39298278
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Taciturn12partition by range,

другое дело что согласятся ли переводить таблицу в партицированную

Ну да нужно подождать пока там будет 1 млрд записей, потом можно уже)

Битмап партиционированные индексы хороший вариант тут.
...
Рейтинг: 0 / 0
26.08.2016, 11:14
    #39298460
дружбан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
партицирование по дате упростит таблицу для исходной выборки, потом строить индексы
...
Рейтинг: 0 / 0
26.08.2016, 11:32
    #39298477
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Во-первых - форматирование:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT /*+USE_CONCAT ORDERED INDEX(X X_BY_PRODUCT) INDEX(Y Y_PK)*/ 
X.ID as P54526635,X.DOCUMENT as P54526637
FROM X,Y
WHERE ((X.CLASS IN(14286850,14286851)) AND (X.DATE>=TO_DATE('23.08.2016','DD.MM.YYYY')) 
AND (X.DATE<=TO_DATE('26.08.2016','DD.MM.YYYY')) AND (X.PRODUCT='8C000000000165F8') 
AND (X.DOCUMENT=Y.ID) AND (X.STATE>0) AND (X.TYPE<>42401878))


Во-вторых:
Код: sql
1.
/*+USE_CONCAT ORDERED INDEX(X X_BY_PRODUCT) INDEX(Y Y_PK)*/


крЫсотища...
без хинтов пробовали?
ORDERED - #аццскийсотона, IMHO.
...
Рейтинг: 0 / 0
26.08.2016, 11:44
    #39298480
pihel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845,

зачем таблица Y , если она не используется в select или where?
В индексе есть столбец "DATE" до других range столбцов в фильтре?
При наличии индекса стоит сравнить IN LIST ITERATOR замен планса с USE_CONCAT
...
Рейтинг: 0 / 0
26.08.2016, 12:02
    #39298498
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
nata44845,

домино?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос? / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]