Escolar Documentos
Profissional Documentos
Cultura Documentos
SUMÁRIO
2. DESENVOLVIMENTO DO DOCUMENTO........................................................................................................... 2
3. OBJETIVO DESTE DOCUMENTO ....................................................................................................................... 2
4. APLICAÇÃO ...................................................................................................................................................... 2
5. MÉTODOS DE INSPEÇÃO ................................................................................................................................. 2
6. DESENVOLVIMENTO........................................................................................................................................ 2
6.1. USO DE CURSOR EXPLÍCITO ............................................................................................................................. 2
6.2. USO DE LOOP E/OU CURSORES ANINHADOS .................................................................................................. 3
6.3. USO DA CLÁUSULA DISTINCT COM OPERADOR UNION .................................................................................. 3
6.4. USO DE OPERADORES: !=, !, NOT, IS NULL, LIKE ‘%VALOR’, LIKE ‘%VALOR%’ ................................................ 3
6.5. USO DE INLINE VIEW (SUBQUERY) .................................................................................................................. 4
6.6. USO DE LITERAIS NAS STATEMENTS T-SQL ..................................................................................................... 4
6.7. OCORRÊNCIA DE JOINS POR MEIO DE LINKED SERVERS ................................................................................. 4
6.8. USO DE FOR UPDATE ....................................................................................................................................... 4
6.9. OCORRÊNCIA DE COMANDO CASE / IF SEM ELSE (DEFAULT) ......................................................................... 4
6.10. OCORRÊNCIA DE EXCEPTION SEM RETURN EM FUNCTIONS .......................................................................... 5
6.11. OCORRÊNCIA DE EXCEPTION NÃO TRATADA NO CÓDIGO .............................................................................. 5
6.12. USO DE EXPRESSÃO COMPLEXA SEM PARÊNTESES () ..................................................................................... 5
6.13. USO DE IN AO INVÉS DE EXISTS ....................................................................................................................... 5
6.14. USO DE JOINS COM MAIS DE CINCO TABELAS ................................................................................................ 6
6.15. USO DE CURSOR COM SEM O COMANDO CLOSE EXPLÍCITO .......................................................................... 6
6.16. USO DESNECESSÁRIO DE UNION ..................................................................................................................... 6
6.17. USO DE SELECT SEM WHERE ........................................................................................................................... 6
6.18. USO DE FUNCTION EM COLUNA NA CLÁUSULA WHERE ................................................................................. 6
6.19. USO INEFICIENTE DOS RECURSOS COMO I/O, CPU, REDE E MEMÓRIA .......................................................... 7
6.20. COMPARAÇÃO ENTRE DATATYPES DIFERENTES (CONVERSÃO IMPLÍCITA) .................................................... 7
6.21. OCORRÊNCIA DE TABLE SCAN ......................................................................................................................... 7
6.22. USO DE SQL DINÂMICO AO INVÉS DE SQL ESTÁTICO ...................................................................................... 7
6.23. QUANTIDADE DE REGISTROS RETORNADOS É SUPERIOR A MIL NO SELECT .................................................. 8
6.24. USO EXCESSIVO DE COMENTÁRIOS ................................................................................................................ 8
6.25. USO DE INSTRUÇÃO DML SEM CLÁUSULA WHERE ......................................................................................... 8
6.26. USO DE “SELECT *” .......................................................................................................................................... 8
6.27. CONCESSÃO DE PRIVILÉGIOS EM OBJETOS ..................................................................................................... 8
6.28. USO DO DELETE PARA EXCLUIR TODOS OS REGISTROS DE UMA TABELA ....................................................... 9
6.29. OCORRÊNCIA DO NOME DO SCRIPT COM ESPAÇO EM BRANCO .................................................................... 9
6.30. OBJETOS DDL SEM OWNER PRECEDENTE AO NOME DO OBJETO .................................................................. 9
6.31. OCORRÊNCIA DE QUERY COM ALTA CARDINALIDADE .................................................................................. 10
6.32. OCORRÊNCIA DE PARTITION LIST ALL ........................................................................................................... 10
6.33. ORDER BY EM INSTRUÇÕES INSERT..SELECT OU SELECT INTO ..................................................................... 10
6.34. OCORRÊNCIA DE CRIAÇÃO DE TABELA TEMPORÁRIA “ON DEMAND” .......................................................... 10
6.35. USO DO HINT USE <DATABASE>.................................................................................................................... 10
6.36. USO DE TABELA DE MEMÓRIA ...................................................................................................................... 11
6.37. USO FORÇADO DE ÍNDICES ........................................................................................................................... 11
6.38. USO DE ÍNDICES COM CLÁUSULA INCLUDE .................................................................................................. 11
6.39. USO DE SET NOCOUNT ON EM STORED PRODECURES ................................................................................. 12
6.40. NÃO UTILIZAR O PREFIXO SP_PARA NOMEAR STORED PROCEDURES .......................................................... 12
6.41. USO DO COMANDO COUNT(*)...................................................................................................................... 12
6.42. SUBSTITUIR O USO DE CURSOR PELO COMANDO WHILE + TABELAS TEMPORÁRIAS OU VARIÁVEIS DO TIPO TABLE
13
7. RECOMENDAÇÕES NO DESENVOLVIMENTO DE PROCEDURES ..................................................................... 14
8. RECOMENDAÇÕES FINAIS ............................................................................................................................. 15
2. DESENVOLVIMENTO DO DOCUMENTO
Banco de Dados:
Wiluey Queiroz de Sousa
4. APLICAÇÃO
A todo e qualquer sistema, interno ou externo desenvolvido para a Yasuda Marítima.
5. MÉTODOS DE INSPEÇÃO
Os objetos e scripts T-SQL serão avaliados seguindo as classes de inspeção. Caso algum não esteja em conformidade
com os Padrões de Codificação da Yasuda Marítima descritos, os mesmos serão encaminhados para ajustes com
eventuais recomendações de Performance.
As regras foram divididas em classes conforme o tipo de análise a ser aplicada conforme quadro abaixo:
As regras são apresentadas descrevendo a situação de violação, ou seja, informa qual é a falha a serem contornadas
com a aplicação da regra, bem como eventuais exceções, quando for aplicável.
6. DESENVOLVIMENTO
6.4. USO DE OPERADORES: !=, !, NOT, IS NULL, LIKE ‘%VALOR’, LIKE ‘%VALOR%’
Classe Regra
A utilização dos operadores acima deve ser evitada, pois suprimem a utilização
de índices existentes nas colunas e normalmente precisam varrer toda a tabela
para satisfazer a condição, causando Table Scan. Essa regra não se aplica quando
A usada em colunas não indexadas.
Para busca de dados do tipo TEXT, VARCHAR, VARBINARY e XML, existem
processos do próprio SQL Server que otimizam este tipo de consulta. O DBA tem
total conhecimento e pode orientar o desenvolvedor no uso destas Features.
6.5. USO DE INLINE VIEW (SUBQUERY)
Classe Regra
Essa regra é violada quando há utilização de subqueries na cláusula FROM de um
script. Dependendo de como a query é resolvida pelo otimizador, a subquery
A poderá ser processada N vezes (N é a quantidade de registros retornados pela
query de fora), causando degradação de desempenho. A exceção ocorre quando
ela promove performance e não afeta a clareza e legibilidade do código.
6.19. USO INEFICIENTE DOS RECURSOS COMO I/O, CPU, REDE E MEMÓRIA
Classe Regra
Essa regra é violada quando um objeto DDL usa recursos de I/O, memória, CPU e
rede de forma ineficiente ou maiores do que o esperado. O uso ineficiente dos
D recursos da máquina pode causar o não atendimento ao tempo de resposta da
aplicação, que compromete sua operação e as necessidades do usuário final,
tornando a aplicação ineficiente.
SELECT
sysobjects.name AS [Nome da Tabela],
sysindexes.rowcnt AS [Qtde. de Registros]
FROM
sysobjects
INNER JOIN
sysindexes ON
sysindexes.id = sysobjects.id
WHERE
sysobjects.name = 'Cliente'
AND
sysindexes.indid = 1
WHILE @@FETCH_STATUS = 0
BEGIN
C PRINT @Name
SELECT TOP 1
@ROWID = VendorID,
@Name = Name
FROM Purchasing.Vendor
WHERE VendorID > @ROWID
ORDER BY VendorID
END
GO
Sempre que uma procedure é executada o server envia para o Client o número de linhas afetadas
pela procedure, normalmente esta informação não é necessária. Desabilitando este
comportamento poderemos reduzir o trafego gerado pelo Server e o Client. Portanto sempre que
possível inclua o SET NOCOUNT ON no início de suas procedures. Pode ser que isso não gere muita
diferença em uma Procedure que efetua 01 INSERT, porém quando estamos falando de um loop
que efetua milhares/milhões de INSERTS a diferença de tráfego será relativa e podemos ter
gargalos.
Deve-se usar a opção WITH ENCRYPTION e WITH RECOMPILE caso seja realmente necessário.
Lembre-se de que existem programas que conseguem descriptografar uma Procedure que está
criptografada no banco.
Não é recomendável iniciar o nome das procedures com SP... Este prefixo é reservado para
procedures do sistema, sempre que você executa uma procedure que inicia com SP... O SQL irá
procurar a Procedure no banco Master e se ela não estiver lá então ele irá resolver o nome da
Procedure no banco atual. Evite este passo adicional simplesmente renomeando as procedures.
Caso tenha que rodar algum código TSQL no meio da Procedure evite utilizar o EXEC ao invés disso
use a sp_ExecuteSQL pois ao contrário do EXEC a sp_ExecuteSQL irá compilar o SQL para gerar um
plano de execução para sua consulta, o quer dizer que caso o plano já tenha sido gerado na
próxima execução do código ele irá utilizar o plano que ficou em cachê, evitando a recompilação do
código a cada execução.
Verificar o uso de FUNCTIONS. Caso exista alguma function envolvida no SQL analise bem a
consulta e verifique se é possível alterar a consulta para fazer um JOIN com a própria tabela ou
então até mesmo tabelas temporárias.
Sempre que possível utilize “UNION ALL” ao invés de “UNION” pois o “UNION” gera um DISTINCT
que geralmente gera um ORDER BY, isso gerará um custo desnecessário comparado a concatenação
do “UNION ALL”.
8. RECOMENDAÇÕES FINAIS
Sempre que houver a possibilidade de um código processar uma quantidade de linhas muito diferentes
dependendo dos parâmetros de entrada (ou filtros) informados, não podemos correr o risco de deixar o
query processor (vide nota) executar a o código reutilizando um plano que possivelmente foi criado para
processar poucas linhas. Neste caso existem algumas opções que devem ser consideradas, são elas:
OPTION (RECOMPILE) – Esta é a opção mais simples de ser utilizada, porém irá gerar a
recompilação (geração de um plano) do código todas as vezes que ela for utilizada.
OPTION (OPTIMIZE FOR UNKNOWN) – Irá gerar um plano de execução baseado na densidade
(média de valores distintos) da coluna que está sendo filtrada
OPTION (OPTIMIZE FOR (@parametro = <algum valor> )) – Com esta opção é possível especificar
um valor para garantir que um plano seja inicialmente criado com base neste valor, ignorando o
valor passado como parâmetro de entrada.
Dependendo da quantidade de vezes que a o código é executado, recomendo utilizar a opção OPTION
(RECOMPILE), porém testes devem ser realizados para analisar se o impacto de recompilar a consulta
realmente não pode ser evitado.
Como a procedure em questão utiliza a atribuição de variável, o OPTION (RECOMPILE) tem uma limitação
que não aplica a funcionalidade de Parameter Embedding Optimization para obter o ganho do plano mais
eficiente. Para resolver este problema, pode-se jogar os dados em uma tabela temporária e depois atribuir
o valor para a variável com base na própria temporária.