sql >> Databáze >  >> RDS >> PostgreSQL

Rozdíl ve výkonu:podmínka umístěná v klauzuli INNER JOIN vs. WHERE

Důvod, proč vidíte rozdíl, je kvůli prováděcímu plánu, který plánovač sestavuje, to se samozřejmě liší v závislosti na dotazu (pravděpodobně by to mělo být optimalizace 2 dotazů, aby byly stejné, a to může být chyba ). To znamená, že plánovač si myslí, že musí pracovat určitým způsobem, aby se dostal k výsledku v každém prohlášení.

Když to uděláte v rámci JOIN, plánovač bude pravděpodobně muset vybrat z tabulky, filtrovat podle části "True" a poté spojit sady výsledků. Představoval bych si, že se jedná o velkou tabulku, a tedy spoustu dat, která je třeba prohlížet, a nemůže tak efektivně využívat indexy.

Mám podezření, že pokud to uděláte v klauzuli WHERE, plánovač zvolí cestu, která je efektivnější (tj. buď na základě indexu, nebo předfiltrovaná datová sada).

Pravděpodobně byste mohli zajistit, aby spojení fungovalo stejně rychle (ne-li rychleji) přidáním indexu do dvou sloupců (nejste si jisti, zda zahrnuté sloupce a indexy více sloupců jsou na Postgresu zatím podporovány).

Stručně řečeno, plánovač je problém, který vybírá 2 různé cesty, jak se dostat k sadám výsledků, a jedna z nich není tak efektivní jako druhá. Je nemožné, abychom věděli, jaké jsou důvody bez informací o úplné tabulce a informací EXPLAIN ANALYZE.

Pokud chcete upřesnit, proč to váš konkrétní dotaz dělá, budete muset poskytnout další informace. Důvodem je však to, že plánovač volí různé trasy.

Další materiály ke čtení:

http://www.postgresql.org/docs/current/static/explicit-joins.html

Jen letmo, zdá se, že plánovač postgres nepřeřizuje spojení, aby to optimalizoval. zkuste změnit pořadí spojení ve svém prohlášení, abyste viděli, zda pak dosáhnete stejného výkonu... jen myšlenka.




  1. Jaký je rozdíl mezi BIT a TINYINT v MySQL?

  2. Jak vložit více záznamů a získat hodnotu identity?

  3. SQL Server 2016:Obnovení databáze

  4. Jak zobrazit serverové řazení v SQL Server (T-SQL)