Na cláusula WHERE, podemos empregar vários operadores que podem afetar a performance da consulta. Sabemos que a cláusula WHERE é usada, na maioria dos casos, para limitar o número de linhas retornadas no RESULT SET. Certos operadores tendem a ser mais rápidos do que outros. Por vezes, nós temos que usar determinados operadores e não podemos mudar essa situação, noutro caso poderemos usar operadores que promoverão uma melhor performance.
A cláusula WHERE pode incluir uma variedade de condições de pesquisa que pode incluir operadores booleanos e predicados tais como LIKE, BETWEEN, EXISTS, IS NULL, IS NOT NULL e CONTAINS.
O uso de índices na cláusula WHERE pode ocorrer ou não, dependendo das condições de pesquisa. A regra é simples. Condições de pesquisa excludentes geralmente fazem com que o Query Optimizer não empregue o índice nas colunas referenciadas na cláusula WHERE. Enquanto que condições de pesquisa includentes fazem com que o Query Optimizer utilize os índices nas colunas referenciadas na cláusula WHERE.
Quando possível devemos evitar as condições de pesquisa excludentes. Aqui apresento uma lista de condições de pesquisa excludentes e includentes.
Condições de pesquisa includentes
=
>
>=
<
<=
BETWEEN
LIKE 'literal%'
Condições de pesquisa Excludentes
<>
!=
!>
!<
NOT IN
NOT LIKE IN
LIKE '%literal'
Podemos empregar também operadores booleanos, incluindo AND, OR, e NOT, quando temos múltiplos critérios na cláusula WHERE. Quando o Mecanismo de Banco de Dados valida e compila uma consulta, as condições são avaliadas na seguinte orderm: NOT, AND, OR. Podemos usar parenteses para controlar a ordem das operações. O uso do operador AND resulta tipicamente em RESULT SETS enxutos, aprimorando a performance. Já o operador NOT prejudica a performance, como vimos nas condições de pesquisa excludentes. No caso do operador OR, todas as colunas referenciadas pela condição OR devem estar incluidas no índice ou nenhum dos índices será usado.
Exemplo onde OrderDate não faz parte do índice: (AdventureWorks2008R2)
SELECT soh.[SalesOrderID]
,soh.[OrderDate]
,soh.[ShipDate]
,sod.[ProductID]
,sod.[OrderQty]
,sod.[UnitPrice]
,soh.[CustomerID]
,soh.[PurchaseOrderNumber]
FROM [Sales].[SalesOrderHeader] AS soh
JOIN [Sales].[SalesOrderDetail] AS sod
ON soh.[SalesOrderID] = sod.[SalesOrderID]
WHERE soh.OrderDate = '2008-07-31 00:00:00.000' OR
soh.OrderDate = '2008-07-05 00:00:00.000'
Nenhum comentário:
Postar um comentário