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

Mohou dotazy, které čtou proměnné tabulky, generovat plány paralelního provádění v SQL Server 2008?

OK, mám paralelní výběr, ale ne na proměnné tabulky

Anonymizoval jsem to a:

  • BigParallelTable má 900 tisíc řádků a je široký
  • Z důvodů starších je BigParallelTable částečně denormalizován (opravím to později, slibuji)
  • BigParallelTable často generuje paralelní plány, protože to není ideální a je to „drahé“
  • SQL Server 2005 x64, SP3, sestavení 4035, 16 jader

Dotaz + plán:

DECLARE @FilterList TABLE (bar varchar(100) NOT NULL)

INSERT @FilterList (bar)
SELECT 'val1' UNION ALL 'val2' UNION ALL 'val3'

--snipped

SELECT
     *
FROM
    dbo.BigParallelTable BPT
    JOIN
    @FilterList FL ON BPT.Thing = FL.Bar

StmtText
  |--Parallelism(Gather Streams)
       |--Hash Match(Inner Join, HASH:([FL].[bar])=([BPT].[Thing]), RESIDUAL:(@FilterList.[bar] as [FL].[bar]=[MyDB].[dbo].[BigParallelTable].[Thing] as [BPT].[Thing]))
            |--Parallelism(Distribute Streams, Broadcast Partitioning)
            |    |--Table Scan(OBJECT:(@FilterList AS [FL]))
            |--Clustered Index Scan(OBJECT:([MyDB].[dbo].[BigParallelTable].[PK_BigParallelTable] AS [BPT]))

Nyní, když o tom přemýšlíme, proměnná tabulky je téměř vždy skenování tabulky, nemá žádné statistiky a předpokládá se jeden řádek "Odhadovaný počet řádků =1", "Skutečný.. =3".

Můžeme prohlásit, že tabulkové proměnné se nepoužívají paralelně, ale obsahující plán může používat paralelismus jinde? BOL je tedy správný a článek SQL Storage je chybný



  1. Přidání tabulky s FOREIGN KEY do databáze MySQL způsobí chybu 150

  2. Název sloupce seznamu pro uživatelské pohledy v oracle

  3. Seřaďte časová razítka (včetně budoucích) podle absolutní vzdálenosti od nynějška

  4. Smyčka Bash skriptu přes MySQL