функция секционирования в SQL Server 2005 - PullRequest
1 голос
/ 01 марта 2009

В MSDN о функции секционирования отсюда, $ PARTITION (Transact-SQL) .

Я не совсем понимаю, что лежит в основе приведенного ниже примера. Насколько я понимаю, этот оператор SQL будет повторять все строки в таблице Production.TransactionHistory, и, поскольку для всех строк, которые будут отображаться в один и тот же раздел, $ PARTITION.TransactionRangePF1 (TransactionDate) вернет одно и то же значение, то есть номер раздела для всех такие строки. Так, например, все строки в разделе 1 приведут к возвращению результата в одной строке, поскольку все они имеют одинаковое значение $ PARTITION.TransactionRangePF1 (TransactionDate). Мое понимание верно?

USE AdventureWorks ;
GO
SELECT $PARTITION.TransactionRangePF1(TransactionDate) AS Partition, 
COUNT(*) AS [COUNT] FROM Production.TransactionHistory 
GROUP BY $PARTITION.TransactionRangePF1(TransactionDate)
ORDER BY Partition ;
GO

Ответы [ 3 ]

1 голос
/ 02 марта 2009

Если ваша функция разделения определена как

CREATE PARTITION FUNCTION TransactionRangePF1(DATETIME)
AS RANGE RIGHT FOR VALUES ('2007-01-01', '2008-01-01', '2009-01-01')

, тогда этот пункт:

$PARTITION.TransactionRangePF1(TransactionDate)

эквивалентно:

CASE
  WHEN TransactionDate < '2007-01-01' THEN 1
  WHEN TransactionDate < '2008-01-01' THEN 2
  WHEN TransactionDate < '2009-01-01' THEN 3
  ELSE 4
END

Если все ваши даты упадут до '2007-01-01', тогда первое предложение WHEN всегда будет срабатывать и всегда будет возвращать 1.

Отправленный вами запрос вернет не более 1 строк для каждого раздела, так как он объединит все строки из раздела (если есть) в одну группу.

Если для какого-либо раздела нет ни одной строки, никакие строки для него не будут возвращены в наборе результатов.

0 голосов
/ 02 марта 2009

Вы пытались создать план выполнения для оператора? Это может дать вам некоторое представление о том, что на самом деле происходит под крышкой.

Нажмите «Control-L», чтобы сгенерировать план выполнения, и опубликуйте его здесь, если вам нужна некоторая интерпретация.

0 голосов
/ 01 марта 2009

Возвращает количество записей в каждом из непустых разделов в многораздельной таблице Production.TransactionHistory, так что да, ваши рассуждения верны.

...