O Microsoft Sql Server permite que sejam adicionados “hints” (dicas) aos scripts que estão sendo executados. Estes “hints” permitem instruir o query processor para uma melhor execução da query, seja incluindo instruções de controle de bloqueio de registros ou especificação de um determinado índice para uma query.
Vamos analisar alguns dos hints mais utilizados, sua conceituação e prática.
Locking Hints
Conceito: A instrução NOLOCK, permite que um select seja executado em uma tabela, mostrando os dados ainda não comitados no servidor. Ou seja, caso alguma transação se encontre pendente de COMMIT no SQL SERVER em alguma tabela, a instrução NOLOCK mostrará os dados ainda não comitados da referida tabela.
Vamos exemplificar esta implementação. Vamos criar uma tabela com dados fictícios:
CREATE TABLE [dbo].[PlanoContasReferencial2](
[nuSeqPlanoContasReferencial2] [int],
[ClassificContabil] [varchar](80) COLLATE Latin1_General_CI_AS NULL,
[nmContaContabil] [varchar](200) COLLATE Latin1_General_CI_AS NULL,
[deDescricao] [varchar](500) COLLATE Latin1_General_CI_AS NULL,
[nuNivel] [int] NULL
)
go
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(1,'1','ATIVO',null,1)
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(2,'1.01','CIRCULANTE',null,2)
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(3,'1.01.01','DISPONIBILIDADES',null,3)
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(4,'1.01.01.01.00','Caixa','Contas que registram valores em
dinheiro e em cheques em caixa, recebidos e ainda não depositados,
pagáveis irrestrita e imediatamente.',5)
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(5,'1.01.01.02.00','Bancos','Contas que registram
disponibilidades, mantidas em instituições financeiras, não
classificáveis em outras contas deste plano referencial.',5)
insert
PlanoContasReferencial2([nuSeqPlanoContasReferencial2],[ClassificContabil],[nmContaContabil],[deDescricao],[nuNivel])
values(6,'1.01.01.03.00','Recursos no Exterior Decorrentes de
Exportação','Contas que registram movimentação de recursos em
instituições financeiras no exterior, nos termos do art. 1o. da Lei no
11.371/2006.',5)
Agora vamos executar o seguinte script:
BEGIN TRAN
UPDATE PlanoContasReferencial2 SET NUNIVEL=0
O script acima inicia uma transação e realiza um UPDATE na tabela PlanoContasReferencial2, porém, repare que a transação não é finalizada com as instruções ROLLBACK ou COMMIT.
Agora, em uma outra janela do Management Studio (ou query analyzer), execute o seguinte script:
SELECT * FROM PlanoContasReferencial2
Repare que o MS-SQL server não retorna os dados enquanto a transação está aberta. Pare a execução do script anterior e execute o seguinte script:
SELECT * FROM PlanoContasReferencial2 WITH (NOLOCK)
Agora sim, conseguimos obter os dados desejados. Repare que a coluna NUNIVEL é apresentada com os dados já alterados, mesmo com a transação ainda pendente. É para este detalhe que devemos atentar ao utilizar o hint NOLOCK. Estaremos informando ao usuário os dados ainda não comitados no Servidor, e o risco da apresentação dos dados ainda não atualizados deve ser considerado.
Table Hints
Um outro tipo de “Hint” que o Microsoft Sql Server disponibiliza são os Table Hints. Através dos Table Hints podemos especificar que índice queremos que o query processor do Sql Server utilize para uma determinada query, utilizando a cláusula index.
Para melhor entendermos esta implementação, vamos criar um índice para a tabela utilizada no exemplo anterior:
create index indTeste on PlanoContasReferencial2(nmcontacontabil)
Agora vamos executar uma query, especificando o índice recém criado:
select * from PlanoContasReferencial2 with (index=indTeste)
ou
select * from PlanoContasReferencial2 with (index(indTeste))
Em algumas situações, dependendo de como a query é montada, o query processor do Sql Server pode seguir um determinado execution plan, privilegiando os índices clusterizados (chaves primárias). Portanto, os hints podem ser uma boa saída para forçar a utilização dos índices não clusterizados.
Alguns DBA’s e especialistas em banco de dados consideram que a necessidade de especificar qual índice deve ser utilizado para executar uma query para o SGBD é um bug.
Outra opção de table hint, é o FASTFIRSTROW. Este hint força o query processor a utilizar o melhor execution plan para retornar a primeira linha o mais rápido possível, e depois continua a execução do resto do processo como seria executado normalmente sem o hint:
select * from PlanoContasReferencial2 with (fastfirstrow)
Query Hints
Os query hints permitem informar ao query processor, orientações para execução. Um dos query hints mais comuns é o FAST N, onde N será o número de registros que devem ser retornados com mais velocidade. O FAST não faz com que a query seja executada com mais rapidez, apenas faz com que os primeiros registros sejam retornados com mais velocidade e o restante da query é executada normalmente.
select top 10 * from planocontasreferencial2 option (fast 10)
O fastfirstrow é semelhante ao OPTION FAST, porém segundo as notícias disponibilizadas pela Microsoft, existe a grande possibilidade do fastfirstrow ser deprecated (abandonado em novas versões do produto), portanto o OPTION FAST é a opção mais recomendada.
Até a próxima!