it-swarm-eu.dev

Jak zjistím, proč je vložení do určité tabulky pomalé?

Vím, že INSERT na SQL tabulce může být pomalý z mnoha důvodů:

  • Existence INSERT TRIGGERů na stole
  • Mnoho vynucených omezení, která je třeba zkontrolovat (obvykle cizí klíče)
  • Rozdělení stránky do seskupeného indexu, když je řádek vložen do středu tabulky
  • Aktualizace všech souvisejících neseskupených indexů
  • Blokování z jiné aktivity na stole
  • Špatná IO doba odezvy zápisu)
  • ... něco, co mi chybělo?

Jak zjistím, kdo je v mém konkrétním případě odpovědný? Jak mohu měřit dopad rozdělení stránek vs. neskupovaných aktualizací indexů vs všechno ostatní?

Mám uložený proc, který vkládá asi 10 000 řádků najednou (z dočasné tabulky), což trvá asi 90 sekund na 10 000 řádků. To je nepřijatelně pomalé, protože způsobuje vypršení časového limitu ostatních spid.

Podíval jsem se na plán provádění a vidím úkol INSERT CLUSTERED INDEX a všechny INDEX SEEKS z vyhledávání FK, ale stále mi to neřekne, proč to trvá tak dlouho. Žádné spouštěče, ale tabulka má hrst FKeys (které se zdají být správně indexovány).

Toto je databáze SQL 2000.

30
BradC

Některé věci, na které se můžete podívat ...

Zmenšete velikost šarže z 10 000 na něco menšího, například 2000 nebo 1 000 (neřekli jste, jak velká je velikost řádku).

Zkuste zapnout IO Statistiky, abyste viděli, kolik IO FK vyhledávání vyhledává).

Co je to čekání způsobené vložením (master.dbo.sysprocesy)?

Začněme tady a uvidíme, kam jdeme.

10
mrdenny

Brad,

Měli byste prozkoumat statistiky čekání na váš dotaz. S SQL 2000 můžete použít syntaxi DBCC SQLPERF ("čekací statistiky") k získání těchto podrobností.

7
SQLRockstar

Při analýze výkonu dotazu mohu říci, co hledám. Možná to pomůže.

  • analyzovat plán provádění dotazů a kontrolovat skenování indexů, skenování tabulek, použití funkcí convert_implicit pro datové typy sql, paralelismus.
  • spusťte dotaz pomocí SET STATISTICS IO ON a SET STATISTICS TIME ON, abyste viděli dobu provedení a čtěte/zapisujte io pro každou vložku.
  • podívejte se na čekací dobu od sysprocesů na vaši relaci spid.
  • spusťte profiler a vyberte standardní šablonu. vyberte následující: Statistiky výkonu (pokud se opakuje, pak je váš plán zkompilován mnohokrát - není dobrý), RPC: dokončeno, SQL: batchcompleted a SQL: batchstarting. Přidejte do nich sloupec rowcounts, abyste přesně viděli počet řádků v dávce. Filtrujte výsledky, aby se zobrazil pouze váš dotaz.
  • při konečném sběru Page Life Expectancy čítač z Windows perfmon a pokud je pod 300 (5 min), pak SQL má nízkou paměť. Sbírejte také čítače disků: délka fronty disk, čas disku (jednotka datových souborů), čas disku (jednotka souborů protokolu), abyste zjistili, zda je na disky tlak.
6
yrushka

Zkuste použít:

SET STATISTICS IO ON

a

SET STATISTICS PROFILE ON

STATISTICS IO

Může být užitečné při sdělování tabulek, které provádí nejvíce skenů tabulek, logických čtení a fyzických čtení (tyto tři používám k zaměření na to, která část plánu dotazů potřebuje nejvíce ladit)

STATISTICKÝ PROFIL

Primárně vrátí plán dotazů v tabulkovém formátu, pak se můžete podívat na sloupce IO a CPU), co stojí nejvíce částek v dotazu (jedná se o skenování tabulky v dočasné tabulce) vs řazení, které vloží do vašeho clusterového klíče atd.)

5
Andrew Bickerton