Globalcode – Open4education As boas praticas de programação para SQL Server Marcelo Fernandes MVP - MCDBA – MCSA – MCTS – MCITP – MCT - MTA E-mail: [email protected] Twitter: @marcelodba
Globalcode – Open4education
As boas praticas de programação para SQL Server
Marcelo FernandesMVP - MCDBA – MCSA – MCTS – MCITP – MCT - MTA E-mail: [email protected] Twitter: @marcelodba
Globalcode – Open4education
Begin Transaction
SP_WHOEspecialista em Banco de Dados
Co-autor dos livros:SQL Server 2014: Alta Disp. na Prática com AlwaysOn Failover Cluster Instances
SQL Server: Além do conceito SQL Server Blog Post Collection
Palestrante
Bloghttp://marcelodba.wordpress.com
https://www.mcdbabrasil.com.br
Contatos@marcelodba
Globalcode – Open4education
Agenda
Como o SQL executa uma Query
Conceitos de Heaps e Indexação
Tipos de Índices Clustered, Nonclusterd
Conceito de Estatísticas
Conceitos de Plano de Execução
Bloqueios e Concorrência
SARG - Não SARG
Globalcode – Open4education
Como o SQL executa uma Query
NETWORK
NETWORK
Task
Task
Task
Tasks Queue
Workers (threadpool)
Worker Worker Worker Worker
Task Execution
Cache
Parsing, Compilation, Optimization
Query Execution
Plan Cache Data Cache(Buffer pool)
database
1. Requestcreates a new
Task
2. Idle Worker picks up a
pending Task
3. An execution plan is compiled
4. The Query plan is executed. Operators access data through
Buffer Pool
5. Result set is returned during
execution
6. Task is complete, Worker returns to idle
Globalcode – Open4education
Estatísticas
Conceitos de EstatísticasEstatísticas são utilizadas pelo query optimizer para determinar a distribuição dos dados de uma colunas
São armazenadas separadamente dos dados
Precisam ser mantidas
Tem três característicasCardinalidade (ajuda a calcular a quantidade de linhas)
Densidade (ajuda a entender quantos valores únicos existem)
Seletividade (ajuda a entender quantos registros atendem a busca)
Globalcode – Open4education
Planos de Execução
Principais atributos de um plano de Execução.Como os dados são acessados
Como os dados são agregados nas operações
Se está usando objeto temporários
Ordenações
Estimativa de linhas
Paralelismo
CUSTO !!!!!
Globalcode – Open4education
Planos de Execução
Como interpretar um Plano de Execução
Tabela 1Tabela 1
Tabela 2Tabela 2
• Resultset 1 and 2 são unidos utilizando um nested loops join, criando o resultset 3
11
22
33
44
• Resultset 3 and 4 são unidos utilizando um hash match join, criando o resultset 5
55
66
• Resultset 5 and 6 são unidos utilizando nested loops join, criando o resultset de retorno
Globalcode – Open4education
Bloqueios e Concorrência
Modos de Bloqueio Compartilhado – (SH) Exclusivo – (EX) Atualização – (U)
Tipos de Bloqueio Linha Página Tabela
Globalcode – Open4education
Bloqueios e Concorrência
Niveis de IsolamentoNíveis de Isolamento de transação
Read Commited.
Read Uncommited.
Repeatable Read.
Read Serializable.
Snapshot.
Globalcode – Open4education
Bloqueios e Concorrência
Niveis de IsolamentoNíveis de Isolamento de transação
Read Commited.
Read Uncommited.
Repeatable Read.
Read Serializable.
Snapshot.
Linha 1
Linha 2
Linha 5
Linha 3
Linha 6
Globalcode – Open4education
Bloqueios e Concorrência
Níveis de Isolamento de transação
Read Commited.
Read Uncommited.
Repeatable Read.
Read Serializable.
Snapshot.
Linha ALinha BLinha C
Linha ALinha BLinha C
Linha XLinha YLinha Z
Niveis de Isolamento
Linha DLinha ELinha F
Globalcode – Open4education
DEMO
• Na sessão 2, o comando SELECT realiza uma operação de leitura de T1 enquanto que, no exato momento, a sessão 1 está apagando o registro de T1. Acessos concorrentes e sem bloqueios! Do ponto de vista do SQL Server, um erro de consistência pode ocorrer a qualquer instante. Qual explicação?
• Analisando microscopicamente, o comando SELECT iniciou a operação de Table Scan em T1, realizando a leitura do registro k=0, e depois ficou bloqueado na tabela T2. Antes de avançar na leitura da tabela, uma outra sessão apagou o registro k=0 e liberou o bloqueio em T2. SELECT continua a operação de Table Scan fazendo a leitura a partir do registro k=0 para buscar k=1, mas… cade o registro k=0? Ele foi apagado. Nesse momento, o table scan foi cancelado com o erro 601 – severity 12.
NOLOCK: solicitamos que nenhum lock seja obtido na tabela.
ALTER DATABASE <Database> SET READ_COMMITTED_SNAPSHOT ON
By Fabricio Catae, http://blogs.msdn.com/b/fcatae/archive/2010/04/28/efeitos-colaterais-do-with-nolock-parte-i.aspx
Globalcode – Open4education
Boas Práticas de Desenvolvimento
Uso do AsteriscoDificuldade no uso de índices, devido a quantidade de informação retornada.Inclusão de novas colunas na tabela podem afetar a aplicação
Cláusula ORDER BY Use ORDER BY apenas quando absolutamente necessário. Ao especificar a cláusula ORDER BY, não utilize o número das colunas:
-- ORDER BY usando o número da coluna SELECT OrderID, OrderDate FROM Orders ORDER BY 2 -- ORDER BY usando o nome da coluna, mais legível SELECT OrderID, OrderDate FROM Orders ORDER BY OrderDate
SELECT * FROM TABELA
Globalcode – Open4education
Boas Práticas de Desenvolvimento
Search Arguments (SARG)
WHERE Nome = 'José'WHERE Salario > 2500WHERE 2500 < SalarioWHERE Nome = 'José' AND Salario > 5000WHERE Nome LIKE 'Fab%'
WHERE Nome LIKE ‘%Fab'WHERE ABS(Preco) > 100WHERE dbo.FnMask(Col) = ’10.330’WHERE YEAR(Data) = 2011
By Fabiano Amorim
Globalcode – Open4education
Boas Práticas de Desenvolvimento
Exemplos encontrados
POR ESTE:
ESTE CÓDIGO:
Globalcode – Open4education
Boas Práticas de Desenvolvimento
Exemplos nonSARGS
SELECT ... FROM ... WHERE Year(myDate) = 2008WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009'
Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'Select ... WHERE DealerName Like 'Ford%'
Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate())
Globalcode – Open4education
Boas Práticas de Desenvolvimento
Exemplos encontrados
POR ESTE:
ESTE CÓDIGO:
Globalcode – Open4education
Referências
Como o SQL Executa uma Query?http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/
Arquitetura de estruturas de dados de índice e tabelahttps://technet.microsoft.com/pt-br/library/ms180978(v=sql.105).aspx
Blog do Cataehttp://blogs.msdn.com/b/fcatae/archive/2010/10/05/como-usar-select-with-nolock-para-melhorar-a-performance.aspx
Blog do Fabiano Amorimhttp://blogfabiano.com/
Globalcode – Open4education
COMMIT
Obrigado!!!
Marcelo FernandesBlog - http://marcelodba.wordpress.comE-mail - [email protected] - @marcelodba