Материализуйте CTE или иным образом увеличьте производительность

Имея таблицу (AccountId, ParentId NULL), мы хотим иметь возможность быстро найти: 1. Главный родительский ID (accountId, где ParentId равен null). 2. Все дети для данного идентификатора учетной записи.

С CTE это довольно просто. Однако мы не можем сохранить CTE в индексированном представлении, что снижает производительность. Мы обдумывали некоторые другие идеи, такие как сохранение пути (id1/id2/id3) в другом поле, но это кажется хакерским.

Мы думали о триггере, который бы сохранял «главный» идентификатор в каждой строке, но мы не уверены, как это будет работать в середине цепочки (1 владеет 2, владеет 3, но затем 2 передает в 7). Это также не решает запрос «найти всех детей».

Есть предположения? Мы используем SQL 2008 R2, но можем перейти на SQL 2012.


person MichaelGG    schedule 13.03.2012    source источник
comment
Я не думаю, что SQL Server 2012 имеет какую-либо функциональность, которая поможет здесь. Однако без дополнительного контекста очень сложно понять, почему материализация CTE или создание индексированного представления (чего?) станет волшебным решением ваших проблем с производительностью. Можете ли вы дать нам некоторое представление о структуре таблицы, индексах, объеме данных и слишком медленных запросах, которые вы выполняете?   -  person Aaron Bertrand    schedule 13.03.2012
comment
Есть ли у вас покрытие индекса для ParentId?   -  person wtjones    schedule 04.04.2012


Ответы (1)


В SQL 2008 есть тип иерархии, который в основном реализует сохранение пути к корню. http://technet.microsoft.com/en-us/library/bb677290%28v=sql.100%29.aspx

Если ваша иерархия в основном статическая, другой вариант — иметь денормализованную версию этой таблицы с комбинацией родителя для каждого потомка. Итак, если ваша иерархия A является родителем B, который является родителем C, денормализованная таблица может выглядеть так:

parent child depth
A      A     0
A      B     1
A      C     2
B      B     0
B      C     1
C      C     0

Теперь, если вы проиндексируете и родительский, и дочерний столбцы, поиск в иерархии станет очень быстрым.

person user2009605    schedule 25.01.2013