Sunteți pe pagina 1din 17

Otimizao de Consultas

Workshop

scopus.com.br

Objetivos
Ter capacidade de revisar e analisar o cdigo, procurar a melhor maneira de escrever consultas. Utilizar o plano de execuo para entender o que acontece com a query para poder otimizar a consulta.

scopus.com.br

Processamento de consultas
Uma instruo SELECT no procedural; ela no determina as etapas exatas que o servidor de banco de dados dever usar para recuperar os dados solicitados. Isso significa que o servidor de banco de dados deve analisar a instruo para determinar o modo mais eficiente para extrair os dados solicitados. Isso conhecido como otimizao da instruo SELECT.

scopus.com.br

Seqncia Lgica
Resumo da seqncia lgica das fases de processamento do cdigo fonte de uma query: (5) SELECT (1) FROM [CROSS INNER OUTER] (2) WHERE (3) GROUP BY

(4) HAVING
(6) ORDER BY

scopus.com.br

Plano de Execuo
Exibe graficamente os mtodos de recuperao de dados escolhidos pelo otimizador de consultas do SQL Server. CTRL + L (Estimado) CTRL + M (Atual)

1.

2.

3.

4. 5.

Index Seek (NonClustered): usa a capacidade de busca de ndices para recuperar linhas de um ndice. Nested Loops: executa operaes lgicas de inner join, left outer join. Index Scan (NonClustered): recupera todas as linhas do ndice no-clusterizado especificado Table Scan: recupera todas as linhas da tabela especificada RID Lookup: indicador de pesquisa que utiliza RowID para efetuar a busca, o RID Lookup sempre acompanhando por um NESTED LOOP JOIN.

scopus.com.br

Plano de Execuo

http://msdn.microsoft.com/en-us/library/ms175913(v=sql.105).aspx
scopus.com.br

Plano de Execuo

Cada consulta analisada e exibida, inclusive o custo de cada consulta, como uma porcentagem do custo total.

scopus.com.br

Boas Prticas
Limite a quantidade de linhas Para limitar o nmero de linhas use clusulas WHERE muito seletivas. Quanto mais seletivo o WHERE, menor o nmero de linhas.

Limite a quantidade de colunas NO USE Select * a menos que voc realmente precise usar todas as colunas da tabela.

Normalmente, select * no necessrio

scopus.com.br

Boas Prticas
vital escrever queries de forma que os ndices possam ser usados. EVITE condies de pesquisa no indexveis.

EVITE operadores aritmticos nas colunas da clusula WHERE.

EVITE funes nas colunas da clusula WHERE.

scopus.com.br

Boas Prticas
Condies de pesquisa no indexveis. DEVEM SER EVITADAS - Condies de pesquisa no indexveis: <>, NOT EXISTS, NOT IN, NOT LIKE IN, OR e algumas pesquisas com o LIKE como LIKE %<literal>.

PODEM SER UTILIZADAS - Condies de pesquisa indexveis: =, >, >=, <, <=, BETWEEN e algumas pesquisas com o LIKE como LIKE <literal>% .

scopus.com.br

Boas Prticas
Evite operadores aritmticos nas colunas da clusula WHERE. Operadores aritmticos nas colunas do WHERE impedem o otimizador do SQL de utilizar o ndice, consequentemente, um table scan ser feito.

Ao invs de:
select code, value from tabela WHERE orderid/2 = 22000

use
select code, value from tabela WHERE orderid = 22000/2

scopus.com.br

Boas Prticas
Funes nas colunas da clusula WHERE. Funes nas colunas do WHERE, asism como operadores aritmticos, impedem o otimizador do SQL de utilizar o ndice, consequentemente, um table scan ser feito.

Ao invs de:
select code, value from orders WHERE substring(zipcode,1,1) = V

use

select code, value from orders

WHERE zipcode like V%

scopus.com.br

Boas Prticas
Ao invs de:
select ModifiedDate

from person.contact
where datediff(minute,ModifiedDate,getdate())> 0

use select ModifiedDate from person.contact where ModifiedDate < getdate()

scopus.com.br

Boas Prticas
EVITE converses implcitas. Use o mesmo datatype no where. Use EXISTS ao invs de COUNT(*) para verificar a existncia de dados. Use UNION ALL ao invs de UNION Use um JOIN ao invs de um UNION Use ndices para agregar e ordenar quando disponveis Evite clusulas WHERE redundantes

Use JOIN ao invs de subqueries


Usar varivel table (@table) ao invs de temporria #table para trabalhar com massa de dados pequenas que no precisam ser atualizadas.

scopus.com.br

Boas Prticas
Evite variveis locais em uma query (distinguir varivel de parmetro). Varivel criada dinamicamente e o SQL vai descobrir o que fazer no momento da execuo, parmetros so armazenados no plano de execuo e o SQL j determinou o que e como deve ser feito Cuidado com os nomes das stored procedures, procedures que iniciam com sp so do sistema. No use views em joins, alis, no use views Use a nomenclatura completa para referenciar tabelas (dbo)

Utilizar SET NOCOUNT em procedures, functions e triggers.


No utilizar ndice cluster em tabelas muito atualizadas.

scopus.com.br

Boas Prticas
No relacionadas a Performance
No referenciar o alias no order Select 0 as sidney from table order by sidney Vai dar erro no SQL 2008 JOINs via WHERE um estilo suportado pelo padro ANSI SQL-89. O uso de JOIN via clusula ON foi formalmente regulado pelo ANSI SQL-92. Assim, ambos so vlidos.
Essa abordagem no mais suportada a partir do SQL Server 2012, que tem nvel mnimo de compatibilidade 90

scopus.com.br

Comandos teis
sp_helpindex TABELA : Mostra os indices da tabela e quais campos faz parte do indice. sp_spaceused TABELA : Mostra a quantidade de registros e espao fsico em disco ocupado pela tabela. xp_fixeddrives : Espao livre de todos os discos utilizados. Quando criar algum objeto dentro do banco de dados usar os comandos abaixo para saber qual filegroup ser usado, para evitar criar tudo no PRIMARY sys.sysfilegroups e sys.sysfiles
create table t1 (id int, nome varchar(30) ) on PRIMARY create index idx01 on t1 (id) include (nome) on INDEX

scopus.com.br

S-ar putea să vă placă și