|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Всем добра. Имеется процедура, в которой создается и наполняется временная таблица, которая затем "апдейтится". Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Приведены не все поля и формула (SET) естественно более сложная, не суть. В таблице порядка 500 млн строк. Каждый шаг порядка 15 минут (около 200 млн строк затрагивается) Попробовал добавить индексы StoreID и GoodID - заметного прироста не получилось, а вот на построение индекса времени ушло... Вопрос - поможет ли в данном случае добавление ID INT IDENTITY(1,1) PRIMARY KEY? Или нужно дробить запросы на более мелкие (по StoreID или GoodID) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:06 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQLВопрос - поможет ли в данном случае добавление ID INT IDENTITY(1,1) PRIMARY KEY? У вас нет кластерного индекса на таблице? Сначала стоит определиться, у вас соединение долго выполняется или только обновление. Сделайте SELECT вместо UPDATE. Вместо цикла почему не соединяться с календариком понедельников? Это будет одно выполнение вместо десятков. А вообще не очень понятен INNER JOIN таблицы самой с собой по одним и тем же полям. Какой тут смысл, кроме дублирующихся полей и фильтра по дате? Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:32 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
PizzaPizza, в настоящий момент это куча. смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... формула сложная (нужна для дальнейшего анализа). Подключиться к календарю нельзя, т.к. требуется сначала обновить данные с учетом 1-й недели, а ЗАТЕМ по 2-й, ЗАТЕМ по 3-й и тд Данные с каждой итерацией меняются. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:38 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL PizzaPizza, в настоящий момент это куча. смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... формула сложная (нужна для дальнейшего анализа). Подключиться к календарю нельзя, т.к. требуется сначала обновить данные с учетом 1-й недели, а ЗАТЕМ по 2-й, ЗАТЕМ по 3-й и тд Данные с каждой итерацией меняются. Увы и ах. Этот бред ~50 раз напрасно перелопачивает "500 млн строк". Код: sql 1. 2. 3. 4. 5.
Пойдите учиться на курсы "SQL для чайников". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:11 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL PizzaPizza, в настоящий момент это куча. смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... формула сложная (нужна для дальнейшего анализа). Подключиться к календарю нельзя, т.к. требуется сначала обновить данные с учетом 1-й недели, а ЗАТЕМ по 2-й, ЗАТЕМ по 3-й и тд Данные с каждой итерацией меняются. судя по итерационной модели это больше похоже на нарастающий итог и лечится оконками. но может расчет какой то действительно замысловатый, в таком случае при сканировании больших диапазонов вам может поможет некластерный колоночный индекс. индекс по storeId и GooID делать бессмысленно у вас нет такого предиката позволяющего отсечь из выборки превалирующий объем строк. как мне кажется индекс по dt, StoreId, GoodID больше подходит в этом плане ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:20 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... Отдельные индексы по StoreID, GoodID смысла не имеют. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:33 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
alexeyvg Oleg_SQL смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... Отдельные индексы по StoreID, GoodID смысла не имеют. Консилиум у постели мертворожденного? ЗЫ. Прежде чем индексы строгать - запросы надо писать научиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:37 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL, правильно ли я понял вы взяли цену в первый понедельник и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой затем вы взяли цену во второй понедельник (судя по всему, уже изменённую) и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:57 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
andreymx правильно ли я понял вы взяли цену в первый понедельник и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой затем вы взяли цену во второй понедельник (судя по всему, уже изменённую) и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой Oleg_SQL Приведены не все поля и формула (SET) естественно более сложная ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:02 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL Вопрос - поможет ли в данном случае добавление ID INT IDENTITY(1,1) PRIMARY KEY? Или нужно дробить запросы на более мелкие (по StoreID или GoodID) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:04 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
alexeyvg andreymx правильно ли я понял вы взяли цену в первый понедельник и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой затем вы взяли цену во второй понедельник (судя по всему, уже изменённую) и отняли ее у всех строк с таким StoreID и GoodID с более поздней датой Oleg_SQL Приведены не все поля и формула (SET) естественно более сложная ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 21:59 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
alexeyvg А может, лучше одним запросом, без цикла, перелить данные в другую таблицу, сделав все расчёты, а потом сделать переименование? так данные и перелиты в отдельную временную таблицу [#sales] ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 09:08 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
aleks222 Oleg_SQL PizzaPizza, в настоящий момент это куча. смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... формула сложная (нужна для дальнейшего анализа). Подключиться к календарю нельзя, т.к. требуется сначала обновить данные с учетом 1-й недели, а ЗАТЕМ по 2-й, ЗАТЕМ по 3-й и тд Данные с каждой итерацией меняются. Увы и ах. Этот бред ~50 раз напрасно перелопачивает "500 млн строк". Код: sql 1. 2. 3. 4. 5.
Пойдите учиться на курсы "SQL для чайников". Научитесь ВНИМАТЕЛЬНО читать для начала. Приведены не все поля и формула (SET) естественно более сложная, не суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 09:12 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
alexeyvg Oleg_SQL смысл цикла что то вроде накопления - берутся данные по неделе и обновляются более поздние данные и так далее... Отдельные индексы по StoreID, GoodID смысла не имеют. Спасибо, попробую. Почему собственно вопрос то и возник - затраты по времени на построение индекса иногда съедают всю выгоду от них (не менее часа, думаю будет длится). И одной только теорией, без пробы не обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 09:36 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL alexeyvg А может, лучше одним запросом, без цикла, перелить данные в другую таблицу, сделав все расчёты, а потом сделать переименование? так данные и перелиты в отдельную временную таблицу [#sales] Или сразу заливайте в эту с расчётом, чего бы сразу не посчитать правильно, зачем потом корректировать? Oleg_SQL Спасибо, попробую. Почему собственно вопрос то и возник - затраты по времени на построение индекса иногда съедают всю выгоду от них (не менее часа, думаю будет длится). И одной только теорией, без пробы не обойтись. Другое дело, что, возможно, логически вычисления очень непростые, и сложно их переделать на один проход. Но другого выхода нет, придётся поскрипеть мозгами, ибо такой апдэйт - это трэш :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 09:56 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Никакие индексы-шминдексы не помогут, ИМХО. Реально ускориться можно одним способом - как-то реорганизовать работу с данными. Н-р где-то отдельно делать расчеты, а потом накатывать готовые результаты на сабжевую таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:21 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
alexeyvg, Алгоритм расчета такой, что однозначно нужно считать каждую неделю с учетом предыдущих данных. Смысл такой, что для каждого товара нужно брать последнюю цену (акцию, кпи, признаки и тп) и на их основе считать показатели для текущей в итерации недели. Последняя цена не всегда на прошлой неделе - может быть и пол года назад. Сейчас берется неделя и апдейтся все последующие данные (от той недели до сегодня) и так далее. Это позволяет избежать эти пропуски - как только есть цена для товара, то для последующих периодов она уже засветится, и будет неизменна до нового значения. Примитивно, но запрос простой, он работает и выдает верный результат. Можно менять данные не для всего периода, а только для конкретной недели - это все будет на порядок быстрее. Как для 500 млн товаров (по точкам) проапдейтить данные на основе последних показателей по каждому я знаю. Но конструкция выборки этих последних данных выглядит более зловеще ))) В любом случае придется попробовать и его. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:36 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL, У вашего подхода есть две проблемы: 1. Из-за отсутствия ограничений/индексов оптимизатор считает, что одна и та же строка может быть обновлена несколько раз. Поэтому в план будет включено исключение таких дубликатов. 2. Такой update предполагает наличие halloween problem. Соответственно в план будет включена защита, скорее всего в виде Eager Table Spool Если критерий уникальности - (dt, StoreID, GoodID), то сделайте у #sales PK по этим столбцам, dt обязательно должен быть первым. Тогда первая проблема отпадет. Для избавления от второй, предварительно отбирайте строки по dt = @dt во временную таблицу и соответствующим образом перепишите update. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:46 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Для таких алгоритмов надо где-то хранить эти промежуточные данные и считать каждый месяц, например Рассчитывать их каждый раз - моветон ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:48 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
andreymx Для таких алгоритмов надо где-то хранить эти промежуточные данные и считать каждый месяц, например Рассчитывать их каждый раз - моветон Я это все прекрасно понимаю. Но вот данные меняют задним числом (приходят корректировки и тп). Это в 1С есть понятие закрытий период. В данной системе такого нет. Пересчет за 2 месяца выполняется 1 раз в месяц - не так критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:59 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Oleg_SQL, а как вы бухгалтерскую отчетность поддерживаете? Я понимаю, что так поступали в 90х, но сейчас без закрытия периода никак нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 11:25 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Владислав Колосов Oleg_SQL, а как вы бухгалтерскую отчетность поддерживаете? Я понимаю, что так поступали в 90х, но сейчас без закрытия периода никак нельзя. Это данные не для строгой отчетности. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 11:49 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
Олег А сам расчёт работает корректно, Но медленно? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 12:17 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
andreymx Олег А сам расчёт работает корректно, Но медленно? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 12:17 |
|
Большой UPDATE
|
|||
---|---|---|---|
#18+
andreymx andreymx Олег А сам расчёт работает корректно, Но медленно? Работает корректно. Но медленно. Все верно. Запрос написан не мной. И по принципу работает - не трогай я хотел оптимизировать его не внося корректировку в код. Не особо погружаясь в логику. Видимо придется погрузиться и внести кардинальные изменения (чувствую, что это возможно). P.S. Кластерный индекс строится уже более часа... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 12:35 |
|
|
start [/forum/topic.php?fid=46&fpage=39&tid=1685305]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 284ms |
total: | 426ms |
0 / 0 |