|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
Доброго времени суток! Обдумываю вот такую задачку, есть пара мест в довольно старой покупной системе с большим объемом накопленных данных. Мне кажется, что там есть узкое место , и хочется его сгладить. Суть вот в чем (структуру максимально упростил): -- есть таблица, например с некими заданиями/нарядами и т.д. create table dbo.Document(doc_id int identity, date_doc datetime, order_id, cehid .....) -- есть таблица с параметрами документа create table dbo.Document_par(doc_id int , par_id int, value varchar(255) ) В отчетах основные поиски чаще всего выполняются или по дате документа (месяц, год квартал) и/или по заказам, подразделениям (order_id, cehid ), плохая новость в том, что date_doc - это просто дата ввода, а дата отнесения документа хранится в параметре (с опр типом (par_id) в виде текста яля convert(varchar(10) , @dt, 104) ). И поскольку искать надо именно по этому параметру, в отчетах есть куча ухищрений, чтобы делать это побыстрее. Но все равно, не быстро. Мысли вот какие: 1. Приравнять Document.date_doc к значению параметра (или сделать отдельное поле). Хотябы в триггере на апдейт/инсерт таблицы параметров апдейтить дату в основной таблице. Как минимум поиск по дате будет без преобразования типов и разных ухищрений. 2. Есть еще мысль о партиционировании таблицы, хотябы по году. Но тут вопрос не будет ли намного хуже при поиске по заказу или подразделению? З.Ы. Т.е. с чем пытаюсь бороться. Параметры хранящиеся в преобразованном к Varchar виде по которым надо искать, и отсутствие в функционале механизмов некоей архивации что ли, когда неактуальный уже лет 13 объект лежит там же, где и текущие, с которыми идет работа, ежедневно бэкапится. И соотношение активных к закрытым наверное 10 на 90 %. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 16:34 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich, создайте persistent вычисляемый столбец, создайте индекс по столбцу. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 16:48 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
У вас, что есть возможность безболезненно менять структуру таблицы покупной системы ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 17:58 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich, >>а дата отнесения документа хранится в параметре (с опр типом (par_id) в виде текста яля convert(varchar(10) , @dt, 104) ). У вас же наверняка куча отчетов завязана на эту дату, попробуйте обойтись фильтрованным индексом по par_id ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 18:07 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich Доброго времени суток! Обдумываю вот такую задачку, есть пара мест в довольно старой покупной системе с большим объемом накопленных данных. Мне кажется, что там есть узкое место , и хочется его сгладить. Суть вот в чем (структуру максимально упростил): -- есть таблица, например с некими заданиями/нарядами и т.д. create table dbo.Document(doc_id int identity, date_doc datetime, order_id, cehid .....) -- есть таблица с параметрами документа create table dbo.Document_par(doc_id int , par_id int, value varchar(255) ) В отчетах основные поиски чаще всего выполняются или по дате документа (месяц, год квартал) и/или по заказам, подразделениям (order_id, cehid ), плохая новость в том, что date_doc - это просто дата ввода, а дата отнесения документа хранится в параметре (с опр типом (par_id) в виде текста яля convert(varchar(10) , @dt, 104) ). И поскольку искать надо именно по этому параметру, в отчетах есть куча ухищрений, чтобы делать это побыстрее. Но все равно, не быстро. Мысли вот какие: 1. Приравнять Document.date_doc к значению параметра (или сделать отдельное поле). Хотябы в триггере на апдейт/инсерт таблицы параметров апдейтить дату в основной таблице. Как минимум поиск по дате будет без преобразования типов и разных ухищрений. 2. Есть еще мысль о партиционировании таблицы, хотябы по году. Но тут вопрос не будет ли намного хуже при поиске по заказу или подразделению? З.Ы. Т.е. с чем пытаюсь бороться. Параметры хранящиеся в преобразованном к Varchar виде по которым надо искать, и отсутствие в функционале механизмов некоей архивации что ли, когда неактуальный уже лет 13 объект лежит там же, где и текущие, с которыми идет работа, ежедневно бэкапится. И соотношение активных к закрытым наверное 10 на 90 %. Секционирование таблиц помогает исключительно в случаях изменения данных в этих талицах (нет есть конечно у оптимизатора функциональность когда он не лазит в лишние секции если запрос написан правильно, но это лишь малая часть в работе оптимизатора и врядли вам это поможет), у вас вроде как проблема с чтением этих данных, а это значит, копать вам надо в сторону индексов, они гораздо эффективнее борются со сканами таблиц:) Плюс ничего не сказано про обьемы, секционирование оправдано бывает при объемах от сотен миллионов строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 18:43 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich, Создайте индепксированное представление. Примерно такое Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 19:17 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
Спасибо за ответы! Сделал некие предварительные выводы для себя - объем таблицы с параметрами порядка одной сотни миллионов записей, основная таблица - пара десятков миллионов. На вскидку думать о секционировании надо в последнюю очередь. С индексированными вьюхами попробую аккуратно, насколько я понимаю в запросе с условием вида convert(datetime, doc_date, 104) > .... оптимизатор может использовать данную вьюху и индекс без необходимости переписывания запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 07:11 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich, а Вы не думали партицировать по par_id глобально для всех параметров или применительно к конкретной задаче на 2 части, параметр дата и все остальные? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 12:46 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
ShIgor а Вы не думали партицировать по par_id глобально для всех параметров или применительно к конкретной задаче на 2 части, параметр дата и все остальные? denis_viktorovich думать о секционировании надо в последнюю очередь ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:34 |
|
целесообразность партиционирования таблиц
|
|||
---|---|---|---|
#18+
denis_viktorovich С индексированными вьюхами попробую аккуратно, насколько я понимаю в запросе с условием вида convert(datetime, doc_date, 104) > .... оптимизатор может использовать данную вьюху и индекс без необходимости переписывания запроса. К тому же подход можно будет использовать для некоторых других параметров, для которых часто делается поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 18:37 |
|
|
start [/forum/topic.php?fid=46&fpage=76&tid=1686763]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 157ms |
0 / 0 |