SQL-сервер удаляет замедленный решительно индексами

Я запускаю скрипт архива, который удаляет строки из большого (~50m, записывают DB) на основе даты, они вводились. Поле даты является кластерным индексом на таблице, и таким образом к чему я применяю свой условный оператор.

Я работаю, это удаляет в некоторое время цикле, пробуя что-либо от 1 000 до 100 000 записей в пакете. Независимо от пакетного размера это удивительно медленно; что-то как 10 000 записей, удаляемых минута. При рассмотрении плана выполнения существует много времени, проведенного на "Индексе, Удаляют" s. В таблице существует приблизительно 15 полей, и у примерно 10 из них есть своего рода индекс на них. Там какой-либо путь состоит в том, чтобы обойти эту проблему? Я даже не уверен, почему это занимает много времени, чтобы сделать, каждый индекс удаляет, кто-то может пролить некоторый свет на точно, что происходит здесь? Это - образец моего плана выполнения:

сопроводительный текст http://img94.imageshack.us/img94/1006/indexdelete.png

(Последовательность указывает на команду Delete),

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

5
задан Brian Tompsett - 汤莱恩 6 July 2015 в 11:24
поделиться

5 ответов

Удаление 10K записей из кластеризованного индекса + 5 не кластеризованных, которые должны определенно не занимать 1 минуту. Похоже, у вас действительно действительно медленный подситем IO. Каковы значения для:

  • AVG. Диск SEC / WRITE
  • AVG. Диск SEC / READ
  • AVG. Длина очереди записи диска
  • AVG. Длина очереди чтения диска

на каждом диске, участвующем в операции (включая журналы!). Если вы поместили индексы в отдельных файловых группах и выделили каждую файлугруппу к собственной LUN или собственным дискам, вы можете определить, какие индексы более проблематичны. Кроме того, флейм журнала может быть основным узким местом. SQL Server не имеет большого контроля здесь, все в ваших руках, как ускорить вещи. Это время не проводится в циклах ЦП, расходуется в ожидании завершения IO, и вам нужна подсистема IO, откалиброванная для нагрузки, которую вы требуете.

Чтобы уменьшить нагрузку на IO, вы должны посмотреть в создание индексов уже. В первую очередь убедитесь, что кластерный индекс является самым узким, который работает. Затем убедитесь, что некластевные индексы не включают в себя спортивные неиспользованные большие столбцы (я видел это ...). Основным усилением может быть предоставлено сжатие страницы . И в конечном счете, проверьте статистику использования индекса в SYS.DM_DB_INDEX_USAGE_STATS и см. Если какой-либо индекс хорошо для топора.

Если вы не можете уменьшить нагрузку на io много, вы должны попытаться разделить его. Добавьте файловые группы в базу данных, переместите большие индексы на отдельные файловые группы, поместите файловые группы на отдельные пути IO (отчетливые шпиндели).

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

6
ответ дан 18 December 2019 в 14:46
поделиться

Предположим, что для каждой записи в таблице есть 5 индексных записей.

Теперь каждая удаление в сущности 5 операций.

Добавьте к этому, у вас есть кластерный индекс. Обратите внимание на кластеризованный индекс Удаление времени огромно? (10x) дольше, чем другие индексы? Это потому, что ваши данные реорганизуются с каждой записью записи.

Я бы предложил бросить, по крайней мере, этот индекс, делая массу удаления, чем повторно повторно. Индексные операции на удалении и вставки по своей природе дорого. Один восстановитель, вероятно, намного быстрее.

3
ответ дан 18 December 2019 в 14:46
поделиться

Трики, это, поскольку нет единого согласованного стиля, которому следовали бы все приложения. Как вы говорите, они (широко) синонимы.

По правде говоря, это не имеет значения до тех пор, пока ваша ожидаемая аудитория понимает, что вы имеете в виду.

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

Ниже приведен примерный интерес Visual Studio и других продуктов Microsoft:

  • Свойства представляют характеристики одного компонента или объекта в приложении.
  • Параметры изменяют глобальные способы работы приложения. Продукты Microsoft используют его, например, для настройки панели инструментов пользовательского интерфейса. Здесь подразумевается, что можно вообще отключить элементы пользовательского интерфейса (например, «простой» интерфейс пользователя или «расширенный» интерфейс пользователя).
  • Настройки и Настройки изменяют качество работы приложения. Здесь подразумевается изменение, а не отключение: например, «Метрические измерения» или «Британские имперские измерения».
  • Конфигурация часто используется для настройки приложения для каждого пользователя или группы.

Но нет единого правила.

Я бы посоветовал использовать свойства для характеристик объекта и настройки для всего остального в рамках всего приложения.

-121--707266-

Подавляющее большинство кода, который пишут люди, будет связан вводом/выводом (я считаю, что весь код, который я написал за деньги за последние 30 лет, был так связан), поэтому деятельность оптимизатора для большинства людей будет академической.

Однако я хотел бы напомнить людям, что для оптимизации кода необходимо указать компилятору, как оптимизировать его - многие люди (включая меня, когда я забываю) выкладывают здесь тесты C++, которые бессмысленны без включения оптимизатора.

-121--685219-

Я повторил предложение @ NickLarsen в комментарии. Проверьте наличие неиспользуемых индексов и удалите их. Это может уменьшить накладные расходы на эти удаления индекса, что может быть достаточно улучшением, чтобы сделать операцию более своевременной.

Другая более радикальная стратегия состоит в том, чтобы удалить все индексы, выполнить удаление и затем быстро воссоздать индексы для меньшего набора данных. Это не обязательно прерывает обслуживание, но это, вероятно, может сделать запросы намного медленнее в то же время. Хотя я не являюсь экспертом Microsoft SQL Server, поэтому вы должны воспользоваться моим советом по этой стратегии с зерном соли.

2
ответ дан 18 December 2019 в 14:46
поделиться

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

Затем вы можете запланировать удаление или архивирование этих записей для неработающих часов.

1
ответ дан 18 December 2019 в 14:46
поделиться

Это потребовало бы некоторую работу, чтобы реализовать его приведено в продукции, но если вы находитесь на SQL Server 2005/2008, вы должны исследовать и преобразовать таблицу для разделения, то удаление старых данных может быть достигнуто чрезвычайно быстро. Он предназначен для эффекта типа «Rolling Window» и предотвращает широкую масштабную масштабную масштабную плату за стол / процесс.

К сожалению, с таблицей в производстве, мигрируя его в эту технику, потребует некоторой кодирования T-SQL, знания и выходные, чтобы обновить / мигрировать его. Когда-то на месте, хотя любые существующие вылеты и вставки будут работать против нее легко, обслуживание раздела и добавление / удаление - это то, где вам нужен T-SQL для управления процессом.

1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: