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

SQL Server pivot vs. vícenásobné spojení

Odpověď bude samozřejmě „to záleží“, ale na základě testování tohoto konce...

Za předpokladu

  1. 1 milion produktů
  2. product má seskupený index na product_id
  3. Většina produktů (pokud ne všechny) má odpovídající informace v product_code stůl
  4. Ideální indexy obsažené v product_code pro oba dotazy.

PIVOT verze v ideálním případě potřebuje index product_code(product_id, type) INCLUDE (code) zatímco JOIN verze v ideálním případě potřebuje index product_code(type,product_id) INCLUDE (code)

Pokud jsou na místě, uveďte níže uvedené plány

poté JOIN verze je efektivnější.

V případě, že type 1 a type 2 jsou jediné types v tabulce pak PIVOT verze má mírně náskok, pokud jde o počet přečtení, protože nemusí hledat product_code dvakrát, ale to je více než vyváženo dodatečnou režií operátora agregátu streamů

PIVOT

Table 'product_code'. Scan count 1, logical reads 10467
Table 'product'. Scan count 1, logical reads 4750
   CPU time = 3297 ms,  elapsed time = 3260 ms.

PŘIPOJIT SE

Table 'product_code'. Scan count 2, logical reads 10471
Table 'product'. Scan count 1, logical reads 4750
   CPU time = 1906 ms,  elapsed time = 1866 ms.

Pokud existují další type záznamy jiné než 1 a 2 JOIN verze zvýší svou výhodu, protože pouze sloučí spojení v příslušných sekcích type,product_id index, zatímco PIVOT plán používá product_id, type a tak by musel prohledat další type řádky, které se prolínají s 1 a 2 řádky.



  1. T-SQL:Výběr sloupce na základě MAX (jiný sloupec)

  2. LIKE dotaz na prvky plochého pole jsonb

  3. PostgreSQL parametrizované Order By / Limit v tabulkové funkci

  4. Audit v Oracle