Pergunta

Estou usando o MS SQL Server.

Quando eu definir o esquema de banco de dados que definem um (não se materializou) vista, que inclui muitos campos, por exemplo, como se segue (onde "Tópico" é o nome de uma tabela, ea vista é uma auto-se juntar na mesa tópico):

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)

Mais tarde (em tempo de execução) Eu uso este ponto de vista em uma instrução SELECT, como este:

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

Esta instrução SELECT não de referência (não seleciona) muitos dos campos que estão no ponto de vista:. Por exemplo, ele seleciona o campo Subordinate_topicXhtml mas não selecione o campo Superior_topicXhtml

As minhas perguntas são:

1) Será que os campos que são definidos na vista, mas que não são referenciadas na selecção de tempo de execução a partir do ponto de vista, tem muito efeito sobre o desempenho? Suponha que se você quiser que o campo Superior_topicXhtml contém uma grande quantidade de dados (é um tempo muito longo string).

2) Como posso verificar a resposta para isso mesmo? Está testando (medir o tempo ellapsed com um cronômetro) a única maneira, ou é possível obter uma resposta com base na teoria? Eu estou usando "Microsoft SQL Server Management Studio" para o Microsoft SQL Server 2008, com SQL Express. Eu vejo como obter (mas não aprenderam a interpretar) o "plano de execução estimado" para esta consulta, mas isso mostra apenas o que índices e loops estão acontecendo, não se os dados estão sendo recuperados a partir de campos não referenciadas.

Foi útil?

Solução

O otimizador de consulta cria um plano de consulta, combinando o sql que define o ponto de vista com o sql-lo a construir a "escolha" do ponto de vista em uma única consulta SQL. Se, neste combinado SQL, optimizada, qualquer atributo específico (coluna) não é necessário, que não irá ser utilizado .. especificamente, se o seleccione final não exigem isso, ele não irá ser enviado ao longo do fio. Além disso, se não for utilizada por qualquer cláusula WHERE, ORDER BY ou qualquer outra coisa dentro do SQL otimizado, e todos os atributos que são necessários que ser em um índice, em seguida, essa consulta pode ler apenas o índice, e não tocar a mesa em tudo ... até pensei que ele exibir referências a coluna não está presente no índice ... Você pode ver isso olhando para o plano de execução de consulta para a consulta.

Outras dicas

Quando você tem plano de execução da consulta exibida no Management Studio, você pode usar o mouse para pairar sobre nós no plano de execução.

Quando você passa, uma grande dica de ferramenta é exibida: que inclui uma "lista de saída" dos campos recuperados por esse nó, e um "estimado Número de linhas" campos que mostra quantas instâncias desses campos são lidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top