it-swarm-eu.dev

SQL Server Připojte se / kde se zpracovává objednávka

Po přečtení pomalý dotaz SQL, nejsem si jistý, jak optimalizovat , mě přimělo přemýšlet o obecném výkonu dotazů. Určitě potřebujeme, aby výsledky první tabulky (pokud jsou spojeny další tabulky) byly co nejmenší před připojením (vnitřní spojení pro tuto otázku), abychom naše dotazy zrychlili.

Příklad:

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2

Být lepší/rychlejší než:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val

Moje teorie je následující (nemusí to být správná implementace, snažím se zapamatovat si z knihy interních SQL Server 2008, kterou jsem četl (MSFT Press)):

  1. Procesor dotazu nejprve získá levou tabulku (tabulka1)
  2. Připojí se k druhé tabulce (tabulka 2) a vytvoří kartézský produkt před odfiltrováním potřebných řádků (pokud je to použitelné)
  3. Poté provede klauzule WHERE, ORDER BY, GROUP BY, HAVING s příkazem SEELCT jako poslední.

Pokud tedy ve výroku č. 1 výše je tabulka menší, stroj SQL má při práci s kartézskými produkty méně práce. Když dosáhnete příkazu where, máte nastavenou redukovanou sadu výsledků, z nichž se filtruje v paměti.

Mohl bych být tak daleko od značky, že je to neskutečné. Jak jsem řekl, je to teorie.

Tvoje myšlenky?

Poznámka : Jen jsem na tuto otázku myslela a neměla jsem šanci provést žádné testy.

Poznámka 2 : Označeno jako SQL Server, protože nevím nic o implementaci MySql atd. Prosím zdarma odpovědět/komentovat stejně

18
Stuart Blackler

Logické zpracování dotazu je na MSDN (napsáno týmem Microsoft SQL Server, nikoli třetími stranami)

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

Následuje odvozená tabulka, pak to externí dotaz provede znovu atd. Atd

To je logické , i když: není skutečné . Bez ohledu na to, jak to SQL Server ve skutečnosti dělá, jsou tyto sémantiky poctěny k dopisu. „Skutečný“ je určen Optimalizátorem dotazů (QO) a vyhnete se meziproduktu Cartesion, který jste zmínili.

Stojí za zmínku, že SQL je deklarativní: říkáte „co“ ne „jak“, jako byste chtěli pro procedurální/imperativní programování (Java, .net). Tedy říkat „toto se stane dříve“ je v mnoha případech špatné (např. Předpoklad zkratů nebo pořadí L-to-R WHERE)

Ve výše uvedeném případě vygeneruje QO stejný plán bez ohledu na jeho strukturu, protože se jedná o jednoduchý dotaz.

QO je však založeno na nákladech a pro složitý dotaz může trvat 2 týdny, než se vytvoří ideální plán. Takže to dělá dost dobře, což ve skutečnosti není.

Váš první případ tedy může optimalizátoru pomoci najít lepší plán, protože pořadí logického zpracování se u dvou dotazů liší. Ale nemusí.

Použil jsem tento trik na serveru SQL Server 2000, abych dosáhl 60násobného zvýšení výkonu při vykazování dotazů. Jak QO vylepšuje verzi na verzi, zlepšuje se práce na těchto věcech.

A ta kniha, kterou jste zmínil: je o tom nějaký spor
Viz SO a následující odkazy: https://stackoverflow.com/q/3270338/27535

16
gbn

Dotaz SQL není ve své podstatě procedurální, nedochází ke zpracování operátorů spojení shora dolů. Pořadí tabulek v příkladech dotazů nemá žádný vliv na plán provedení , protože jsou logicky ekvivalentní a vygenerují přesně stejný plán.

Vyhodnocovali jste dvě možnosti, které by optimalizátor dotazů mohl zvážit při generování plánu pro tento dotaz. Primárním faktorem, který ovlivňuje výběr plánu, je statistika pro zúčastněné tabulky a náklady spojené s výběrem operátora v jakýchkoli kandidátních plánech.

Velmi jednoduché spojení dvou tabulek, jako je váš příklad, může být uspokojeno s některým ze stovek různých plánů provádění. Optimalizátor rozhodne, který bude nejlepší způsob, jak odpovědět na váš dotaz, porovnáním nákladů na tyto plány.

Někdy se to pokazí a vy mu můžete pomoci lépe se rozhodovat pomocí vylepšeného indexování, udržování aktualizovaných statistik a používání tipů. Ve velmi vzácných případech můžete chtít vynutit pořadí provádění pomocí nápovědy FORCE ORDER, ale to by mělo být používáno střídmě. Je to kladivo na lámání ořechů, optimalizátor může být obvykle vtipkován do vytváření lepších plánů tím, že mu podává lepší informace.

6