Як я можу сказати, Чому вставка на певній таблиці повільна?


29

Я знаю, що ВСТУП в таблиці SQL може бути повільним з будь-якої кількості причин:

  • Наявність INSERT TRIGGER на столі
  • Багато примусових обмежень, які потрібно перевірити (як правило, іноземні ключі)
  • Сторінка розділяється в кластерному індексі, коли рядок вставляється в середині таблиці
  • Оновлення всіх пов'язаних некластеризованих індексів
  • Блокування від іншої активності на столі
  • Поганий час відповіді на запис IO
  • ... що я пропустив?

Як я можу визначити, хто відповідає за конкретний випадок? Як я можу виміряти вплив розбиття сторінки проти некластеризованих оновлень індексу проти всього іншого?

У мене є збережена програма, яка вставляє приблизно 10 000 рядків одночасно (з таблиці темп), що займає приблизно 90 секунд на 10 к рядків. Це неприпустимо повільно, оскільки це призводить до того, що інші павуки вичерпаються.

Я переглянув план виконання, і бачу завдання INSERT CLUSTERED INDEX та всі INDEX ПОТРІБНІ з пошукових запитів FK, але він все ще не каже мені точно, чому це займає так багато часу. Ніяких тригерів немає, але в таблиці є кілька FKeys (які здаються правильно індексованими).

Це база даних SQL 2000.


Чи увімкнено автоматичне розгортання у файлах даних? Це може спричинити проблеми з роботою з конфігурацією за замовчуванням.
Ларрі Коулман

Ми говоримо про використання профілера? msdn.microsoft.com/en-us/library/ms187929.aspx
Incognito

@Larry: Файли даних мають вільний простір, тому я не вважаю, що зростання файлів даних є проблемою. Хоча все-таки додати до списку "речі для перевірки".
BradC

@ user210: Профілювання завершення оператора просто показує мені, що це зайняло 90 секунд, і це не говорить мені ЧОМУ. Якщо немає інших подій, які, на вашу думку, були б більш показовими.
BradC

Відповіді:


10

Деякі речі, які ви можете подивитися ...

Зменшіть розмір партії з 10000 до чогось меншого розміру, наприклад, 2000 або 1000 (ви не сказали, наскільки великий розмір рядка).

Спробуйте ввімкнути статистику IO, щоб побачити, скільки IO займає пошук у FK.

Чим викликане очікування, коли вставка відбувається (master.dbo.sysproces)?

Почнемо тут і подивимось, куди ми йдемо.


2
Зменшення розміру партії допомагає (1000 записів займає ~ 25 секунд). Мабуть, це буде наш нинішній "вирішення". Я побачу, чи зможу я визначити статистику IO та чекає (завдання виконується на вимогу клієнта, коли у нього буде оброблятися файл, тому я не завжди можу передбачити, коли робота буде фактично виконана).
BradC

7

Бред,

Ви повинні вивчити статистику очікування вашого запиту. За допомогою SQL2000 ви можете використовувати синтаксис DBCC SQLPERF ("станції очікування"), щоб отримати ці деталі.


6

Я можу сказати, що шукаю, аналізуючи ефективність запиту. Можливо, це допомагає.

  • проаналізувати план виконання запитів та перевірити наявність індексів, сканування таблиць, використання функцій conver_implicit для типів даних sql, паралелізм.
  • запустіть запит за допомогою SET STATISTICS IO ON і SET STATISTICS TIME ON, щоб побачити час виконання та прочитати / записати io для кожної вставки.
  • перевірте час очікування у системних процесів для вашого сеансу spid.
  • запустіть профілер і виберіть стандартний шаблон. виберіть наступне: Статистика продуктивності (якщо повторюється, тоді ваш план складено багато разів - непогано), RPC: завершено, SQL: пакетно завершено і SQL: пакетне запуску. Додайте до них колонки rowcounts , щоб побачити саме кількість рядків в пакеті. Фільтруйте результати, щоб побачити лише ваш запит.
  • нарешті, збирайте лічильник тривалості життя сторінки з вікна perfmon, і якщо вона нижче 300 (5 хв), то SQL має мало пам'яті. Також збирайте дискові лічильники: довжина дискової черги , час диска (диск ваших файлів даних), час диска (ваш файл файлів журналу), щоб побачити чи є тиск на диски.

5

Спробуйте скористатися:

SET STATISTICS IO ON

і

SET STATISTICS PROFILE ON

СТАТИСТИКА ІО

Може бути корисним для того, щоб розповісти, у яких таблицях проводиться найбільша кількість сканувань таблиць, логічних читань та фізичних зчитувань (я використовую ці три, щоб зосередитись на тому, яка частина плану запитів потребує найбільшої настройки)

ПРОФІЛЬ СТАТИСТИКИ

Перш за все повернеться план запиту в табличному форматі, ви можете подивитися в стовпцях IO та процесора на те, що коштує найбільшу суму в запиті (чи це сканування таблиці на вашій таблиці temp порівняно з тим, як це робиться для вставки у ваш кластерний ключ тощо ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.