Как настроить производительность запроса с оператором Between для диапазона дат

Я работаю над настройкой производительности всех медленных запросов. Я новичок в Oracle, некоторое время использую сервер sql. Может ли кто-нибудь помочь мне настроить запрос, чтобы он работал быстрее.

Select distinct x.a,  x.b from 
from xyz_view x 
where x.date_key between 20101231 AND 20160430

Ценим любую помощь или предложения


person SqlBrain    schedule 22.04.2016    source источник
comment
Получаете ли вы дубликаты записей без ключевого слова distinct и есть ли у вас индекс в поле date_key?   -  person Pரதீப்    schedule 22.04.2016
comment
возможно, попробуйте использовать фактические даты для параметров: где x.date_key между to_date('20101231', 'ГГГГММДД') и to_date('20160430', 'ГГГГММДД')   -  person tbone    schedule 22.04.2016
comment
@tbone - не будет ли это происходить неявно   -  person Pரதீப்    schedule 22.04.2016
comment
@SqlBrain, я предполагаю, что у вас есть индекс в поле date_key, хотя вы не упомянули   -  person FLICKER    schedule 22.04.2016
comment
@Prdp не уверен, что ты имеешь в виду. Я никогда не предполагаю, что что-то произойдет неявно, если я могу указать это явно (особенно даты). Другой пример — когда люди используют числа вместо строк в одинарных кавычках. Oracle может выполнить неявное преобразование, но не сможет, например, использовать индекс, построенный на основе поля varchar. Тем не менее, все еще неясно, будет ли Oracle использовать индекс в поле date_key для этого примера, даже если правильно указать даты, это зависит от того, сколько данных нужно извлечь (в любом случае Oracle может просто выполнить полное сканирование). Объяснить планы тоже поможет   -  person tbone    schedule 22.04.2016
comment
?? SQL Server или Oracle? Я предполагаю, что это не оба.   -  person mathguy    schedule 22.04.2016
comment
Вы действительно извлекаете данные за пять лет? Всего из скольких лет? Как икра в целом? Сколько строк в наборе результатов? Разделена ли таблица? Это действительно вид?   -  person APC    schedule 23.04.2016
comment
Если вы не настраиваете SQL Server, вам следует удалить этот тег. У вас есть куча ответов по настройке MSSQL, которые бесполезны для настройки Oracle и просто тратят время респондентов. Не путайте.   -  person APC    schedule 23.04.2016
comment
объект xyz_view является представлением или таблицей. Если это представление, проверьте запрос, написанный для представления. А если это таблица, то ничего особенного не остается, кроме как минимизировать количество дней данных для повышения производительности.   -  person Mr. K    schedule 25.08.2016


Ответы (3)


Во-первых, я бы начал с рассмотрения того, почему DISTINCT существует. По моему опыту, многие разработчики выбирают DISTINCT, потому что знают, что им нужны уникальные результаты, но на самом деле не понимают, почему они их еще не получают.

Во-вторых, кластеризованный индекс по столбцу был бы идеальным для этого конкретного запроса, потому что он размещает все строки рядом друг с другом на диске, и сервер может просто получить их все сразу. Проблема в том, что это может оказаться невозможным, поскольку у вас уже есть кластеризованный индекс, пригодный для других целей. В этом случае попробуйте некластеризованный индекс для столбца даты и посмотрите, что он делает.

Имейте в виду, что индексация имеет широкий спектр эффектов, поэтому использование одного запроса для определения индексации не является хорошей идеей.

person Tom H    schedule 22.04.2016
comment
Если это Oracle, а не MS SQL (просто попросил уточнить у ОП) - в Oracle нет кластерных индексов. - person mathguy; 22.04.2016

Я бы также добавил, что если вы извлекаете из VIEW, вам действительно следует изучить дизайн представления. Обычно он имеет много соединений, которые могут не понадобиться для вашего запроса. Кроме того, если представление необходимо, вы можете создать индексированное представление, которое может быть очень быстрым.

person J Greene    schedule 22.04.2016
comment
И если это представление вызывает другие представления, вы можете попасть в ад настройки производительности! Был там, сделал это, взял футболку. - person HLGEM; 22.04.2016

Вы не можете сделать больше, чтобы оптимизировать этот запрос, пока вы установили, что DISTINCT действительно необходим.

Вы можете добавить [NOLOCK] к предложению FROM, если чтение незафиксированных страниц не является проблемой.

Однако вы также можете проанализировать, вставляется ли время, и если да, то действительно ли оно актуально, если не установить время на полночь, это улучшит индексы.

Самые большие улучшения, которые я видел, — это разделение поля даты в таблице на 3 поля, по 1 для каждой части даты. Это действительно может улучшить производительность.

person domenicr    schedule 22.04.2016