Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 October 19

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Постарался примерно сделать ДДЛ и запрос. Полностью повторить ситуацию не могу)) У меня процедуры по 1500 - 2000 строк в среднем. Таблица логов используется часто, в основном специфичные выборки.

https://pastebin.com/vPH2qPz9
Не надо все, достаточно одного запроса, ради которого ты хочешь затеять партиции
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Да там много запросов) В основном используют в себе диапазон дат. Выбираются логи определенных операций над товаром, затем выборка дополняется какими то граничными значениями из других таблиц на основании которых была данная запись, либо записи логов из других таблиц истории...

Дело в том что у меня большая часть старых логов НЕ рабочая, отчеты редко по ним строятся. Убрать не позволяют. У меня отчет может строиться 1-2 часа в зависимости от диапазона, доходило до 6 часов. При том что индексы в таблицах есть. Хотелось бы как то их отделить.
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Постарался примерно сделать ДДЛ и запрос. Полностью повторить ситуацию не могу)) У меня процедуры по 1500 - 2000 строк в среднем. Таблица логов используется часто, в основном специфичные выборки.

https://pastebin.com/vPH2qPz9
В общем, вот запрос

FROM histLog as hist
WHERE oper IN (15,16,18) AND dataOper>@dateBeg AND dataOper < @dateEnd


@dateBeg AND  @dateEnd какой диапазон?

Сколько записей в таблице всего и сколько записей попадают по этому условию в диапазон?
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Да там много запросов) В основном используют в себе диапазон дат. Выбираются логи определенных операций над товаром, затем выборка дополняется какими то граничными значениями из других таблиц на основании которых была данная запись, либо записи логов из других таблиц истории...

Дело в том что у меня большая часть старых логов НЕ рабочая, отчеты редко по ним строятся. Убрать не позволяют. У меня отчет может строиться 1-2 часа в зависимости от диапазона, доходило до 6 часов. При том что индексы в таблицах есть. Хотелось бы как то их отделить.
Про индексы -- ну ни одного ж не показал... .
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Да там много запросов) В основном используют в себе диапазон дат. Выбираются логи определенных операций над товаром, затем выборка дополняется какими то граничными значениями из других таблиц на основании которых была данная запись, либо записи логов из других таблиц истории...

Дело в том что у меня большая часть старых логов НЕ рабочая, отчеты редко по ним строятся. Убрать не позволяют. У меня отчет может строиться 1-2 часа в зависимости от диапазона, доходило до 6 часов. При том что индексы в таблицах есть. Хотелось бы как то их отделить.
Так-то видно точно, что партиции тебе ни на фиг не нужны, от двух партиций ничего не изменится , они не окажут никакого влияния.
С первого взгляда тебе достаточно форсануть индекс по дате, и даже если он будет лишь сканироваться за большой период, все твои проблемы будут решены.
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
В общем, вот запрос

FROM histLog as hist
WHERE oper IN (15,16,18) AND dataOper>@dateBeg AND dataOper < @dateEnd


@dateBeg AND  @dateEnd какой диапазон?

Сколько записей в таблице всего и сколько записей попадают по этому условию в диапазон?
Диапазон в основном пол года. Выборка где то 100К записей после всех фильтров. Индексов несколько по дате тоже имеется. Есть отдельно индекс по dataOper, есть по dataCorrect. Есть также составные индексы (tov, oper, dataOper), (tov, oper, dataCorrect).
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Диапазон в основном пол года. Выборка где то 100К записей после всех фильтров. Индексов несколько по дате тоже имеется. Есть отдельно индекс по dataOper, есть по dataCorrect. Есть также составные индексы (tov, oper, dataOper), (tov, oper, dataCorrect).
Ну вот форсани индекс по dateOper и всё, тебе хватит с головой
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Не совсем понял о "форсани". Ты имеешь в виду что он не подхаватывается, или перестороить нужно?
источник

IC

Igor Chizhov in SqlCom.ru - Стиль жизни SQL
Думаю, здесь может помочь фильтрованный индекс по DateOper
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Фильтрованный?
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Artem Muravlev
Не совсем понял о "форсани". Ты имеешь в виду что он не подхаватывается, или перестороить нужно?
Да, я имею  в виду хинт оптимизатора INDEX с указанием этого индекса.
Что там подхватывается сейчас -- дело 10ое
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Igor Chizhov
Думаю, здесь может помочь фильтрованный индекс по DateOper
фильтрованый по чему?
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
ага, ок. Сейчас попробуем. Почитаем)
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Спасибо!
источник

IC

Igor Chizhov in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
фильтрованый по чему?
Например, за 2020 год: WHERE dataOper >= '2020-01-01'
источник

IC

Igor Chizhov in SqlCom.ru - Стиль жизни SQL
Ilia Zviagin
Да, я имею  в виду хинт оптимизатора INDEX с указанием этого индекса.
Что там подхватывается сейчас -- дело 10ое
Ну разве что для теста годится хинтовать. Если оптимизатор его не берёт, значит на это есть причины.
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
У меня Сайбес, там вроде как такого нельзая сделать((
источник

IZ

Ilia Zviagin in SqlCom.ru - Стиль жизни SQL
Igor Chizhov
Например, за 2020 год: WHERE dataOper >= '2020-01-01'
Можно.... Но почти наверняка им эти индексы нужны будут и по старым данным.
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
Разве что сделать партиции) И по ним локальный индекс
источник

AM

Artem Muravlev in SqlCom.ru - Стиль жизни SQL
* Но это только в теории.
источник