SQL Server - Tabelas Temporárias x Físicas


14

Um movimento está em andamento no meu local de trabalho para deixar de usar #temp tables e, em vez disso, usar tabelas físicas permanentes com SPIDs. Sempre que alguém inseriu anteriormente em uma tabela #temp, agora INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)é necessário - junto com várias DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPIDinstruções no início de, por exemplo, um procedimento armazenado. Além disso, escusado será dizer que em qualquer lugar em que essas 'tabelas permanentes para armazenamento de dados temporários' sejam usadas, é preciso ter cuidado para incluir a WHERE SPID = @@SPID.

A lógica por trás da mudança em direção a essa prática é que ela melhorará o desempenho geral do servidor no qual as consultas estão em execução (reduzindo a E / S e a contenção em tempdb). Não gosto muito dessa abordagem por várias razões - é feia, potencialmente perigosa e parece que pode prejudicar o desempenho das consultas que usam o novo esquema.

Alguém tem alguma experiência com essa ou outras abordagens semelhantes para eliminar as tabelas #temp?

Respostas:


18

Pode-se demonstrar com bastante facilidade que não reduzirá a IO nem a contenção, mas aumentará as duas.

  • E / S : todas as linhas inseridas, lidas ou excluídas de uma tabela #temp agora serão inseridas, lidas ou excluídas da tabela @@ SPID. Mas cada linha será mais ampla com uma coluna @@ SPID adicional, portanto, o número de páginas necessárias aumentará um pouco e a IO será um pouco maior. Mais importante, porém, a queda de uma tabela #temp e a inicialização da tabela #temp de uma nova sessão por uma sessão agora terão que ser simuladas com a DELETE FROM @@spidTable WHERE spid = @@SPIDe, portanto, truncar / criar operação (por exemplo, operações de gerenciamento de extensão de página) será transformada em operações de linha, incomparável mais devagar.
  • Contenção : Toda varredura que estava usando bloqueios de página na tabela #temp agora pode bloquear uma página com linhas spid não relacionadas, criando assim uma contenção anteriormente inexistente. Toda atualização que faz mais que atinge o limite de escalação de bloqueios tem a oportunidade de escalar o bloqueio para o bloqueio de tabela e, assim, bloquear todos os outros spid.

Portanto, embora seja verdade que você não atingirá a mítica contenção IAM / SGAM / GAM no tempdb, a única razão pela qual isso aconteceria é porque suas operações se tornarão muito mais lentas devido a IO extra comum e contenção extra.


Eu concordo totalmente com o Remus acima - e obrigado por uma excelente resposta. O problema é que estamos causando um suposto impacto no desempenho de aplicativos de terceiros (com vários bancos de dados em um servidor no qual temos um banco de dados próprio - precisamos executar consultas versus seus dados). Eu ainda acho que você está certo, mente - em termos de E / S, eu esperaria que a nova abordagem tivesse um desempenho consideravelmente pior do que anteriormente - em termos de contenção, do ponto de vista dos tempdbs, as coisas serão melhores - do nosso, um pouco pior.
Will A

Quantos arquivos tempdb você possui? A configuração padrão não é realmente escalável - você deve ter vários arquivos de arquivo e log tempdb, um por núcleo visível do processador (2 cada um, se hyper-v).
TomTom

1
Você deve ler estes dois artigos: sqlskills.com/BLOGS/PAUL/post/… e sqlskills.com/BLOGS/PAUL/post/…, pois eles solucionam os problemas mais comuns de escalabilidade do tempdb.
Remus Rusanu

@TomTom whoa, whoa. Vários arquivos de log? Verdade?
Aaron Bertrand

5

Parece uma solução drástica. Existem muitos artigos on-line sobre como reduzir a contenção de tempdb (e otimizar seu uso) - sua organização examinou completamente essa avenida?

http://www.sql-server-performance.com/tips/tempdb_p1.aspx

http://www.sqlservercentral.com/blogs/robert_davis/archive/2010/03/05/Breaking-Down-TempDB-Contention.aspx

http://searchsqlserver.techtarget.com/tip/Optimize-tempdb-in-SQL-Server-by-striping-and-splitting-to-multiple-files

etc.


O +1 concorda completamente - otimize o tempdb, não reinvente a roda, pois sua implementação será pior. :)

Eu sou a favor de não seguir esse caminho, se não for justificável - obrigado pelas informações Ben -, investigarei e farei sugestões ao nosso DBA, conforme apropriado.
Will A

2

Parece-me que você deveria solucionar os problemas de desempenho no tempDB, há algumas sugestões aqui


Parece útil - obrigado SPE109, vou verificar isso e fazer recomendações ao nosso DBA, conforme apropriado.
Will A
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.