Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Производительность при расчёте T-SQL  [new]
bascomo
Member

Откуда: Москва
Сообщений: 114
Добрый день,

кто-нибудь сталкивался с расчётом дебиторской / просроченной дебиторской задолженности в динамике, на каждый день?
Необходимо посчитать два поазателя: ДЗ и ПДЗ по каждому клиенту, его договорам в разрезе дат.

Собственно, проблема в производительности, т.к. рассчитать на каждый день за 14 лет по 1к+ клиентов и ещё большему количеству договоров получается крайне медленной задачей.

По текущему решению расчёт по одному клиенту занимает приблизительно 2 минуты.

Источники данных - две таблицы
1 - Отгрузки, где указана а) дата отгрузки, б) дата, после которой ДЗ становится ПДЗ, и в) Сумма
2 - Даты и суммы оплат, связаннные с каждой записью из (1) по RecID PK.

По структуре сейчас - 1) объединение записей из двух таблиц в единый набор, 2) создание календаря и 3) расчёт для каждой записи ДЗ/ПДЗ вложенными запросами.

Кто-нибудь может подсказать более производительный подход?

К сообщению приложен файл. Размер - 1Kb
10 мар 16, 15:12    [18915969]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
bascomo
Member

Откуда: Москва
Сообщений: 114
Источники данных - две таблицы
1 - Отгрузки, где указана а) дата отгрузки, б) дата, после которой ДЗ становится ПДЗ, и в) Сумма
2 - Даты и суммы оплат, связаннные с каждой записью из (1) по RecID PK.


В первой таблице - 2,6 млн. записей, во второй - 4,7
10 мар 16, 15:15    [18915985]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
DirksDR
Member

Откуда: Пермь
Сообщений: 340
bascomo
расчёт по одному клиенту занимает приблизительно 2 минуты.

Я бы объединил обе таблицы в курсор, отсортированный по клиенту, договору, дате отгрузки/оплаты.
Потом за один проход по курсору по каждому клиенту посчитал задолженности.
При таком объеме данных, для всех клиентов должно получиться менее 2 минут.
10 мар 16, 15:23    [18916045]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
bascomo
Member

Откуда: Москва
Сообщений: 114
DirksDR,

Без календаря? Мне нужно обеспечить расчёт не только на даты возникновения задолженности/оплаты, а на каждую дату всего периода, где задолженность не нулевая, по крайней мере.

А так как вы предлагаете - получатся только выборочные даты транзакций.

Или я чего-то не понял?
10 мар 16, 15:59    [18916245]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
bascomo,

Если у вас есть проблемы с производительностью t-sql запросов, задавайте вопросы на правильном форуме, тут обсуждают DWH и MDX.

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

Модератор: Тема перенесена из форума "OLAP и DWH".


Сообщение было отредактировано: 12 мар 16, 14:52
11 мар 16, 14:33    [18920048]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
А разве в таких задачах не делают закрытие периода. С подсчетам всего и вся сохраненными?
13 мар 16, 11:38    [18925082]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
bascomo
Кто-нибудь может подсказать более производительный подход?

Делать и сохранять рассчеты при изменении данных
13 мар 16, 12:12    [18925115]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
Crazy_Driver
Member

Откуда: α2000 = 14ч39м36с,5, δ2000 = -60°50'02"
Сообщений: 876
Подход в лоб:
1) Оценить загруженность сервера при выполнении расчета
2) При наличии простаивающих ядер процессоров - разделить клиентов по группам по какому-нибудь признаку
3) Запускать расчеты по группам параллельно согласно количеству ядер процессоров.
13 мар 16, 14:08    [18925265]     Ответить | Цитировать Сообщить модератору
 Re: Производительность при расчёте T-SQL  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
bascomo, Вам правда всегда нужна вся история за 14 лет? Может быть, чаще нужна последняя пара месяцев? Можно построить таблицу (или может быть, индексированное представление), в котором хранить последнее значение задолженности по каждому клиенту (и если надо - договору). Она получится небольшой. И присоединять к ней хвост истории отгрузок и оплат по датам, сколько её реально нужно. Тогда при наличии правильных индексов, последние месяцы будут считаться быстро, а чем глубже в историю - тем медленнее.
13 мар 16, 18:46    [18925757]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить