Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 10757|Odpověď: 0

[Zdroj] 30 bodů pro zlepšení rychlosti SQL dotazů

[Kopírovat odkaz]
Zveřejněno 27.01.2015 20:09:54 | | |

1. Pro optimalizaci dotazu byste se měli snažit vyhnout úplnému skenování tabulek a nejprve zvážit vytvoření indexu na sloupcích, které jsou zapojeny v Where a pořadí po.



2. Snažte se vyhnout nulovému hodnotovému soudu na poli v klauzuli where, jinak to způsobí, že engine opustí indexy a provede kompletní skenování tabulek, například:

Vyberte id z T, kde num je nul

Můžete nastavit výchozí hodnotu 0 na num, ujistit se, že v tabulce num není žádná null, a pak dotazovat takto:

Vyberte id z T, kde num=0



3. Snažte se vyhnout použití != nebo <> operátorů v klauzuli where, jinak engine opustí indexy a provede kompletní tabulkové skenování.



4. Měli byste se snažit vyhnout použití OR v klauzuli where pro připojení podmínky, jinak to způsobí, že engine opustí indexy a provede kompletní tabulkový sken, například:

Vyberte id z T, kde num=10 nebo num=20

Můžete se ptát takto:

Vyberte id z T, kde num=10

Sjednocení všech

Vyberte ID z T, kde num=20



5.in a not in by měly být také používány opatrně, jinak povedou k úplnému skenování tabulek, například:

Vyberte id z T, kde num in(1,2,3)

Pro spojité hodnoty nepoužívejte in, pokud můžete použít mezi:

Vyberte id z T, kde num mezi 1 a 3



6. Následující dotaz také povede k úplnému skenování tabulky:

Vyberte id od T, kde se jmenuje například '%abc%'

Pro zvýšení efektivity zvažte vyhledávání v plném textu.



7. Pokud použijete parametr v klauzuli where, způsobí to také kompletní skenování tabulky. Protože SQL řeší pouze lokální proměnné za běhu, ale optimalizátor nemůže odložit výběr přístupových plánů na runtime; Musí být vybrán při kompilaci. Pokud je však při kompilaci vytvořen přístupový plán, hodnota proměnné je stále neznámá a proto ji nelze použít jako vstupní položku pro výběr indexu. Následující prohlášení budou načtena v plném rozsahu:

Vyberte id z T, kde num=@num

Můžete donutit dotaz, aby místo toho použil index:

Vyberte id z t with(index(index(index name)) kde num=@num



8. Snažte se vyhnout vyjádření polí v klauzuli where, což by vedlo k tomu, že engine opustí indexy ve prospěch plného skenování tabulek. Například:

Vyberte id z T, kde num/2=100

Mělo by se změnit na:

Vyberte id z T, kde num=100*2



9. Snažte se vyhnout provádění funkčních operací na poli v klauzuli where, což způsobí, že engine opustí indexy ve prospěch úplného skenování tabulek. Například:

Vyberte id z T, kde substring(name,1,3)='abc' --name id začínající na abc

Vyberte ID z T, kde datediff(day,createdate,'2005-11-30')=0--'2005-11-30' generované ID

Mělo by se změnit na:

Vyberte id od T, kde se jmenuje například 'abc%'

Vyberte ID z T, kde vzniklo>='2005-11-30' a vytvořili<'2005-12-1'



10. Neprovádět funkce, aritmetické operace ani jiné výrazové operace vlevo od "=" v klauzuli where, jinak systém nemusí být schopen správně použít index.



11. Při použití indexového pole jako podmínky, pokud je index složený index, musí být první pole v indexu použito jako podmínka, aby systém používal tento index, jinak index nebude použit a pořadí polí by mělo být co nejvíce konzistentní s indexovým pořadím.



12. Nepište nějaké bezvýznamné dotazy, například generujte prázdnou tabulkovou strukturu:

Vyberte sloupec1,sloupec2 do #t z T, kde 1=0

Tento typ kódu nevrací žádnou sadu výsledků, ale spotřebovává systémové zdroje, takže by měl být změněn na něco takto:

Create table #t(...)



13. Často je dobré nahradit v existuje:

Vyberte num z A, kde num v (vyberte num z b)

Nahraďte následujícím tvrzením:



Vyberte num z A, kde existuje (vyberte 1 z B, kde num=a.num)

14. Ne všechny indexy jsou platné pro dotazy, SQL je založeno na datech v tabulce pro optimalizaci dotazu, pokud má indexový sloupec velké množství duplicitních dat, SQL dotazy nemusí index využívat, například tabulka má pole pohlaví, samec a žena jsou téměř polovina každý, a i když je index postaven na pohlaví, nebude hrát roli v efektivitě dotazů.



15. Čím více indexů není, tím lépe, index může určitě zlepšit efektivitu odpovídajícího výběru, ale zároveň snižuje efektivitu vkládání a aktualizace, protože index může být při vložení nebo aktualizaci znovu sestaven, takže je třeba pečlivě zvážit, jak index vytvořit, v závislosti na konkrétní situaci. Nejlepší je nemít v tabulce více než 6 indexů, a pokud jich je příliš mnoho, zvažte, zda je nutné vytvářet indexy na některých zřídka používaných sloupcích.



16. Vyhněte se co nejvíce aktualizaci sloupců indexových datových sloupců ve skupině, protože pořadí shlukovaných indexových datových sloupců je fyzické pořadí záznamů v tabulce a jakmile se změní hodnota sloupce, povede to k úpravě pořadí celých záznamů tabulky, což spotřebuje značné zdroje. Pokud vaše aplikace potřebuje často aktualizovat shlukované indexové sloupce, musíte zvážit, zda byste měli index vytvořit jako shlukovaný index.



17. Snažte se používat číselná pole a nenavrhovat pole, která obsahují pouze číselné informace jako znaky, což sníží výkon dotazů a spojení a zvýší režijní náklady na úložiště. Je to proto, že engine porovnává každý znak v řetězci jeden po druhém při zpracování dotazů a spojení, zatímco u číselných typů je potřeba porovnávat pouze jednou.



18. Používejte varchar/nvarchar místo char/nchar co nejvíce, protože za prvé, delší úložný prostor v poli může ušetřit místo, a za druhé, u dotazů je efektivita vyhledávání v relativně malém poli samozřejmě vyšší.



19. Nepoužívejte výběr * z t, nahraďte "*" konkrétním seznamem polí a nevracejte žádná pole, která nejsou použita.



20. Snažte se používat tabulkové proměnné místo dočasných tabulek. Pokud tabulková proměnná obsahuje velké množství dat, všimněte si, že index je velmi omezený (pouze primární klíčový index).



21. Vyhněte se častému vytváření a mazání dočasných tabulek, abyste snížili spotřebu systémových tabulek.

22. Dočasné tabulky nejsou nepoužitelné a jejich správné použití může některé rutiny učinit efektivnějšími, například když je potřeba opakovaně odkazovat na datovou sadu ve velké nebo běžně používané tabulce. Pro jednorázové události je však nejlepší použít exportní tabulku.



23. Při vytváření dočasné tabulky, pokud je množství vložených dat najednou velké, můžete místo vytvoření tabulky použít select in, abyste se vyhnuli zrychlení velkého počtu logů; Pokud množství dat není velké, abyste usnadnili zdroje systémové tabulky, měli byste nejprve vytvořit tabulku a pak ji vložit.



24. Pokud je použita dočasná tabulka, ujistěte se, že na konci uložené procedury explicitně smažete všechny dočasné tabulky, nejprve tabulku zkrácete a poté ji zrušte, abyste zabránili dlouhodobému uzamčení systémové tabulky.



25. Snažte se kurzoru vyhnout, protože jeho účinnost je špatná, pokud data s kurzorem přesahují 10 000 řádků, měli byste zvážit přepsání.



26. Řešení založená na množinách by měla být nejprve vyhledána k řešení problémů před použitím metod založených na kurzoru nebo dočasných tabulek, které jsou často účinnější.



27. Stejně jako dočasné tabulky, kurzory nejsou nepoužitelné. Používání kurzorů FAST_FORWARD pro malé datové sady je často lepší než jiné metody zpracování řádek po řádku, zvlášť pokud musíte odkazovat na několik tabulek, abyste získali potřebná data. Rutiny, které obsahují "total" ve výsledné sadě, jsou obvykle rychlejší než ty, které se vykonávají kurzorem. Pokud to dovolí čas na vývoj, lze vyzkoušet jak metody založené na kurzoru, tak na množině, aby se zjistilo, která funguje lépe.



28. Nastavte NASTAVIT NOCOUNT ON na začátku všech uložených procedur a spouštěčů a na konci NASTAVIT NOCOUNT a na konci. Není třeba klientovi posílat DONE_IN_PROC zprávy po vykonání každého příkazu uložené procedury a spouštěče.



29. Snažit se vyhnout velkým transakčním operacím a zlepšit kapacitu souběžnosti systému.



30. Snažte se vyhnout vracení velkých dat klientovi; pokud je objem dat příliš velký, měli byste zvážit, zda je odpovídající poptávka rozumná.




Předchozí:Systém CentOS 6.5 s virtuálním strojem Xen 4.1.2
Další:Jak zlepšit rychlost dotazů na SQL Server
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com