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 / 235197
Accepted
Trevor Giddings
Trevor Giddings
Asked: 2019-04-19 09:37:24 +0800 CST2019-04-19 09:37:24 +0800 CST 2019-04-19 09:37:24 +0800 CST

É possível que as instruções SQL sejam executadas simultaneamente em uma única sessão no SQL Server?

  • 772

Eu escrevi um procedimento armazenado que faz uso de uma tabela temporária. Eu sei que no SQL Server, as tabelas temporárias têm escopo de sessão. No entanto, não consegui encontrar informações definitivas sobre exatamente do que uma sessão é capaz. Em particular, se for possível que esse procedimento armazenado seja executado duas vezes simultaneamente em uma única sessão, um nível de isolamento significativamente mais alto será necessário para uma transação nesse procedimento devido às duas execuções que agora compartilham uma tabela temporária.

sql-server sql-server-2012
  • 2 2 respostas
  • 3713 Views

2 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2019-04-19T14:02:31+08:002019-04-19T14:02:31+08:00

    Embora a resposta de Brent esteja correta para todos os propósitos práticos, e isso não seja algo que eu já tenha visto alguém se preocupar, é possível que várias invocações de um procedimento armazenado em uma sessão afetem umas às outras por meio de uma tabela #temp com escopo de sessão .

    A boa notícia é que é extremamente improvável que aconteça na natureza porque

    1) As tabelas #Temp declaradas dentro de procedimentos armazenados ou lotes aninhados não têm visibilidade de sessão (ou tempo de vida). E estes são de longe o caso mais comum.

    2) Requer MultipleActiveResultsets e alguma programação de cliente assíncrona muito estranha, ou que o procedimento armazenado retorne um conjunto de resultados no meio e o cliente chame outra instância do procedimento armazenado enquanto processa os resultados do primeiro.

    Aqui está um exemplo inventado:

    using System;
    using System.Data.SqlClient;
    
    namespace ado.nettest
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var con = new SqlConnection("Server=localhost;database=tempdb;integrated security=true;MultipleActiveResultSets = True"))
                {
                    con.Open();
    
                    var procDdl = @"
    create table #t(id int)
    exec ('
    create procedure #foo
    as
    begin
      insert into #t(id) values (1);
      select top 10000 * from sys.messages m, sys.messages m2;
      select count(*) rc from #t;
      delete from #t;
    end
    ');
    ";
                    var cmdDDL = con.CreateCommand();
                    cmdDDL.CommandText = procDdl;
                    cmdDDL.ExecuteNonQuery();
    
                    var cmd = con.CreateCommand();
                    cmd.CommandText = "exec #foo";
                    using (var rdr = cmd.ExecuteReader())
                    {
                        rdr.Read();
    
                        var cmd2 = con.CreateCommand();
                        cmd2.CommandText = "exec #foo";
                        using (var rdr2 = cmd2.ExecuteReader())
                        {
    
                        }
    
                        while (rdr.Read())
                        {
    
                        }
                        rdr.NextResult();
                        rdr.Read();
                        var rc = rdr.GetInt32(0);
                        Console.WriteLine($"Numer of rows in temp table {rc}");
    
                    }
    
    
                }
    
                Console.WriteLine("Hit any key to exit");
                Console.ReadKey();
            }
        }
    }
    

    quais saídas

    Numer of rows in temp table 0
    Hit any key to exit
    

    porque a segunda chamada do procedimento armazenado inseriu uma linha e, em seguida, excluiu todas as linhas de #t enquanto a primeira chamada estava aguardando o cliente buscar as linhas de seu primeiro conjunto de resultados. Observe que, se o primeiro conjunto de resultados for pequeno, as linhas podem ser armazenadas em buffer e a execução pode continuar sem enviar nada ao cliente.

    Se você mover o

    create table #t(id int)
    

    no procedimento armazenado, ele gera:

    Numer of rows in temp table 1
    Hit any key to exit
    

    E com a tabela temporária declarada dentro do procedimento, se você alterar a segunda consulta para

    cmd2.CommandText = "select * from #t";
    

    Ele falha com:

    'Nome de objeto inválido '#t'.'

    Porque uma tabela #temp criada dentro de um procedimento armazenado ou lote aninhado só é visível nesse procedimento armazenado ou lote e em procedimentos aninhados e lotes que ele chama e é destruída quando o procedimento ou lote termina.

    • 20
  2. Brent Ozar
    2019-04-19T09:41:17+08:002019-04-19T09:41:17+08:00

    Não concomitantemente. Suas opções incluem:

    • Execute as consultas uma após a outra na mesma sessão
    • Alterne de uma tabela temporária para uma tabela temporária global (use ##TableName em vez de #TableName), mas esteja ciente de que a tabela temporária global é automaticamente descartada quando a sessão que criou a tabela temporária é fechada e não há outras sessões ativas com uma referência a isso
    • Mude para uma tabela de usuário real no TempDB - você pode criar tabelas lá, mas esteja ciente de que elas desaparecerão na reinicialização do servidor
    • Mudar para uma tabela de usuário real em um banco de dados de usuário
    • 12

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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