sql >> Database >  >> RDS >> Sqlserver

Kunnen query's die tabelvariabelen lezen parallelle uitvoeringsplannen genereren in SQL Server 2008?

OK, ik heb een parallelle selectie, maar niet op de tafelvariabele

Ik heb het geanonimiseerd en:

  • BigParallelTable is 900k rijen en breed
  • Om oude redenen is BigParallelTable gedeeltelijk gedenormaliseerd (ik zal het later oplossen, beloof het)
  • BigParallelTable genereert vaak parallelle plannen omdat het niet ideaal is en "duur" is
  • SQL Server 2005 x64, SP3, build 4035, 16 cores

Vraag + plan:

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]))

Als je er nu over nadenkt, is een tabelvariabele bijna altijd een tabelscan, heeft het geen statistieken en wordt aangenomen dat het één rij is "Geschat aantal rijen =1", "Werkelijk.. =3".

Kunnen we verklaren dat tabelvariabelen niet parallel worden gebruikt, maar dat het bevattende plan elders parallellisme kan gebruiken? Dus BOL is correct en het artikel over SQL Storage is fout



  1. MySql localhost vs Amazon RDS instantie

  2. Hoe HTTP-authenticatie te gebruiken met PHP en vervolgens de ingevoerde gegevens uit te voeren tegen een database?

  3. voorkomen van meerdere gelijktijdige zoekopdrachten met php/mysql live zoeken

  4. kolom toevoegen aan mysql-tabel als deze niet bestaat