sql >> Databáze >  >> RDS >> Sqlserver

Dotaz extrémně pomalý v kódu, ale rychlý v SSMS

Váš kód v SSMS není stejný kód, který spouštíte ve své aplikaci. Tento řádek ve vaší aplikaci přidává parametr NVARCHAR:

 ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);

zatímco ve skriptu SSMS jej deklarujete jako VARCHAR:

declare @clientID varchar(200)

Kvůli pravidlům priority datových typů je Where client_id = @clientID výraz ve vašem dotazu nelze SARG, kde @clientID je typu NVARCHAR (dělám skok ve víře a předpokládám, že client_id sloupec je typu VARCHAR). Aplikace tak vynutí skenování tabulky, kde může SSMS dotaz provést rychlé vyhledání klíče. Toto je dobře známý a srozumitelný problém s používáním Parameters.AddWithValue a byl diskutován v mnoha článcích dříve, např. viz Jak kód pro přístup k datům ovlivňuje výkon databáze. Jakmile problém pochopíte, řešení jsou triviální:

  • přidejte parametry pomocí konstruktoru, který přijímá typ:Parameters.Add("@clientID", SqlDbType.Varchar, 200) (a udělejte předat explicitní délku, aby se zabránilo znečištění mezipaměti, viz Výkon dotazů a plánování problémů s mezipamětí, když není správně zadána délka parametru

  • nebo přeneste parametr do textu SQL:where client_id = cast(@clientID as varchar(200)) .

První řešení je lepší, protože kromě problému se schopností SARG řeší problém znečištění mezipaměti.

Také bych vám doporučil přečíst si pomalu v aplikaci, rychle v SSMS? Porozumění záhadám výkonu



  1. Jak se vzdáleně připojit k databázi MySQL umístěné na našem sdíleném serveru

  2. Jak odstranit virtuální počítač z VirtualBoxu

  3. Jak přetypuji řetězec na celé číslo a budu mít 0 v případě chyby při přetypování s PostgreSQL?

  4. Jak mohu vědět, zda byla vyvolána výjimka SQL z důvodu porušení cizího klíče?