Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Доброго времени суток.

...Часа два бродил по сети сегодня, не нашел приемлемого решения.
Есть проблема.
Таблица, полей 30. И около 150-ти млн записей. PK - одно поле. Целочисленный.
Надо вставить 10 млн.
Но вставить так, чтобы надолго не лочить её длинной транзакцией, ибо по чтению и записи на таблицу транзакции идут постоянно.
Видел решения с циклами WHILE @@rowcount... и т.д.
Очень не нравится то, что внутри цикла надо постоянно переспрашивать таблицу-источник, которая тоже как бы 10 млн...

Вот, в связи с этим вопрос, есть ли какой-нибудь красивый способ вставить 10 млн блоками, скажем, по 5000 записей, делая при этом запрос к источнику не 2000 раз?
30 апр 15, 21:29    [17589327]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Будет ли нормальным решение сделать сперва некую хинт-табличку с ключами источника для вставки блоками?
Ну, что-то типа:


RID    ID_start   ID_finish
1      1000000001 1000005001
2      1000005002 1000010003
3      1000010004 1000015005
4      1000015006 1000020007
5      1000020008 1000025009
6      1000025010 1000030011


И потом в цикле переспрашивать уже её?
30 апр 15, 21:56    [17589438]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Makar4ik
Вот, в связи с этим вопрос, есть ли какой-нибудь красивый способ вставить 10 млн блоками, скажем, по 5000 записей, делая при этом запрос к источнику не 2000 раз?
Если есть способ эффективно запросить из таблички только часть данных, то совокупная стоимость множества запросов будет почти такая же, как и одного запроса. Например, если кластерный индекс по дате, и запрашиаете в цикле по дням.
Или если равномерны инкремент, то тоже можно вычислить диапазоны.

В противном случае можно сделать, например, так, как вы написали, вспомогательную табличку с диапазонами.
30 апр 15, 22:11    [17589509]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
alexeyvg,

Кластерного нет.
Политика архитекторов базы.
30 апр 15, 22:14    [17589523]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
alexeyvg,

инкремент тоже не равномерный, и вообще, я упростил задачу. В реале уникальный индекс - составной.
30 апр 15, 22:16    [17589527]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Makar4ik,

Тогда без дополнительных накладных расходов не обойтись. Даже с вашей "хинт-табличкой" придётся доставать записи из разных страниц.
30 апр 15, 22:22    [17589548]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Makar4ik
инкремент тоже не равномерный, и вообще, я упростил задачу. В реале уникальный индекс - составной.
Лучше не упрощать, могут же быть и ньюансы...
30 апр 15, 22:22    [17589551]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
alexeyvg,

но ведь с ней внутри цикла - всё равно я смогу обойтись без этих телодвижений, типа:
select @@rowcount
select max(id) from... where...
Идиотизм же!
А так... Пару раз сгруппировал вложенный запрос, и получил список индексов...
30 апр 15, 22:25    [17589563]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
alexeyvg
Makar4ik
инкремент тоже не равномерный, и вообще, я упростил задачу. В реале уникальный индекс - составной.
Лучше не упрощать, могут же быть и ньюансы...
Политика компании о неразглашении ньюансов.
30 апр 15, 22:28    [17589572]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
alexeyvg
Makar4ik
инкремент тоже не равномерный, и вообще, я упростил задачу. В реале уникальный индекс - составной.
Лучше не упрощать, могут же быть и ньюансы...
Более того, принудительные хинты индексов к каждому селекту и джоину.
Обязательно.
И принудительный OPTION (LOOP JOIN, FORCE ORDER, KEEPFIXED PLAN)
тоже обязательно.
30 апр 15, 22:40    [17589634]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
Makar4ik,

+

что то синтаксис диасофтом попахивает :D
1 май 15, 09:43    [17590532]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Совершенно верно :)
Как мне объяснили:
Diasoft
"такой синтаксис разработан для гарантированного выполнения запроса за пусть и не оптимальное, но разумное время. Вне зависимости от слетевших статистик, или задумчивости планировщика".
ну и
Diasoft
Разумеется, клиенты всегда могут менять/убирать хинты на свой страх и риск, но в качестве универсального решения это пока является стандартом.
1 май 15, 16:25    [17591250]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
...Кстати, есть ли смысл в том, чтобы поубивать эти хинты, и дать поработать планировщику?
1 май 15, 16:33    [17591271]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Makar4ik, они же гарантируют среднее время при отсутствии обслуживания баз. А так никто ничего не гарантирует.
1 май 15, 17:56    [17591540]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Makar4ik
...Кстати, есть ли смысл в том, чтобы поубивать эти хинты, и дать поработать планировщику?


заодно и диасофт
2 май 15, 16:30    [17594383]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Winnipuh
Makar4ik
...Кстати, есть ли смысл в том, чтобы поубивать эти хинты, и дать поработать планировщику?


заодно и диасофт
Лан, лан, понял, был неправ.
Хоть хинты и зло, но видать, не в этом случае.
2 май 15, 21:30    [17594887]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
А вот хинт-табличка со списком диапазонов ключей - пошла на ура! :)

...ну по крайней мере, заметно эффективнее, чемпрошлое решение с тремя запросами внутри while

  1. 
    set rowcount 500
    insert #t(...) from... where where ContractID > @ContractID

  2. (основной)
    set rowcount 0
	...основной запрос
	update ... set... from #t.... where ContractID....

  3.
    select @ContractID = max(ContractID)
      from #t
     where ContractID > @ContractID
2 май 15, 21:33    [17594893]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Решил проблему вот так:

declare XXXXX_cur cursor for
  select min(id) as startID, max(id) as endID 
    from (
         SELECT row_number() over(ORDER BY p1.id ASC) as rowid, --ВОТ тут слабое место, это НЕ SQL-92, но меня это не касается.
                p1.id
           from p1 as p1
         ) z
   group by rowid / 25000 
   order by rowid / 25000 
