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

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

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


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

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

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

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

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

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

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

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

Если вы загружаете данные в пустую, только что созданную таблицу, то, разумеется, индексы нужно делать после того, как все данные загружены.
Иногда так же поступают с кластерным индексом (например, для многопоточной балк-вставки).
...
Рейтинг: 0 / 0
нужна помощь по индексам
    #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
нужна помощь по индексам
    #39872014
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РоманRКак лучше поступить в данной ситуации?Выгружать в отдельную служебную таблицу, предварительно ее очистив.
После выгрузки переливать полученные данные в основную таблицу. Возможно получится даже с минимальным журналированием.
...
Рейтинг: 0 / 0
нужна помощь по индексам
    #39872125
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Тогда, наверное, перестраивать индекс не имеет смысла.
Вообще есть множество вариантов, зависит от функциональных требований.
Нужно обеспечить минимальное время блокировки, или максимально быструю загрузку? Или, может, максимально высокую производительность?
Данные загружаются равномерно по всей таблице, или какой то кусок? - подумать про секционирование.
Загружает один процесс, или множество, загружается сразу весь объём данных, или множество программ загрузки загружают в цикле по одной строке, разбирая какой то внешний поток?
...
Рейтинг: 0 / 0
нужна помощь по индексам
    #39872193
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Сделайте самодельное секционирование: две таблицы, первая большая, со старыми данными и индексами, вторая пустая (с индексами или без индексов - пробовать надо).
Выгрузку заливаете во вторую, потом запускаете процедуру (её изменить придётся), которая переливает из первой и второй таблиц куда вам надо.
Как отработала - переливаете из второй в первую и чистите вторую.
...
Рейтинг: 0 / 0
нужна помощь по индексам
    #39872239
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GerrosРоманRПри выгрузке - вставка от 100 до 150 000 строк в таблицу. Чаще - от 3000 до 5000, максимум 150 т. это пару раз в месяц.Сделайте самодельное секционирование: две таблицы, первая большая, со старыми данными и индексами, вторая пустая (с индексами или без индексов - пробовать надо).
Выгрузку заливаете во вторую, потом запускаете процедуру (её изменить придётся), которая переливает из первой и второй таблиц куда вам надо.
Как отработала - переливаете из второй в первую и чистите вторую.
И в каком месте этой пляски с бубном возникнет чудесное ускорение?
...
Рейтинг: 0 / 0
нужна помощь по индексам
    #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
нужна помощь по индексам
    #39872800
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222И в каком месте этой пляски с бубном возникнет чудесное ускорение?Цель этой пляски не чудесное ускорение, а равнодушное откладывание на потом неприятного замедления из-за вставки в таблицу с индексами.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / нужна помощь по индексам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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