Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / нужна помощь по индексам / 14 сообщений из 14, страница 1 из 1
04.10.2019, 14:34
    #39871686
РоманR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
MS SQL 2008 R2
Есть выгрузка данных в таблицу из внешних приложений. В таблице около 90 полей, в основном типов varchar(50), decimal(15,2), индексов нет. Данные из этой таблицы используются для получения данных другой таблицы, есть соотв. процедура.

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

Сейчас в таблице порядка 10 млн. строк, но будет 300-400 млн.


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

1. Во время выгрузки данных индекс не держать, а перед выполнением процедуры его создавать, после выполнения снова удалять.
2. может есть более хорошее решение
...
Рейтинг: 0 / 0
04.10.2019, 14:43
    #39871688
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
Я так понимаю, что между получением данных и процедурой заноса их в "другую таблицу" есть определённый зазор по времени, такой чисто административно-организационный? тогда конечно, сразу после получения данных индексируйте, пока не затребовалась процедура.

А если нет - так просто замерьте время "процедура без индекса" и "создание индекса и процедура с ним", ну и поступайте соответственно.
...
Рейтинг: 0 / 0
04.10.2019, 14:44
    #39871689
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманR, Перед загрузкой Alter index disable, для всех индексов, кроме кластерного.
После вставки - ALTER INDEX ALL REBUILD.
...
Рейтинг: 0 / 0
04.10.2019, 15:50
    #39871731
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманRЕсли добавить индекс, то выгрузка данных существенно замедляется и иногда останавливается с ошибкой "Timeout expired", как я понимаю, идет перестройка индекса.

uaggsterРоманR, Перед загрузкой Alter index disable, для всех индексов, кроме кластерного.
После вставки - ALTER INDEX ALL REBUILD.

Знатоки понабежали.

Интересуюсь: каким боком наличие индекса может мешать чтению?

ЗЫ. Не, я, канешно, понимаю, что тредстартер путает право и лево, но обучившись правильной терминологии, он повысит свои шансы.
...
Рейтинг: 0 / 0
04.10.2019, 16:53
    #39871773
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
uaggsterРоманR, Перед загрузкой Alter index disable, для всех индексов, кроме кластерного.
После вставки - ALTER INDEX ALL REBUILD.

Ага, на таблице в 400 млн, а пока идет перестроение - курите бамбук
...
Рейтинг: 0 / 0
04.10.2019, 21:19
    #39871905
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманRЕсть выгрузка данных в таблицу из внешних приложений
сколько строк в выгрузке?
...
Рейтинг: 0 / 0
04.10.2019, 22:10
    #39871919
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманR,

Если вы загружаете данные в пустую, только что созданную таблицу, то, разумеется, индексы нужно делать после того, как все данные загружены.
Иногда так же поступают с кластерным индексом (например, для многопоточной балк-вставки).
...
Рейтинг: 0 / 0
05.10.2019, 13:23
    #39872011
РоманR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
При выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.


КритикuaggsterРоманR, Перед загрузкой Alter index disable, для всех индексов, кроме кластерного.
После вставки - ALTER INDEX ALL REBUILD.

Ага, на таблице в 400 млн, а пока идет перестроение - курите бамбук

