sql >> Databáze >  >> Database Tools >> SSMS

Špatné odhady mohutnosti pocházející z plánů provádění SSMS

Chci poděkovat několika lidem za nedávnou aktualizaci SQL Sentry Plan Explorer. Brooke Philpott (@Macromullet) a Greg Gonzalez (blog | @SQLsensei), samozřejmě pro výzkum a vývoj a pro kopání do kódu a jeho třídění. Ale také Paulu Whiteovi (blog | @SQL_kiwi) za to, že nám vytrvale pomáhal s ověřováním oprav.

Problém, který Paul objevil, je ten, že SQL Server 2008+ narušuje odhady mohutnosti u určitých dotazů, když se jedná o vyhledávání klíčů nebo RID. Hlubší vysvětlení nechám na Paulově příspěvku na blogu a chybě, kterou nahlásil na Connect, ale ve zkratce, brali jsme tyto zkreslené odhady, věřili jsme jim a extrapolovali jsme je, abychom vám ukázali „lepší“ informace. Bohužel, jak vysvětluje Paul, byli jsme podvedeni.

Paul ukazuje následující dotaz proti kopii AdventureWorks 2005.

SELECT
    th.ProductID,
    th.TransactionID,
    th.TransactionDate
FROM Production.TransactionHistory AS th 
WHERE 
    th.ProductID = 1 
    AND th.TransactionDate BETWEEN '20030901' AND '20031231';

Management Studio přináší následující plán, jak jej popsal Paul:

V Průzkumníkovi plánu jsme se pokusili pomoci vynásobením odhadovaného počtu řádků (zaokrouhleno na 17) počtem provedení (45) a dospěli jsme k 765:

Pro většinu operátorů tento přístup poskytuje správná data, ale kvůli této chybě na serveru SQL Server není správný pro vyhledávání klíčů/RID. Tomu jsme se přizpůsobili a vydali příslušnou opravu v 7.2.42.0 (stáhněte si ji nyní!). Grafický plán nyní správně zobrazuje správné počty řádků pro oba odhadované:

A skutečné:

Zopakuji Pavlovo varování:Dejte si pozor na špatné odhady mohutnosti, když je v rámci vyhledávání použit predikát.

Tyto zavádějící odhady způsobily některé složitější problémy, kterým jsme se také věnovali. O několika z nich uvedu blog v následném příspěvku – tímto článkem jsem chtěl pouze demonstrovat, že jsme rychle vyřešili konkrétní problém, na který Paul ve svém příspěvku upozornil.


  1. mysql, ASC řada čísel využívající existující data

  2. Použijte Python k načtení dat do Mysql

  3. Seznamte se s posledním vydáním DBeaver v roce 2021

  4. Jednoduchá úprava motivu OpenCart