Existe alguma maneira de fazer com que o resultado seja apresentado exatamente com 3 guias distintos e não mais? Espero poder responder melhor a perguntas no futuro, incluindo guias de plano com consultas do tipo CTE que são referenciadas várias vezes para superar algumas peculiaridades do SQL Server CTE.
Hoje nao. As expressões de tabela comum não recursivas (CTEs) são tratadas como definições de exibição em linha e expandidas na árvore de consultas lógicas em cada local em que são referenciadas (assim como as definições de exibição regulares) antes da otimização. A árvore lógica da sua consulta é:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Observe as duas âncoras de exibição e as seis chamadas para a função intrínseca newid
antes que a otimização seja iniciada. No entanto, muitas pessoas consideram que o otimizador deve ser capaz de identificar que as subárvores expandidas eram originalmente um único objeto referenciado e simplificar de acordo. Também houve várias solicitações do Connect para permitir a materialização explícita de uma CTE ou tabela derivada.
Uma implementação mais geral faria com que o otimizador considerasse materializar expressões comuns arbitrárias para melhorar o desempenho ( CASE
com uma subconsulta é outro exemplo em que os problemas podem ocorrer hoje). A Microsoft Research publicou um documento (PDF) sobre isso em 2007, embora ainda não esteja implementado até o momento. Por enquanto, estamos limitados à materialização explícita usando coisas como variáveis de tabela e tabelas temporárias.
O SQLKiwi mencionou a elaboração de planos no SSIS. Existe uma maneira ou uma ferramenta útil para ajudar na elaboração de um bom plano para o SQL Server?
Isso foi apenas uma ilusão da minha parte, e foi muito além da idéia de modificar os guias de plano. É possível, em princípio, escrever uma ferramenta para manipular o XML do plano de programa diretamente, mas sem a instrumentação específica do otimizador, o uso da ferramenta provavelmente seria uma experiência frustrante para o usuário (e o desenvolvedor passou a pensar nisso).
No contexto específico dessa questão, essa ferramenta ainda seria incapaz de materializar o conteúdo da CTE de uma maneira que pudesse ser usada por vários consumidores (para alimentar as duas entradas na junção cruzada nesse caso). O otimizador e o mecanismo de execução suportam spools de vários consumidores, mas apenas para fins específicos - nenhum dos quais poderia ser aplicado a esse exemplo em particular.
Embora não tenha certeza, tenho um palpite bastante forte de que os RelOps podem ser seguidos (Nested Loop, Lazy Spool), mesmo que a consulta não seja exatamente a mesma do plano - por exemplo, se você adicionou 4 e 5 ao CTE , ele ainda continua usando o mesmo plano (aparentemente testado no SQL Server 2012 RTM Express).
Há uma quantidade razoável de flexibilidade aqui. A ampla forma do plano XML é usada para orientar a busca de um plano final (embora muitos atributos sejam completamente ignorados, por exemplo, o tipo de particionamento nas trocas) e as regras normais de busca também sejam consideravelmente relaxadas. Por exemplo, a remoção antecipada de alternativas com base em considerações de custo é desativada, a introdução explícita de junções cruzadas é permitida e as operações escalares são ignoradas.
Há muitos detalhes para aprofundar, mas o posicionamento de Filtros e Escalares de computação não pode ser forçado, e os predicados do formulário column = value
são generalizados para que um plano que contenha X = 1
ou X = @X
possa ser aplicado a uma consulta que contenha X = 502
ou X = @Y
. Essa flexibilidade específica pode ajudar bastante na busca de um plano natural para forçar.
No exemplo específico, a união constante de todos sempre pode ser implementada como uma verificação constante; o número de entradas para a União Tudo não importa.