AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 14490
Accepted
Royi Namir
Royi Namir
Asked: 2012-03-07 08:19:00 +0800 CST2012-03-07 08:19:00 +0800 CST 2012-03-07 08:19:00 +0800 CST

Benefícios da Expressão de Tabela Comum (CTE)?

  • 772

Do msdn :

Ao contrário de uma tabela derivada, uma CTE pode ser auto-referenciada e pode ser referenciada várias vezes na mesma consulta.

Estou usando bastante CTEs, mas nunca pensei profundamente sobre os benefícios de usá-los.

Se eu fizer referência a um CTE várias vezes na mesma consulta:

  • Existe algum benefício de desempenho?
  • Se eu estiver fazendo uma autojunção, o SQL Server verificará as tabelas de destino duas vezes?
sql-server cte
  • 3 3 respostas
  • 28541 Views

3 respostas

  • Voted
  1. Best Answer
    JNK
    2012-03-07T10:24:10+08:002012-03-07T10:24:10+08:00

    Como regra, um CTE NUNCA melhorará o desempenho .

    Um CTE é essencialmente uma visão descartável. Não há estatísticas adicionais armazenadas, índices, etc. Funciona como um atalho para uma subconsulta.

    Na minha opinião, eles podem ser facilmente usados ​​​​em excesso (eu vejo muito uso excessivo de código no meu trabalho). Algumas boas respostas estão aqui, mas se você precisar se referir a algo mais de uma vez, ou for mais do que algumas centenas de milhares de linhas, coloque-o em uma #temptabela e indexe-o.

    • 26
  2. HLGEM
    2012-03-07T12:51:25+08:002012-03-07T12:51:25+08:00

    Um lugar além da recursão onde acho os CTEs incrivelmente úteis é ao criar consultas de relatórios complexos. Eu uso uma série de CTEs para obter partes dos dados de que preciso e, em seguida, combino na seleção final. Acho que eles são mais fáceis de manter do que fazer a mesma coisa com muitas tabelas derivadas ou 20 junções e acho que posso ter mais certeza de que ele retorna os dados corretos sem efeito de vários registros devido aos relacionamentos um-muitos em todas as diferentes junções. Deixe-me dar um exemplo rápido:

    ;WITH Conferences (Conference_id)
    AS 
    (select  m.Conference_id
    FROM mydb.dbo.Conference m 
    WHERE client_id = 10
        and Conference_id in 
                (select Conference_id from mydb.dbo.Expense 
                where amount <>0
                and amount is not null)
         )
    --select * from Conferences
    ,MealEaters(NumberMealEaters, Conference_id, AttendeeType)
    AS
    (Select count(*) as NumberMealEaters, m.Conference_id,  AttendeeType 
    from mydb.dbo.attendance ma 
    join Conferences m on m.Conference_id = ma.Conference_id
    where (ma.meals_consumed>0 or meals_consumed is null)and attended = 1
    group by m.Conference_id)
    --select * from MealEaters
    
    ,Expenses (Conference_id,expense_date, expenseDescription,  RecordIdentifier,amount)
    AS
    (select Conference_id,max(expense_date) as Expense_date, expenseDescription,  RecordIdentifier,sum(amount) as amount
        FROM
            (SELECT Conference_id,expense_date,  amount, RecordIdentifier
            FROM mydb.dbo.Expense
            WHERE  amount <> 0 
                and Conference_id IN 
                (SELECT  Conference_id
                FROM mydb.dbo.Conferences ) 
            group by Conference_id, RecordIdentifier) a
    )
    --select * from Expenses
    Select m.Conference_id,me.NumberMealEaters, me.AttendeeType, e.expense_date,         e.RecordIdentifier,amount
    from Conferences m
    join mealeaters me on m.Conference_id = me.Conference_id
    join expenses e on e.Conference_id = m.Conference_id
    

    Então, separando os diferentes pedaços de informação que você deseja, você pode verificar cada parte individualmente (usando os selects comentados, descomentando cada um individualmente e executando apenas até aquele select) e se você precisar fazer uma alteração na despesa cálculo (neste exemplo), é mais fácil de encontrar do que quando todos estão misturados em uma consulta massiva. É claro que as consultas de relatórios reais para as quais uso isso geralmente são muito mais complicadas do que o exemplo.

    • 14
  3. Ron S
    2014-05-14T10:05:00+08:002014-05-14T10:05:00+08:00

    Como sempre depende, mas há casos em que o desempenho é muito melhorado. Eu vejo isso com instruções INSERT INTO SELECT onde você usa um CTE para selecionar e depois usa isso no INSERT INTO. Pode ter a ver com o RCSI sendo definido para o banco de dados, mas para aqueles momentos em que muito pouco é selecionado, pode ajudar bastante.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve