powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / целесообразность партиционирования таблиц
10 сообщений из 10, страница 1 из 1
целесообразность партиционирования таблиц
    #39904192
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 %.
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904205
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

создайте persistent вычисляемый столбец, создайте индекс по столбцу.
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904271
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас, что есть возможность безболезненно менять структуру таблицы покупной системы ???
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904279
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

>>а дата отнесения документа хранится в параметре (с опр типом (par_id) в виде текста яля convert(varchar(10) , @dt, 104) ).

У вас же наверняка куча отчетов завязана на эту дату, попробуйте обойтись фильтрованным индексом по par_id
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904305
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 %.


Секционирование таблиц помогает исключительно в случаях изменения данных в этих талицах (нет есть конечно у оптимизатора функциональность когда он не лазит в лишние секции если запрос написан правильно, но это лишь малая часть в работе оптимизатора и врядли вам это поможет), у вас вроде как проблема с чтением этих данных, а это значит, копать вам надо в сторону индексов, они гораздо эффективнее борются со сканами таблиц:)
Плюс ничего не сказано про обьемы, секционирование оправдано бывает при объемах от сотен миллионов строк.
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904327
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

Создайте индепксированное представление. Примерно такое
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create view dbo.vDocument_date
with schemabinding
as
select
 doc_id,
 convert(datetime, value, 104) as dt
from
 dbo.Document_par
where
 par_id = ...
go

create unique clustered index UCIX_vDocument_date__doc_id on dbo.vDocument_date (doc_id);
create index UCIX_vDocument_date__dt on dbo.vDocument_date (dt);
go
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904441
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы!
Сделал некие предварительные выводы для себя - объем таблицы с параметрами порядка одной сотни миллионов записей, основная таблица - пара десятков миллионов. На вскидку думать о секционировании надо в последнюю очередь.
С индексированными вьюхами попробую аккуратно, насколько я понимаю в запросе с условием вида convert(datetime, doc_date, 104) > .... оптимизатор может использовать данную вьюху и индекс без необходимости переписывания запроса.
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39904649
ShIgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

а Вы не думали партицировать по par_id глобально для всех параметров или применительно к конкретной задаче на 2 части, параметр дата и все остальные?
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39905003
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShIgor
а Вы не думали партицировать по par_id глобально для всех параметров или применительно к конкретной задаче на 2 части, параметр дата и все остальные?
Если есть кластерный или покрывающий индекс на par_id, то эффект будет тот же, что и для секционирования по par_id, но без излишнего усложнения.
denis_viktorovich
думать о секционировании надо в последнюю очередь
В этой задаче секционирование ещё может замедлить, но ускорить точно не может.
...
Рейтинг: 0 / 0
целесообразность партиционирования таблиц
    #39905005
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich
С индексированными вьюхами попробую аккуратно, насколько я понимаю в запросе с условием вида convert(datetime, doc_date, 104) > .... оптимизатор может использовать данную вьюху и индекс без необходимости переписывания запроса.
Да, это хорошие варианты, может, обойдётесь без добавления поля в документы, с переписыванием запросов.
К тому же подход можно будет использовать для некоторых других параметров, для которых часто делается поиск.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / целесообразность партиционирования таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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