Производительность неиспользуемых полей в представлении SQL

Я использую MS SQL Server.

Когда я определяю схему базы данных, я определяю (нематериализованное) представление, которое включает в себя множество полей, например, следующим образом (где "Тема" - это имя таблицы, а представление - это самостоятельное соединение в таблице "Темы").:

CREATE VIEW View_Topic_Ancestor AS
SELECT
    Subordinate.Id AS Subordinate_Id,
    Subordinate.Folder_Id AS Subordinate_Folder_Id,
    Subordinate.topicTitle AS Subordinate_topicTitle,
    Subordinate.topicXhtml AS Subordinate_topicXhtml,
    Subordinate.crossLinked AS Subordinate_crossLinked,
    Superior.Id AS Superior_Id,
    Superior.topicTitle AS Superior_topicTitle,
    Superior.topicXhtml AS Superior_topicXhtml,
    Superior.crossLinked AS Superior_crossLinked
FROM Topic AS Subordinate LEFT OUTER JOIN Topic AS Superior
ON Superior.Folder_Id = Subordinate.Folder_Id
AND 
Superior.LeftValue = (SELECT MAX(Ancestor.LeftValue)
    FROM Topic AS Ancestor
    WHERE Subordinate.LeftValue > Ancestor.LeftValue
    AND Subordinate.LeftValue < Ancestor.RightValue
    AND Subordinate.Folder_Id = Ancestor.Folder_Id)

Позже (во время выполнения) я использую это представление в операторе выбора, например так:

SELECT
    T.Id AS Shared_Id,
    V.Superior_Id,
    V.Superior_topicTitle,
    V.Subordinate_Id,
    V.Subordinate_Folder_Id,
    V.Subordinate_topicXhtml
FROM Topic AS T, View_Topic_Ancestor AS V
WHERE Folder_Id='e2eb2b68-738d-49ad-9787-a1e655b7973f'
AND T.crossLinked = V.Subordinate_Id

Этот оператор SELECT не ссылается (не выбирает) на многие поля, которые находятся в представлении: например, он выбирает поле Subordinate_topicXhtml, но не выбирает поле Superior_topicXhtml.

Мои вопросы:

1) Влияют ли на производительность поля, которые определены в представлении, но на которые нет ссылок при выборе во время выполнения из представления? Предположим, если хотите, чтобы поле Superior_topicXhtml содержало много данных (это очень длинная строка).

2) Как я могу проверить ответ на это сам? Является ли тестирование (измерение истекшего времени с помощью секундомера) единственным способом или возможно получить ответ, основанный на теории? Я использую "Microsoft Server SQL Management Studio" для Microsoft SQL Server 2008 с SQL Express. Я вижу, как получить (но не научился интерпретировать) "оценочный план выполнения" для этого запроса, но он показывает только то, какие индексы и циклы происходят, а не то, извлекаются ли данные из полей, на которые нет ссылок.

2 ответа

Решение

Оптимизатор запросов создает план запроса, комбинируя sql, который определяет представление с созданным вами sql для "выбора" из представления, в один запрос sql. Если в этом объединенном оптимизированном sql какой-либо конкретный атрибут (столбец) не нужен, он не будет использоваться.. в частности, если для окончательного выбора это не требуется, он не будет отправлен по проводам. Кроме того, если это не требуется ни в каком предложении Where, ни в порядке By, ни в чем-либо еще в оптимизированном sql, и все атрибуты, которые необходимы, находятся в индексе, тогда этот запрос может читать только индекс и не затрагивать таблица вообще... даже думал, что он просматривает ссылки на столбец, отсутствующий в индексе... Это можно увидеть, посмотрев план выполнения запроса для запроса.

Если у вас есть план выполнения запроса, отображаемый в Management Studio, вы можете использовать мышь для наведения курсора на узлы в плане выполнения.

При наведении курсора отображается большая подсказка: в нее входит "Список вывода" полей, извлеченных этим узлом, и поля "Предполагаемое количество строк", которые показывают, сколько экземпляров этих полей считано.

Другие вопросы по тегам