Сейчас ALTER INDEX ALL REBUILD занимает около 5 минут. Увеличение по времени прямо пропорционально увеличению количества записей или нет? В запасе пара часов.
...
Рейтинг: 0 / 0
05.10.2019, 13:40
    #39872014
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманRКак лучше поступить в данной ситуации?Выгружать в отдельную служебную таблицу, предварительно ее очистив.
После выгрузки переливать полученные данные в основную таблицу. Возможно получится даже с минимальным журналированием.
...
Рейтинг: 0 / 0
05.10.2019, 23:57
    #39872125
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Тогда, наверное, перестраивать индекс не имеет смысла.
Вообще есть множество вариантов, зависит от функциональных требований.
Нужно обеспечить минимальное время блокировки, или максимально быструю загрузку? Или, может, максимально высокую производительность?
Данные загружаются равномерно по всей таблице, или какой то кусок? - подумать про секционирование.
Загружает один процесс, или множество, загружается сразу весь объём данных, или множество программ загрузки загружают в цикле по одной строке, разбирая какой то внешний поток?
...
Рейтинг: 0 / 0
06.10.2019, 14:16
    #39872193
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
РоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Сделайте самодельное секционирование: две таблицы, первая большая, со старыми данными и индексами, вторая пустая (с индексами или без индексов - пробовать надо).
Выгрузку заливаете во вторую, потом запускаете процедуру (её изменить придётся), которая переливает из первой и второй таблиц куда вам надо.
Как отработала - переливаете из второй в первую и чистите вторую.
...
Рейтинг: 0 / 0
06.10.2019, 18:03
    #39872239
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
GerrosРоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Сделайте самодельное секционирование: две таблицы, первая большая, со старыми данными и индексами, вторая пустая (с индексами или без индексов - пробовать надо).
Выгрузку заливаете во вторую, потом запускаете процедуру (её изменить придётся), которая переливает из первой и второй таблиц куда вам надо.
Как отработала - переливаете из второй в первую и чистите вторую.
И в каком месте этой пляски с бубном возникнет чудесное ускорение?
...
Рейтинг: 0 / 0
07.10.2019, 10:25
    #39872426
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
aleks222Gerrosпропущено...
Сделайте самодельное секционирование: две таблицы, первая большая, со старыми данными и индексами, вторая пустая (с индексами или без индексов - пробовать надо).
Выгрузку заливаете во вторую, потом запускаете процедуру (её изменить придётся), которая переливает из первой и второй таблиц куда вам надо.
Как отработала - переливаете из второй в первую и чистите вторую.
И в каком месте этой пляски с бубном возникнет чудесное ускорение?
Ну, если вставляемые/обновляемые можно каким то образом предварительно статически локализовать, например, вставляются данные только за последний год, или какого-то одного филиала, то всё действительно можно организовать "волшебным" образом.
1. Секционируем таблицу по этому статическому признаку. Выравниваем индексы.
2. Заводим рядом таблицу для загрузки, построенную на той же partition function. Возможно, имеет смысл - создать ее динамически. Таблицу, я имею ввиду.
3. Переливаем в нее данные из секции, которую собираемся модифицировать. insert into ... with (tablock) Select * from ... Where key = ключ секционирования.
4. Делаем Merge загружаемых данных в эту отдельную загрузочную секцию таблицу.
(Ну, или если перезагрузка идет всех данных - пропускаем п.3., а просто льём данные в пустую загрузочную секцию таблицу балком).
5. Включаем на загрузочной секции таблице констрейнты, перестраиваем индексы, пересчитываем статистику.
6. Вышибаем аналогичную секцию в рабочей таблице в пустую секцию, потом делаем свитч загрузочной секции в рабочую таблицу.

Вполне себе рабочая схема. Особенно для хранилищ, из которых непрерывно читают. Ну, или если загружаемые данные сильно разнятся с находящимися в таблице данными, и проще не разбираться, что поменялось, а перезагрузить всё целиком.
Достоинства:
Ничего не блокируется в принципе (переключение контекста, в общем, мгновенная операция), изменения в рабочей таблице, какими бы масштабными они ни были - происходят одномоментно и мгновенно. Момент "мгновенности и одномоментности" - управляется непосредственно dba, и может быть точно журналирован, в бюрократическом смысле, я имею ввиду, журналирован, вплоть до записи ручкой в бумажный журнал.
Начиная с 2016SP2 - можно строить хранилища на версии standard, в которой нет онлайн перестроения индексов.
Недостатки:
Много возни. Нужно много свободного места в базе, как минимум удвоенное количество загружаемого объема данных. Если данные в большой рабочей таблице могут изменяться (например, пользователями) - простая схема уже не пройдет. И, хотя извернуться можно, но геморрой будет жуткий.
Но, в своей узкой нише - почему бы не па?
...
Рейтинг: 0 / 0
07.10.2019, 17:22
    #39872800
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нужна помощь по индексам
aleks222И в каком месте этой пляски с бубном возникнет чудесное ускорение?Цель этой пляски не чудесное ускорение, а равнодушное откладывание на потом неприятного замедления из-за вставки в таблицу с индексами.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / нужна помощь по индексам / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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