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 / user-29332

Alex Shelemin's questions

Martin Hope
Alex Shelemin
Asked: 2021-02-16 01:33:23 +0800 CST

Linhas ausentes no isolamento confirmado de leitura

  • 7

É bem conhecido que o isolamento Read Committed é propenso a diferentes anomalias. Li a série de The Great Paul White sobre níveis de isolamento. O post relevante para a discussão é este:

  • O Nível de Isolamento Comprometido de Leitura

Ele afirma (novamente, é razoavelmente bem conhecido), que uma instrução executada sob isolamento de leitura confirmada:

Can encounter the same row multiple times;
Can miss some rows completely;

Minha pergunta é sobre a parte das 'linhas ausentes'. Exemplos que falam sobre linhas ausentes geralmente demonstram o problema usando consultas como:

select count(*) from table.

Minha pergunta é que as linhas podem ser perdidas em uma consulta de seleção 'regular' ? Ou seja, uma consulta como

select * from table

ou mesmo

select * from table where id = @id

também perder as linhas que são confirmadas antes do início dessa consulta? Esta pergunta se aplica apenas a Read confirmada com bloqueio (não RCSI), pois o RCSI não permite esses tipos de anomalias.

sql-server concurrency
  • 1 respostas
  • 343 Views
Martin Hope
Alex Shelemin
Asked: 2016-04-27 14:30:12 +0800 CST

LOB_DATA, varreduras de tabela lentas e algumas questões de E/S

  • 19

Eu tenho uma tabela bastante grande com uma das colunas sendo dados XML com um tamanho médio de entrada XML de aproximadamente 15 kilobytes. Todas as outras colunas são ints regulares, bigints, GUIDs etc. Para ter alguns números concretos, digamos que a tabela tenha um milhão de linhas e tenha aproximadamente 15 GB de tamanho.

O que notei é que esta tabela é muito lenta para selecionar dados se eu quiser selecionar todas as colunas. Quando eu faço

SELECT TOP 1000 * FROM TABLE

leva cerca de 20 a 25 segundos para ler os dados do disco - mesmo que eu não imponha nenhuma ordem no resultado. Eu executo a consulta com o cache frio (ou seja, após DBCC DROPCLEANBUFFERS). Aqui estão os resultados das estatísticas de IO:

Contagem de varredura 1, leituras lógicas 364, leituras físicas 24, leituras antecipadas 7191, leituras lógicas lob 7924, leituras físicas lob 1690, leituras antecipadas lob 3968.

Ele pega ~ 15 MB de dados. O plano de execução mostra o Clustered Index Scan como eu esperava.

Não há nenhum IO acontecendo no disco além de minhas consultas; Também verifiquei se a fragmentação do índice clusterizado está próxima de 0%. Esta é uma unidade SATA de nível de consumidor, no entanto, ainda acho que o SQL Server seria capaz de verificar a tabela mais rapidamente do que ~ 100-150 MB/min.

A presença do campo XML faz com que a maioria dos dados da tabela sejam localizados nas páginas LOB_DATA (na verdade, ~90% das páginas da tabela são LOB_DATA).

Acho que minha pergunta é - estou correto ao pensar que as páginas LOB_DATA podem causar verificações lentas não apenas por causa de seu tamanho, mas também porque o SQL Server não pode verificar o índice clusterizado com eficiência quando há muitas páginas LOB_DATA na tabela?

Ainda mais amplamente - é considerado razoável ter tal estrutura de tabela/padrão de dados? As recomendações para usar o Filestream geralmente indicam tamanhos de campo muito maiores, então não quero seguir esse caminho. Eu realmente não encontrei nenhuma boa informação sobre este cenário em particular.

Tenho pensado na compactação XML, mas ela precisa ser feita no cliente ou com SQLCLR e exigiria bastante trabalho para implementar no sistema.

Tentei a compactação e, como os XMLs são altamente redundantes, posso (no aplicativo ac#) compactar o XML de 20 KB para ~ 2,5 KB e armazená-lo na coluna VARBINARY, evitando o uso de páginas de dados LOB. Isso acelera SELECTs 20x vezes em meus testes.

sql-server performance
  • 2 respostas
  • 3367 Views
Martin Hope
Alex Shelemin
Asked: 2015-09-23 08:05:35 +0800 CST

Por que as estimativas de linha do SQL Server mudam quando adiciono uma dica de junção?

  • 16

Eu tenho uma consulta que une algumas tabelas e tem um desempenho muito ruim - as estimativas de linha estão muito (1000 vezes) erradas e a junção de loops aninhados é escolhida, resultando em várias varreduras de tabela. A forma da consulta é bastante simples, parecendo algo assim:

SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id
LEFT OUTER JOIN t4 ON t3.t4_id = t4.id 
WHERE t4.id = some_GUID

Brincando com a consulta, notei que, quando sugiro usar uma junção de mesclagem para uma das junções, ela é executada muito mais rápido. Isso eu posso entender - Merge join é uma opção melhor para os dados que são unidos, mas o SQL Server simplesmente não estima corretamente escolhendo os Nested Loops.

O que não entendo completamente é por que essa dica de junção altera todas as estimativas para todas as operadoras de planos? Ao ler diferentes artigos e livros, presumi que as estimativas de cardinalidade são executadas antes de o plano ser criado, portanto, usar uma dica não alteraria as estimativas, mas diria explicitamente ao SQL Server para usar uma implementação de junção física específica.

O que vejo, no entanto, é que a sugestão de mesclagem faz com que todas as estimativas se tornem praticamente perfeitas. Por que isso acontece e existem técnicas comuns para fazer o otimizador de consulta fazer uma estimativa melhor sem uma dica - considerando que as estatísticas obviamente permitem isso?

UPD: planos de execução anônimos podem ser encontrados aqui: https://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl=0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl =0

Eu verifiquei as estatísticas usadas por ambas as consultas usando TF 3604, 9292 e 9204, e elas são idênticas. No entanto, os índices que são verificados/buscados diferem entre as consultas.

Além disso, tentei executar a consulta com OPTION (FORCE ORDER)- ela é ainda mais rápida do que usar merge join, escolhendo HASH MATCH para cada junção.

sql-server t-sql
  • 2 respostas
  • 620 Views

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