Pergunta

Em primeiro lugar, a partir BOL :

As consultas que modificam tabela variáveis ??não geram planos de execução de consultas paralelas. O desempenho pode ser afetado quando muito grande tabela variáveis ??ou variáveis ??de tabela em consultas complexas, são modificados. Nestas situações, considerar o uso de tabelas temporárias em seu lugar. Para mais informações, consulte CREATE TABLE (Transact-SQL). As consultas que ler tabela variáveis ??sem modificá-los pode ainda ser paralelizado.

Isso parece bastante clara. As consultas que ler variáveis ??de tabela, sem modificá-los, ainda pode ser paralelizado.

Mas, em seguida, sobre a SQL Motor Storage Server , uma fonte de outra forma respeitável, Sunil Agarwal disse isso em um artigo sobre tempdb de 30 de março de 2008:

As consultas envolvendo variáveis ??de tabela não geram planos paralelos.

Foi Sunil parafraseando BOL Re: INSERT, ou faz a presença de variáveis ??de tabela na cláusula FROM paralelismo evitar? Se sim, porquê?

Estou pensando especificamente o caso de controle de tabela uso, onde você tem uma tabela de controle pequena que está sendo unido a uma mesa maior, para mapear valores, agir como um filtro, ou ambos.

Obrigado!

Foi útil?

Solução

OK, eu tenho um paralelo escolha, mas não na variável de tabela

Eu anónima lo e:

  • BigParallelTable é 900K linhas e largura
  • Por razões de legado, BigParallelTable é parcialmente Desnormaliza (eu vou corrigi-lo, depois, promessa)
  • BigParallelTable muitas vezes gera planos paralelos, porque não é ideal e é "caro"
  • SQL Server 2005 x64, SP3, construção de 4035, 16 núcleos

Consulta + plano:

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

Agora, pensando nisso, uma variável de tabela é quase sempre uma varredura da tabela, não tem estatísticas e é assumido uma linha "estimado número de linhas = 1", "real .. = 3".

Podemos declarar que as variáveis ??da tabela não são usados ??em paralelo, mas o plano que contém pode usar o paralelismo em outro lugar? Então BOL está correto e o artigo armazenamento SQL está errado

Outras dicas

simples Exemplo mostrando um operador em paralelo uma variável própria tabela.

DECLARE @T TABLE
(
X INT
)
INSERT INTO @T
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1,master..spt_values v2;

WITH E8(N)
     AS (SELECT 1
         FROM   @T a,
                @T b),
     Nums(N)
     AS (SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
         FROM   E8)
SELECT COUNT(N)
FROM   Nums
OPTION (RECOMPILE)  

Plano

O meu entendimento é que o paralelismo é bloqueado em variáveis ??de tabela para operações UPDATE / DELETE / INSERT, mas não para SELECTs. Provando que seria muito mais difícil do que apenas hypothesizing, é claro. : -)

[Respondendo a minha própria pergunta aqui, para que eu possa apresentar as citações relevantes apropriadamente ....]

Boris B, a partir de um fio em fóruns MSDN SQL Server:

Read-only consulta que as variáveis ??de utilização de mesa ainda pode ser paralelizado. Consultas que envolvem variáveis ??de tabela que são modificados prazo em série. Vamos corrigir a declaração em Books Online. (emp. Adicionado)

e

Note que existem dois tipos de suporte paralelismo:

A. O operador pode / não pode estar em uma linha paralela

B. A consulta pode / não pode ser executado em paralelo, porque este operador existe na árvore.

B é um superconjunto de A.

Como melhor eu posso dizer, variáveis ??de tabela são não B e pode ser A.

Outra citação relevante, RE: não inlined T-SQL TVFs:

Não-inlined T-SQL TVFs ... é considerado para paralelismo se as entradas TVF são constantes, por exemplo em tempo de execução variáveis ??e parâmetros. Se a entrada for uma coluna (de uma cruz extra), em seguida, o paralelismo é desativado para toda a declaração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top