4

Во-первых, из BOL:Могут ли запросы, которые считывают переменные таблицы, генерируют параллельные планы выкладки в SQL Server 2008?

Запросы, изменяющие таблицы переменные не создают параллельных планов выполнения запросов. Производительность может быть затронута, когда изменены очень большие таблицы переменные или переменные таблицы в сложных запросах. В этих ситуациях вместо этого используйте временные таблицы. Для получения дополнительной информации см. CREATE TABLE (Transact-SQL). Запросы, которые читают Таблица переменные без их модификации все еще могут быть распараллелены.

Это кажется достаточно ясным. Запросы, которые читают переменные таблицы, не изменяя их, все еще могут быть распараллелены.

Но затем по крайней SQL Server Storage Engine, в противном случае авторитетный источник, Сунил Агарвал сказал в статье на данном TempDb от 30 марта 2008 года:

запросы, связанные таблицы переменных не создают параллельные планы.

Был ли Сунил перефразирующим BOL re: INSERT, или наличие табличных переменных в предложении FROM предотвращает параллелизм? Если да, то почему?

Я имею в виду конкретный пример использования контрольной таблицы, в котором у вас есть небольшая контрольная таблица, соединенная с большой таблицей, для сопоставления значений, действия в качестве фильтра или того и другого.

Спасибо!

ответ

5

КИ, у меня есть параллельный выбор, но не на столе переменной

Я анонимное это и:

  • BigParallelTable является 900K строк и широкого
  • Для наследия причины, BigParallelTable частично денормализован (я исправлю это, позже, обещаю)
  • BigParallelTable часто генерирует параллельные планы, потому что он не идеален и «дорог»
  • SQL Server 2005 x64, SP3, построить 4035, 16 ядер

Запрос + план:

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

Теперь, думая об этом, переменная таблица почти всегда сканирование таблицы, не имеет статы и предполагается одна строка «Оценочное количество строк = 1», «Фактическое .. = 3».

Можем ли мы объявить, что переменные таблицы не используются параллельно, но содержащийся план может использовать параллелизм в другом месте?Так BOL правильно и статья SQL хранения неправильно

+0

Удивительный. Вы сравнили это с планом, созданным с помощью #FilterList, а не с @FilterList? –

+0

Я бы положил ваше заключение наверху. Спасибо, что проверили это. Я также нашел это: http://social.msdn.microsoft.com/Forums/en-SG/sqldatabaseengine/thread/d2abcea7-dfd8-414a-8f94-13621a85c03b. Котировка Boris B: «Запросы только для чтения, которые используют переменные таблицы, все еще могут быть распараллелены. Запросы, которые включают измененные переменные таблицы, выполняются серийно. ** Мы исправим заявление в Books Online. **« –

+0

Вы можете получить параллельный ' SELECT' в переменной таблицы. Счет 'row' поддерживается в' sys.partitions', но вам нужно использовать 'OPTION (RECOMPILE)', чтобы заставить его учесть это. –

0

Я понимаю, что параллельные блокировки для переменных таблицы для операций UPDATE/DELETE/INSERT, но не для SELECT. Доказательство того, что было бы намного сложнее, чем просто гипотеза, конечно. :-)

+0

Я склонен полагать, что это не блокируется на SELECT. Я надеялся, что кто-то может знать окончательно так или иначе. Время для тестирования! –

0

[Отвечая на мой собственный вопрос здесь, так что я могу представить соответствующие цитаты надлежащим образом ....]

Борис Б, из thread на форумах MSDN SQL Server :

Запросы только для чтения, которые используют переменные таблицы, все еще могут быть распараллелены. Запросы, которые включают переменные таблицы, которые изменяются, запускаются последовательно. Мы исправим заявление в электронной документации. (EMP добавлен.)

и:

Обратите внимание, что существуют две разновидности поддержки параллельности:

А. Оператор может/не может быть в параллельном потоке

B. Запрос может/не может выполняться параллельно, потому что этот оператор существует в дереве.

B является подмножеством А.

Насколько я могу сказать, табличные переменные не B и может быть А.

Другая важная цитата Re: Какую встраиваемыми T-SQL TVFs:

Необорудованные T-SQL TVF ... рассматриваются для параллелизма, если входы TVF являются постоянными времени выполнения, например переменных и параметров. Если входной столбец является столбцом (от применения креста), то для всего оператора отключается параллелизм.

4

Простой пример, показывающий параллельный оператор на самой переменной таблицы.

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) 

Plan