consultas que ler variáveis ??de tabela pode gerar planos de execução paralela no SQL Server 2008?
-
22-07-2019 - |
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!
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)
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.