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

Existuje rozdíl ve výkonu mezi CTE, dílčím dotazem, dočasnou tabulkou nebo proměnnou tabulky?

SQL je deklarativní jazyk, nikoli procedurální jazyk. To znamená, že vytvoříte příkaz SQL pro popis požadovaných výsledků. Neříkáte SQL motoru jak dělat práci.

Jako obecné pravidlo je dobré nechat stroj SQL a optimalizátor SQL najít nejlepší plán dotazů. Vývoj SQL enginu vyžaduje mnoho člověko-roků úsilí, takže nechte inženýry dělat, co umějí.

Samozřejmě existují situace, kdy plán dotazů není optimální. Pak chcete používat tipy pro dotazy, restrukturalizovat dotaz, aktualizovat statistiky, používat dočasné tabulky, přidávat indexy a tak dále, abyste dosáhli lepšího výkonu.

Pokud jde o vaši otázku. Výkon CTE a poddotazů by měl být teoreticky stejný, protože oba poskytují stejné informace optimalizátoru dotazů. Jedním rozdílem je, že CTE použitý více než jednou lze snadno identifikovat a vypočítat jednou. Výsledky pak mohly být uloženy a čteny vícekrát. Bohužel se zdá, že SQL Server nevyužívá této základní metody optimalizace (můžete to nazvat eliminací běžného poddotazu).

Dočasné tabulky jsou jiná záležitost, protože poskytujete další pokyny, jak by měl být dotaz spuštěn. Jedním z hlavních rozdílů je, že optimalizátor může použít statistiky z dočasné tabulky k vytvoření plánu dotazů. To může vést ke zvýšení výkonu. Také, pokud máte komplikovaný CTE (poddotaz), který se používá více než jednou, pak jeho uložení do dočasné tabulky často zvýší výkon. Dotaz se provede pouze jednou.

Odpověď na vaši otázku je, že si musíte pohrát, abyste dosáhli očekávaného výkonu, zejména u složitých dotazů, které jsou spouštěny pravidelně. V ideálním světě by optimalizátor dotazů našel dokonalou cestu provedení. I když se to často stává, možná budete schopni najít způsob, jak dosáhnout lepšího výkonu.



  1. 4 způsoby, jak zjistit, jaké sloupce budou vráceny uloženou procedurou na serveru SQL

  2. JSON_MERGE_PATCH() vs JSON_MERGE_PRESERVE() v MySQL:Jaký je rozdíl?

  3. Výběr více hodnot max() pomocí jediného příkazu SQL

  4. Jak importovat knihovnu stálosti místnosti do projektu Android