Это искажает меня какое-то время, и я надеюсь, что один из экспертов SQL Server может пролить свет на него.Как работает индекс для SQL User-Defined Type (UDT)?
Возникает вопрос:
Когда индекс столбца SQL Server, содержащий UDT (тип CLR), то как SQL Server определить, какие операции индекс для выполнения для данного запроса?
В частности, я думаю о модели hierarchyid
(AKA SqlHierarchyID
). Путь Microsoft рекомендует использовать его - и то, как я его использовать - это:
Создать индекс на самом
hierarchyid
колонке (назовем егоID
). Это позволяет осуществлять поиск по глубине, так что, когда вы пишетеWHERE ID.IsDescendantOf(@ParentID) = 1
, он может выполнять поиск по индексу.Создать постоянный вычисленный столбец
Level
и создать индекс на(Level, ID)
. Это позволяет осуществлять поиск по ширине, так что, когда вы пишетеWHERE ID.GetAncestor(1) = @ParentID
, он может выполнять поиск индекса (по второму индексу) для этого выражения.
Но я не понимаю, как это возможно? Кажется, что нарушают обычные правила плана запроса - вызовы GetAncestor
и IsDescendantOf
не выглядят неприступными, поэтому этот должен привести к полному сканированию индекса, но это не так. Не то, чтобы я жаловался, очевидно, но я пытаюсь понять, возможно ли повторить эту функцию на моих собственных UDT.
hierarchyid
просто «магический» тип, который SQL Server имеет особое понимание и автоматически изменяет план выполнения, если он находит определенную комбинацию элементов запроса и индексов? Или тип CLR SqlHierarchyID
просто определяет специальные атрибуты/методы (аналогично тому, как IsDeterministic
работает для постоянных вычисляемых столбцов), которые понимаются движком SQL Server?
Возможно, я не могу найти информацию об этом. Все, что мне удалось найти, - это абзац, в котором указано, что свойство IsByteOrdered
делает такие вещи, как индексы, и проверяет ограничения, гарантируя одно уникальное представление для каждого экземпляра; в то время как это несколько интересно, он не объясняет, как SQL Server может выполнить искать с определенными методами экземпляра.
Итак, вопрос снова - как работают индексы для типов типа hierarchyid
, и можно ли получить такое же поведение в новом UDT?
«LEFT» и «CAST» становятся доступными в SQL Server 2008? У меня только 2005 на моей домашней машине, чтобы проверить, и они определенно вынуждают сканирование индекса здесь. Я проверю это на работе завтра, это будет интересно, если это правда. – Aaronaught
CAST в некоторых ситуациях, даже в SQL 2005. CRAVE LART все еще нет, но LIKE - это когда подстановочный знак находится в конце, что по существу обеспечивает функциональность LEFT. –
Я отредактирую ответ, чтобы уточнить, что я имею в виду «Левый» –