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