EDITAR:
Por favor, veja os comentários de Martin abaixo:
O CTE não é materializado como uma tabela na memória. É apenas uma maneira de encapsular uma definição de consulta. No caso do PO, ele será incorporado e o mesmo que apenas fazer SELECT Column1, Column2, Column3 FROM SomeTable
. Na maioria das vezes eles não são materializados antecipadamente, e é por isso que isso não retorna linhas WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, verifique também os planos de execução. Embora às vezes seja possível hackear o plano para obter um carretel. Há um item de conexão solicitando uma dica para isso. - Martin Smith Feb 15 '12 às 17:08
Resposta original
CTE
Leia mais no MSDN
Um CTE cria a tabela que está sendo usada na memória, mas é válida apenas para a consulta específica a seguir. Ao usar a recursão, isso pode ser uma estrutura eficaz.
Você também pode considerar o uso de uma variável de tabela. Isso é usado quando uma tabela temporária é usada e pode ser usada várias vezes sem precisar ser materializado novamente para cada junção. Além disso, se você precisar persistir alguns registros agora, adicione mais alguns registros após a próxima seleção, adicione mais alguns registros após outra operação e, em seguida, retorne apenas alguns poucos registros, pois isso pode ser uma estrutura útil, pois não precisa ser descartado após a execução. Principalmente apenas açúcar sintático. No entanto, se você mantiver a contagem de linhas baixa, ela nunca se materializa em disco. Consulte Qual é a diferença entre uma tabela temporária e uma variável de tabela no SQL Server? para mais detalhes.
Tabela Temp
Leia mais no MSDN - role para baixo cerca de 40% do caminho
Uma tabela temporária é literalmente uma tabela criada em disco, apenas em um banco de dados específico que todos sabem que pode ser excluído. É de responsabilidade de um bom desenvolvedor destruir essas tabelas quando elas não são mais necessárias, mas um DBA também pode limpá-las.
As tabelas temporárias são fornecidas em duas variedades: local e global. Em termos de MS Sql Server, você usa uma #tableName
designação para local e ##tableName
designação para global (observe o uso de um único ou duplo # como a característica de identificação).
Observe que, com tabelas temporárias, ao contrário de variáveis de tabela ou CTE, é possível aplicar índices e similares, pois são legitimamente tabelas no sentido normal da palavra.
Geralmente eu usaria tabelas temporárias para consultas maiores ou maiores, e CTEs ou variáveis de tabela se já tivesse um pequeno conjunto de dados e quisesse rapidamente criar um pouco de código para algo pequeno. A experiência e os conselhos de outras pessoas indicam que você deve usar CTEs nas quais um pequeno número de linhas é retornado. Se você tiver um número grande, provavelmente se beneficiaria da capacidade de indexar na tabela temporária.