Материализация CTE или иное повышение производительности - PullRequest
2 голосов
/ 13 марта 2012

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

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

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

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

1 Ответ

1 голос
/ 25 января 2013

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

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

...