2 май 15, 21:35    [17594896]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
Makar4ik,


за то что люди из диасофта даже в самый миниатюрный селект хотят вставить конструкцию OPTION + указывать индексы к каждой таблице (причем в большинстве случаев ни разу не те которые были бы необходимы) я бы предлагал карать с помощью огненных столбов


в большинстве случаем избавьтесь от данного сумасбродства и увидите прирост производительности.
а еще лучше куски кода которые особо сильно тормозят переписывать вручную, ибо иногда логика данного продукта переходит на уровень черной магии африканских жрецов, ну или откровенное вангование
4 май 15, 22:45    [17599497]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
felix_ff
Makar4ik,


за то что люди из диасофта даже в самый миниатюрный селект хотят вставить конструкцию OPTION + указывать индексы к каждой таблице (причем в большинстве случаев ни разу не те которые были бы необходимы) я бы предлагал карать с помощью огненных столбов


в большинстве случаем избавьтесь от данного сумасбродства и увидите прирост производительности.
а еще лучше куски кода которые особо сильно тормозят переписывать вручную, ибо иногда логика данного продукта переходит на уровень черной магии африканских жрецов, ну или откровенное вангование
С патчами у них не всё так строго.
Там можно и без option, и конструкции типа row_number() over(ORDER BY p1.id ASC), и временные таблицы, и любые индексы дропать-создавать...

Но вот в боевом режиме это шаманство - вроде как банковская политика: "мы не самые быстрые, зато гарантированно доедем".
7 май 15, 00:12    [17610262]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
felix_ff
Makar4ik,


за то что люди из диасофта даже в самый миниатюрный селект хотят вставить конструкцию OPTION + указывать индексы к каждой таблице (причем в большинстве случаев ни разу не те которые были бы необходимы) я бы предлагал карать с помощью огненных столбов


в большинстве случаем избавьтесь от данного сумасбродства и увидите прирост производительности.
а еще лучше куски кода которые особо сильно тормозят переписывать вручную, ибо иногда логика данного продукта переходит на уровень черной магии африканских жрецов, ну или откровенное вангование

...Да, а по поводу LOOP JOIN и FORCE ORDER...
Ну, бывает, попадаются неоптимальные ордеры джоинов, и неоптимальные указания индексов...
Наверняка, просто писаны давно.
Там в коде даже встречаются джоины без явного указания, а просто через запятую.
Это как я слышал, у них запрещено лет пять как уже. Старый код.

Но все эти хинты, как раз и нужны, чтобы было гаратнировано конечное время исполнения при полном отсутствии обслуги базы.
И loop join тоже. Hash бывает и слетает в бесконечность при совсем кривой статистике
7 май 15, 00:18    [17610273]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
felix_ff
за то что люди из диасофта даже в самый миниатюрный селект хотят вставить конструкцию OPTION + указывать индексы к каждой таблице (причем в большинстве случаев ни разу не те которые были бы необходимы) я бы предлагал карать с помощью огненных столбов
И да, ещё.
Эти люди не хотят.
Их там принуждают. Это интеллектуальное рабство, господа!!!
7 май 15, 00:23    [17610289]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Makar4ik
Вот, в связи с этим вопрос, есть ли какой-нибудь красивый способ вставить 10 млн блоками, скажем, по 5000 записей, делая при этом запрос к источнику не 2000 раз?
SSIS.
8 май 15, 02:39    [17615960]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Makar4ik
...Да, а по поводу LOOP JOIN и FORCE ORDER...
Ну, бывает, попадаются неоптимальные ордеры джоинов, и неоптимальные указания индексов...
Это каждый запрос нужно писать так что бы порядок соединения был более-менее правильный, с учетом последующего добавления данных, значений параметров и прочего. ИМХО маразм полнейший.

Makar4ik
Но все эти хинты, как раз и нужны, чтобы было гаратнировано конечное время исполнения при полном отсутствии обслуги базы.
А еще наверное эти хинты обеспечат восстановление БД при полном отсутствии бэкапов?

Makar4ik
И loop join тоже. Hash бывает и слетает в бесконечность при совсем кривой статистике
А loop join никогда не слетает в бесонечность?
8 май 15, 02:49    [17615963]     Ответить | Цитировать Сообщить модератору
 Re: Вставка блоками...  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Mind
Это каждый запрос нужно писать так что бы порядок соединения был более-менее правильный, с учетом последующего добавления данных, значений параметров и прочего. ИМХО маразм полнейший.
А теперь представьте полностью не обслуживаемую базу весом в 2 терабайта. Без статистик даже. И жесточайшие требования по надёжности исполнения кода.
Контора-разработчик не платит денег админам у заказчиков. Так что уж там у них творится - одному будде известно.
...Да и про порядок соединения... Вот сегодня один такой переписал. Быстрее стало всего-то на 15-25%.
Зато чтений стало в 10 раз меньше. А это актуально, когда их полмиллиона...
Mind
Makar4ik
Но все эти хинты, как раз и нужны, чтобы было гаратнировано конечное время исполнения при полном отсутствии обслуги базы.
А еще наверное эти хинты обеспечат восстановление БД при полном отсутствии бэкапов?
Нет, но от полного отсутствия бэкапов обычно спасают штрафы и увольнения.
Mind
Makar4ik
И loop join тоже. Hash бывает и слетает в бесконечность при совсем кривой статистике
А loop join никогда не слетает в бесонечность?
Никогда. HASH JOIN тоже вроде никогда, но без статистики его иногда весело тестить...
Раз в 100 медленнее зачастую.
15 май 15, 23:48    [17647918]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить