Melhorar o desempenho de consultas de texto completo no SQL Server

Traduções de Artigos Traduções de Artigos
Artigo: 2549443 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve um método para melhorar o desempenho das consultas que utilizam predicados de pesquisa de texto completo (por exemplo, contém e CONTAINSTABLE) e que também filtrar dados do Microsoft SQL Server. Por exemplo, esse método melhora o desempenho de consulta a seguir:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Este método permite que o design da consulta, esquema de tabela e índice de texto completo de tal forma que o mecanismo de pesquisa de texto completo filtra os resultados antes de serem enviadas para o mecanismo relacional. Portanto, não tem o mecanismo relacional filtrar um grande conjunto de dados.

Mais Informação

Quando você cria uma consulta de pesquisa de texto completo, o fator principal que afeta o desempenho da consulta é a quantidade de dados que o mecanismo de pesquisa de texto completo deve processar antes dos demais dados são enviados para o mecanismo relacional. No SQL Server, você pode melhorar o desempenho da consulta, filtrando as linhas no início para reduzir o número de linhas que devem ser processados posteriormente.

Em versões do SQL Server que foram lançadas antes do SQL Server 2008, o mecanismo de pesquisa de texto completo retorna todas as linhas que correspondem a um termo de pesquisa e, em seguida, o mecanismo relacional se aplica a todos os filtros. Foram feitas melhorias para esse comportamento no SQL Server 2008, SQL Server 2008 R2 e SQL Server 2012. No entanto, é difícil usar essas melhorias, pois os índices de pesquisa de texto completo são organizados de maneira muito diferente de índices do banco de dados. Além disso, o mecanismo de pesquisa de texto completo e o mecanismo relacional funcionam de modo muito diferente. Portanto, o método descrito neste artigo usa a função de Table-Valued (TVF) para filtrar linhas no início e reduzir o número de linhas que devem ser processados posteriormente.

Por exemplo, o seguinte plano de consulta retorna 131051 linhas que correspondem a uma seqüência de pesquisa contém. Além disso, um operador de associação no plano executa filtragem adicional por meio de uma pesquisa de índice.
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
No entanto, se a consulta inclui a coluna de chave de índice de texto completo exclusivo como um predicado, o mecanismo de pesquisa de texto completo pode usar o predicado para filtrar os resultados no nível de texto completo. Nessa situação, o TVF retorna uma menor quantidade de dados antes de filtragem adicional deve ser aplicado. Por exemplo, a consulta a seguir especifica os cinco valores que devem corresponder à condição de c2 e o TVF retorna somente os resultados que coincidem com os cinco valores:
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
Capacidade do motor de pesquisa de texto completo para empurrar os valores que são usados pela chave de índice exclusivo é a base do método seguinte.

Se um predicado contém uma coluna de tipo de dados DateTime, você pode incluir informações de data na coluna da chave de índice exclusivo, de modo que somente as linhas que correspondem a este predicado são emitidas. Para fazer isso, logicamente você deve incorporar as informações de data na coluna da chave. No entanto, você também terá que alterar o tipo de dados de coluna de chave e os aplicativos que usam a consulta.

Para implementar o método, alterar o tipo de dados de full-text exclusivo ID para BIGINT de chave. Os primeiros 4 bytes da captura de identificação chave o ano, mês e valores de data da coluna de data e os últimos 4 bytes permanecem os mesmos. Por exemplo, o primeiro byte da chave que identificação poderia se referir ao ano, o próximo byte poderia se referir ao mês e os dois últimos bytes poderia se referir a data. O aplicativo deve acomodar essa alteração de tipo de dados.

Em seguida, converter um predicado de intervalo para um predicado na chave de identificação. Por exemplo, o "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

Propriedades

Artigo: 2549443 - Última revisão: 22 de março de 2013 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
Palavras-chave: 
kbmt KB2549443 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 2549443

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com