Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Foram 10 artigos escritos sobre a “Saga da otimização com comandos antigos”, na qual usei o objetivo era mostrar alguns conceitos importantes do SQL Server.
- Parte 1: SET STATISTICS IO
- Parte 2: DBCC DROPCLEANBUFFERS
- Parte 3: DBCC SHOWCONTIG
- Parte 4: DBCC PAGE
- Parte 5: sp_spaceused
- Parte 6: DBCC IND
- Parte 7: DBCC INDEXDEFRAG
- Parte 8: DBCC DBREINDEX
- Parte 9: sp_detach_db
- Parte 10: SET SHOWPLAN_TEXT
Assim aprendi como funciona um banco de dados:
- O importante é sempre medir I/O
- Existem duas estruturas de dados importantes: Heaps e B-Trees
- Fragmentação de dados impacta diretamente o desempenho do Table Scan
Table Scan
Embora muita gente (eu inclusive!) diga que Table Scan e Desempenho não combinam, precisamos compreender a importância do Table Scan em um banco de dados relacional. Essa é a operação mais eficiente para ler um grande número de registros, sendo superior a qualquer forma de Index Seek/Row Lookup. Por isso, o Table Scan é uma operação presente em grandes Data Warehousing e não podemos ignorá-la.
Como principal fundamento do Table Scan, o Read-Ahead (também chamado de read prefetch) é usado para consolidar múltiplas solicitações de I/O em apenas uma requisição. A diferença em desempenho é brutal e pode melhorar em 10x.
O principal inimigo do Table Scan é a fragmentação dos dados em disco, que impede o SQL de realizar read-aheads. Isso pode se manifestar em estruturas do tipo Heap ou B-Tree.
Relendo os Artigos
Quando pensei em escrever os artigos sobre desempenho de banco de dados, achei que seria importante ressaltar o conceito de IAM Scan. O motivo é simples: há pouca documentação sobre essa operação. Decidi escrever os artigos usando um tema sarcástico: “otimização com comandos antigos” e, agora que conclui, acabei me arrependendo por não conseguir dar o foco correto à série.
Por isso, recomendo que entendam que cada artigos possui uma motivação por trás:
- A importância de medir I/O e o cuidado com o Cache em memória
- Parte 1: SET STATISTICS IO
- Parte 2: DBCC DROPCLEANBUFFERS
- Estrutura Heap e sua fragmentação
- Parte 3: DBCC SHOWCONTIG
- Parte 4: DBCC PAGE
- Parte 5: sp_spaceused
- Estrutura B-Tree e sua fragmentação
- Parte 6: DBCC IND
- Parte 7: DBCC INDEXDEFRAG
- Parte 8: DBCC DBREINDEX
- Impacto da fragmentação
- Parte 9: sp_detach_db
- Por que Table Scan quando um índice resolve?
- Parte 10: SET SHOWPLAN_TEXT
Meu artigo favorito é a Parte 5: sp_spaceused, na qual fica explícito um comportamento indesejado das Heaps.
Todos os artigos tentam mostrar os problemas que impactam diretamente o desempenho o Table Scan.
O último artigo (Parte 10: SET SHOWPLAN_TEXT) mostra que, quando se retornam POUCOS registros, então um índice funciona melhor. No próximo artigo, gostaria de discutir mais e falar sobre o "fim do table scan".
Comments
- Anonymous
June 01, 2016
Como sempre sendo o grande diferenciador do mundo SQL Server, obrigado por dedicar seu tempo para escrever artigos valiosos como esse.- Anonymous
June 01, 2016
Obrigado Luan! É muito bom receber um feedback seu.
- Anonymous