Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Теряюсь прям, не знаю как поступить...

Представьте у вас есть таблицы
Accounts (AccountId, PartitionId)
Transactions (TransactionId, AccountId)
Transactions.AccountId ссылается на Accounts.AccountId - имеется FK_Transactions_Accounts

Задачку поставили - сделать чтобы Accounts был разбит по партишенам на основе PartitionId.

Делаем
ALTER TABLE Accounts  ADD CONSTRAINT PK_Accounts PRIMARY KEY (AccountId)  on somePartFunction(PartitionId)

Но (хоть я и не люблю их) как бы было бы неплохо сохранить FK_Transactions_Accounts.
Но как его сделать? Теперь PRIMARY KEY содержит аж 2 колонки... куда мир катится.. ужас ((

Можно в принципе сделать так:
CREATE UNIQUE CLUSTERED INDEX CL_Accounts ON Accounts (AccountId, PartitionId) on somePartFunction(PartitionId)
ALTER TABLE Accounts  ADD CONSTRAINT PK_Accounts PRIMARY KEY (AccountId)  on somePartFunction(PartitionId)
Но тогда под PK_Accounts пойдет некое дополнительное местечко на диске... Да и опять же каждый индекс - это время на его сопровождение...

И вообще, UNIQUE INDEX по двум полям которые нифига не уникальны - тоже не оч хорошая штука.

Кто посоветует может чего? А то уже голова раком... (
30 июн 09, 02:23    [7356952]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Неужели единственный выход – это создать PRIMARY KEY в файловой группе PRIMARY ?
Тогда вопрос - а хорошо ли это когда индексы и кластерный индекс - разнесены по 10 файлам, а один из индексов будет в другом в 11 файле?
30 июн 09, 02:37    [7356957]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Допустим мы сделали такой индекс:
CREATE PARTITION FUNCTION PartitionFuncAccounts ( TINYINT ) AS
RANGE RIGHT FOR VALUES (  1, 2, 3, 4, 5, 6, 7, 8, 9)

CREATE UNIQUE CLUSTERED INDEX CL_Transactions ON Transactions (AccountId, PartitionID)
ON PartitionScheme ( PartitionFuncAccounts )

Можно ли сразу сходу сказать что в таком запросе будет использоавться только 1 файловая группа и другие файлы серверу не понадобятся для выполнения такого вот запросика?
SELECT * FROM Transactions WHERE AccountId=123123
6 июл 09, 13:18    [7380428]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Цель какая? А то со стороны кажется, что вы ваще не то делаете.
Как вы задаёте логику PartitionId?
6 июл 09, 15:08    [7381317]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Mnior
Цель какая? А то со стороны кажется, что вы ваще не то делаете.
Как вы задаёте логику PartitionId?

не я придумал, но PartitionId всего лишь разделение по AccountId на 10 равномерных частей ((
по последней цифре AccountId
измерения показали что замедление работы от этого не оч большое - на 10-20%....


я бы лучше по дате сделал как положено... но щас не об этом...


цель пока просто туповатая - чтобы если мы берем Transactions по AccountId - тогда чтобы использовался только 1 файл той нужной партиции
6 июл 09, 15:24    [7381480]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
StmtText
------------------------------------------------------------------------------------------
	SELECT dtCostDate FROM Transactions t join #a2 a on A.AccountId=t.AccountId

StmtText
-------------------------------------------------------------------------------------------------
  |--Hash Match(Inner Join, HASH:([a].[AccountId])=([t].[AccountId]))
       |--Table Scan(OBJECT:([tempdb].[dbo].[#a2] AS [a]))
       |--Clustered Index Scan(OBJECT:([MyDb].[dbo].[Transactions].[CL_Transactions] AS [t]))

StmtText
-------------------------------------------------------------------------------------------------------------------------
	SELECT dtCostDate FROM Transactions t join #a2 a on A.AccountId=t.AccountId and t.PartitionId=a.PartitionId

StmtText
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  |--Nested Loops(Inner Join, OUTER REFERENCES:([PtnId1000], [t].[TransactionId], [t].[PartitionId], [Expr1012]) WITH UNORDERED PREFETCH)
       |--Nested Loops(Inner Join, OUTER REFERENCES:([a].[AccountId], [a].[PartitionId], [Expr1011]) WITH UNORDERED PREFETCH)
       |    |--Table Scan(OBJECT:([tempdb].[dbo].[#a2] AS [a]))
       |    |--Index Seek(OBJECT:([MyDb].[dbo].[Transactions].[IX_Transactions_PositionCover] AS [t]), SEEK:([PtnId1000]=RangePartitionNew([tempdb].[dbo].[#a2].[PartitionId] as [a].[PartitionId],(1),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AND [t].[AccountId]=[tempdb].[dbo].[#a2].[AccountId] as [a].[AccountId]),  WHERE:([MyDb].[dbo].[Transactions].[PartitionId] as [t].[PartitionId]=[tempdb].[dbo].[#a2].[PartitionId] as [a].[PartitionId]) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([MyDb].[dbo].[Transactions].[CL_Transactions] AS [t]), SEEK:([PtnId1000]=[PtnId1000] AND [t].[TransactionId]=[MyDb].[dbo].[Transactions].[TransactionId] as [t].[TransactionId] AND [t].[PartitionId]=[MyDb].[dbo].[Transactions].[PartitionId] as [t].[PartitionId]) LOOKUP ORDERED FORWARD)
6 июл 09, 16:13    [7381842]     Ответить | Цитировать Сообщить модератору
 Re: 2008: Partition columns for a unique index must be a subset of the index key.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
SEEK:([PtnId1000]=RangePartitionNew([tempdb].[dbo].[#a2].[PartitionId] as [a].[PartitionId],(1),(1),(2),(3),(4),(5),(6),(7),(8),(9))

А что это такое?
6 июл 09, 16:14    [7381850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить