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 / 39081
Accepted
Gordon Linoff
Gordon Linoff
Asked: 2013-04-03 10:40:49 +0800 CST2013-04-03 10:40:49 +0800 CST 2013-04-03 10:40:49 +0800 CST

Operação Física de Concatenação: Garante a ordem de execução?

  • 772

No SQL padrão, union allnão é garantido que o resultado de a esteja em qualquer ordem. Então, algo como:

select 'A' as c union all select 'B'

Poderia retornar duas linhas em qualquer ordem (embora, na prática, em qualquer banco de dados que eu conheça, 'A' virá antes de 'B').

No SQL Server, isso se transforma em um plano de execução usando uma operação física de "concatenação".

Eu poderia facilmente imaginar que a operação de concatenação varreria suas entradas, retornando qualquer entrada que tivesse registros disponíveis. No entanto, encontrei a seguinte declaração na web ( aqui ):

O Processador de Consultas executará este plano na ordem em que os operadores aparecem no plano, o primeiro é o superior e o último é o final.

Pergunta: Isso é verdade na prática? Isso é garantido para ser verdade?

Não encontrei nenhuma referência na documentação da Microsoft de que as entradas são verificadas em ordem, da primeira à última. Por outro lado, sempre que tento executá-lo, os resultados sugerem que as entradas são, de fato, processadas em ordem.

Existe uma maneira de fazer com que o mecanismo processe mais de uma entrada por vez? Meus testes (usando expressões muito mais complicadas do que constantes) estão em uma máquina de 8 núcleos habilitada para paralelo, e a maioria das consultas tira proveito do paralelismo.

sql-server execution-plan
  • 3 3 respostas
  • 1702 Views

3 respostas

  • Voted
  1. Best Answer
    StrayCatDBA
    2013-04-09T08:55:52+08:002013-04-09T08:55:52+08:00

    Não , não há documentação da Microsoft que garanta o comportamento, portanto não é garantido .

    Além disso, supondo que o artigo Simple Talk esteja correto e que o operador físico Concatenation sempre processe as entradas na ordem mostrada no plano (muito provável que seja verdade), sem garantia de que o SQL Server sempre gerará planos que mantêm o mesmo a ordem entre o texto da consulta e o plano de consulta, você está apenas um pouco melhor.

    Podemos investigar isso ainda mais. Se o otimizador de consulta conseguiu reordenar a entrada do operador Concatenação, deve haver linhas no DMV não documentado, sys.dm_exec_query_transformation_statscorrespondentes a essa otimização.

    SELECT * FROM sys.dm_exec_query_transformation_stats 
        WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
    

    No SQL Server 2012 Enterprise Edition, isso produz 24 linhas. Ignorando as falsas correspondências para transformações relacionadas a constantes, existe uma transformação relacionada ao Operador Físico de Concatenação UNIAtoCON(Union All to Concatenation). Portanto, no nível do operador físico, parece que uma vez que um operador de concatenação é selecionado, ele será processado na ordem do operador lógico Union All do qual foi derivado.


    Na verdade, isso não é bem verdade. Existem reescritas pós-otimização que podem reordenar as entradas para um operador de concatenação físico após a conclusão da otimização baseada em custo. Um exemplo ocorre quando a concatenação está sujeita a uma meta de linha (portanto, pode ser importante ler primeiro a partir da entrada mais barata). Veja UNION ALLOtimização de Paul White para mais detalhes.

    Essa reescrita física tardia era funcional até e incluindo o SQL Server 2008 R2, mas uma regressão significava que ela não se aplicava mais ao SQL Server 2012 e posterior. Foi emitida uma correção que restabelece essa regravação para SQL Server 2014 e posterior (não 2012) com hotfixes do otimizador de consulta ativados (por exemplo, sinalizador de rastreamento 4199).


    Mas sobre o operador Logical Union All ( UNIA)? Há uma UNIAReorderInputstransformação, que pode reordenar as entradas. Há também dois operadores físicos que podem ser usados ​​para implementar um Union All lógico UNIAtoCONe UNIAtoMERGE(Union All to Merge Union).

    Portanto, parece que o otimizador de consulta pode reordenar as entradas para um UNION ALL; no entanto, não parece ser uma transformação comum (zero uso de UNIAReorderInputsnos SQL Servers que tenho prontamente acessíveis. Não sabemos as circunstâncias que fariam o uso do otimizador UNIAReorderInputs; embora certamente seja usado quando um guia de plano ou uso a dica de plano é usada para forçar um plano gerado usando as entradas reordenadas físicas de meta de linha mencionadas acima.

    Existe uma maneira de fazer com que o mecanismo processe mais de uma entrada por vez?

    O operador físico Concatenação pode existir em uma seção paralela de um plano. Com alguma dificuldade, consegui produzir um plano com concatenações paralelas usando a seguinte consulta:

    SELECT userid, regdate  FROM (  --Users table is around 3mil rows
        SELECT  userid, RegDate FROM users WHERE userid > 1000000
        UNION 
        SELECT  userid, RegDate FROM users WHERE userid < 1000000
        UNION all
        SELECT userid, RegDate FROM users WHERE userid < 2000000
        ) d ORDER BY RegDate OPTION (RECOMPILE)
    

    Portanto, no sentido mais estrito, o operador físico de concatenação parece sempre processar as entradas de maneira consistente (primeiro a primeira, segunda inferior); no entanto, o otimizador pode alternar a ordem das entradas antes de escolher o operador físico ou usar uma união de mesclagem em vez de uma concatenação.

    • 12
  2. Mikael Eriksson
    2014-06-23T04:30:49+08:002014-06-23T04:30:49+08:00

    Segundo Craig Freedman , a ordem de execução do operador de concatenação é garantida.

    De sua postagem no blog Viewing Query Plans on MSDN Blogs:

    Observe que quando um operador tem mais de um filho, a ordem dos filhos é importante. O filho mais alto é o primeiro filho, enquanto o filho mais baixo é o segundo. O operador de concatenação processa os filhos nesta ordem.

    E dos livros online Showplan Logical and Physical Operators Reference

    O operador físico Concatenação tem duas ou mais entradas e uma saída. A concatenação copia as linhas do primeiro fluxo de entrada para o fluxo de saída e repete essa operação para cada fluxo de entrada adicional.

    • 9
  3. 2 revsuser126897
    2017-08-10T05:00:17+08:002017-08-10T05:00:17+08:00

    Resposta da wiki da comunidade :

    Não sei se você pode provar que qualquer comportamento observado é sempre garantido, de uma forma ou de outra, a menos que você possa fabricar um contra-exemplo. Na ausência disso, a maneira de corrigir a ordem em que os resultados são retornados, é claro, é adicionar um arquivo ORDER BY.

    Não sei se existe um "conserto", ou se existe a necessidade de um conserto, se puder demonstrar que em alguns cenários as consultas são processadas em uma ordem diferente.

    A falta de qualquer documentação oficial explícita sugere-me que você não deve depender disso. Esse é exatamente o tipo de coisa que causava problemas às pessoas com ORDER BYuma exibição e GROUP BYsem ORDER BY, 8 anos atrás, quando o otimizador do SQL Server 2005 foi lançado.

    Com todos os novos recursos nas versões mais recentes do SQL Server (com mais por vir), mesmo que você pense que pode garantir um comportamento específico hoje, eu não esperaria que isso fosse verdade (até que seja documentado).

    Mesmo que você não dependa desse comportamento, o que fará com os resultados? De qualquer forma, eu não chamaria um artigo do Simple Talk de um oficial de fora . Pelo que sabemos, isso é apenas um palpite baseado na observação.

    A Microsoft nunca publicará documentação oficial dizendo que 'x' não tem garantia de fazer 'y'. Esta é uma das razões pelas quais ainda, quase uma década depois, temos dificuldade em convencer as pessoas de que elas não podem confiar em pedidos observados sem ORDER BY- não há documentação que afirme "não é garantido".

    • 3

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 fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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

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