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 / 180069
Accepted
Chris Halcrow
Chris Halcrow
Asked: 2017-07-18 18:07:39 +0800 CST2017-07-18 18:07:39 +0800 CST 2017-07-18 18:07:39 +0800 CST

Tabela temporária do servidor SQL usando # - é acessível apenas pela consulta contida para várias conexões com o mesmo login?

  • 772

Digamos que temos 2 consultas completamente diferentes, que fazem referência a uma tabela temporária com o mesmo nome:

consulta um .... opera em: #tempTableName

consulta dois .... opera em: #tempTableName

Eu pesquisei isso e descobri que "#temp é uma tabela temporária local e, portanto, não é visível para outras conexões", no entanto, não tenho certeza do que uma conexão realmente significa em profundidade no contexto de consultas SQL. O SQL considera que há uma 'conexão' separada para cada consulta separada que é executada ou uma conexão é compartilhada de alguma forma?

Especificamente, minha pergunta é "o que está acontecendo se as duas consultas no meu cenário estão sendo acessadas pelo mesmo login", por exemplo, vários aplicativos .NET estão usando a mesma cadeia de conexão .NET e acessando simultaneamente o banco de dados. Eles vão acessar potencialmente a mesma tabela temporária se ambas as consultas no meu cenário estiverem sendo executadas simultaneamente? E as fechaduras? Preciso fazer alguma coisa para evitar o acesso indesejado durante as operações na mesa?

Eu olhei para esta resposta, https://stackoverflow.com/questions/466947/are-temporary-tables-thread-safe , no entanto, eu realmente preciso de algo como uma explicação 'fingir que tenho 6 anos' para que eu Estou muito claro sobre o que está acontecendo no meu cenário hipotético em termos de exatamente como as consultas SQL estão utilizando conexões e determinando acesso exclusivo etc. Quaisquer diagramas ou ponteiros para recursos que possam me dar um comando completo disso seria ótimo!

sql-server concurrency
  • 1 1 respostas
  • 15095 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2017-07-18T18:14:31+08:002017-07-18T18:14:31+08:00

    Objetos temporários locais são separados por Session. Se você tiver duas consultas em execução simultaneamente, elas são claramente duas sessões completamente separadas e você não precisa se preocupar. O Login não importa. E se você estiver usando o pool de conexões, isso também não importará. Objetos temporários locais (tabelas com mais frequência, mas também procedimentos armazenados) estão protegidos de serem vistos por outras sessões.

    Embora seu código tenha um nome único e comum para os objetos temporários locais, o SQL Server anexa uma string exclusiva a cada nome de objeto por cada sessão (e, se necessário, por cada subprocesso) para mantê-los separados. Você pode ver isso executando as seguintes consultas no SSMS:

    CREATE TABLE #T (Col1 INT)
    
    SELECT * FROM tempdb.sys.tables WHERE [name] LIKE N'#T%';
    

    Você verá algo como o seguinte para o nome (removi a maioria dos sublinhados do meio do nome para evitar a necessidade de rolar aqui):

    #T_______________00000000001F
    

    Em seguida, sem fechar essa guia de consulta, abra uma nova guia de consulta e cole essas mesmas 2 consultas e execute-as. Agora você deve ver algo como o seguinte:

    #T_______________00000000001F
    #T_______________000000000020
    

    Portanto, cada vez que seu código fizer referência a #T, o SQL Server o traduzirá para o nome adequado com base na sessão. Tudo é tratado auto-magicamente :-).

    Para ilustrar este ponto. Trabalhei em sistemas altamente transacionais (milhares de transações por segundo) e eram aplicativos web SaaS (Software as a Service) rodando 24 horas por dia, 7 dias por semana. Todo o código T-SQL estava em Stored Procedures (ou seja: mesmo nome de tabela temporária local para cada execução desse código) e fizemos um bom uso das tabelas temporárias locais. Sendo um aplicativo da web, o Login foi o mesmo em quase todas as conexões e definitivamente usamos o pool de conexões. Nunca tivemos problemas para indicar qualquer acesso entre sessões de objetos temporários locais com o mesmo nome. E, francamente, ficaríamos chocados e usaríamos nosso contrato de suporte com a Microsoft para consertá-lo se isso acontecesse.

    Pontos adicionais a serem lembrados em relação às tabelas temporárias locais:

    1. Embora seus nomes sejam exclusivos, seus objetos dependentes não são. Você não pode criar Triggers ou Chaves Estrangeiras em tabelas temporárias, portanto, trata-se realmente de Chaves Primárias, Restrições de Verificação e Restrições Padrão. Isso significa que nomear uma Chave Primária #PK_#Tnão a torna um nome exclusivo com um ID exclusivo de bastidores anexado ao nome. Se você tentar isso, obterá "Não é possível criar objeto. O objeto já existe". erros (bem, assumindo várias execuções simultâneas neste mesmo código). Portanto, se você precisar de qualquer um desses 3 tipos de objeto para uma tabela temporária local, crie o(s) objeto(s) dependente(s) embutido(s) para que eles obtenham nomes gerados pelo sistema que serão exclusivos e não entrarão em conflito entre as Sessões.

      Você não precisa se preocupar com nomes de índice, pois eles já estão separados por [object_id].

    2. Dado que você obtém "Não é possível criar objeto. O objeto já existe". erros ao criar objetos dependentes nomeados, isso traz um bom ponto que é mais frequentemente esquecido em relação a essa questão de "os objetos temporários locais são completamente isolados por sessão": Se as tabelas temporárias locais pudessem ser vistas por outras sessões, a CREATE TABLEinstrução obteria um erro, certo?

    3. Uma nuance de tabelas temporárias locais (que também é um contraponto solto para #2 acima) é que se você referenciar uma tabela temporária local em um subprocesso (ou seja, EXEC) que foi criado antes do início desse subprocesso, ela poder ver (e até modificar) essa tabela temporária local. NO ENTANTO, se esse subprocesso criar outra tabela temporária com o mesmo nome, haverá dois objetos, com IDs exclusivos separados anexados ao final, que podem ser acessados ​​por meio do nome abreviado. Lembro-me de ler em algum lugar que não há garantia de que a referência#nameno subprocesso sempre resolverá para a versão desse objeto que foi criado no subprocesso. Portanto, é melhor ter alguma exclusividade de nomes de tabelas temporárias locais entre Stored Procedures que tenham qualquer possibilidade de serem executadas em uma cadeia de chamadas de Stored Procedure aninhadas.

    • 13

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