KB2491510 - FIX:Uma consulta que tenha um predicado CONTÉM numa cláusula WHERE leva muito tempo a compilar no SQL Server 2008 ou SQL Server 2008 R2

A Microsoft distribui o Microsoft SQL Server 2008 Service Pack 1 (SP1) ou SQL 2008 R2 como um ficheiro transferível. Como as correções são cumulativas, cada nova versão contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção SQL Server 2008 SP1 ou SQL 2008 R2.

Sintomas

Considere o seguinte cenário:

  • No Microsoft SQL Server 2008 ou NO SQL Server 2008 R2, você executou uma consulta contra uma coluna específica numa tabela que tem muitas linhas. A consulta tem um predicado CONTÉM numa cláusula WHERE.

  • O termo que usa para o predicado CONTÉM contém uma palavra. A palavra aparece em algumas colunas que estão incluídas num índice de texto completo da tabela.

Neste cenário, a consulta demora muito tempo a compilar. Por exemplo, esta questão pode ocorrer quando executar a seguinte consulta:

SELECT count(*)FROM dbo.MyLargeTable whereCONTAINS (email_address, '"name@contoso.com"')

Notas

  • Assuma que ".com" aparece em algumas colunas que estão incluídas num índice de texto completo da tabela.

  • Pode rastrear o tempo de compilação da sua consulta para determinar se está a encontrar este problema. Para obter instruções detalhadas sobre como rastrear o tempo de compilação, consulte a secção "Mais Informações".

Causa

Esta questão ocorre devido a um erro na lógica de Estimativa cardinalício para índices de texto completo. Neste caso, uma varredura de várias colunas que contêm uma palavra frequentemente ocorrente é realizada antes que o âmbito de pesquisa para as colunas esperadas seja reduzido.

Resolução

Informação de atualização cumulativa

Pacote de serviço SQL Server 2008 2

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 4 para o SQL Server 2008 Service Pack 2. Para obter mais informações sobre este pacote de atualização cumulativa, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:

2527180 Pacote de atualização cumulativo 4 para SQL Server 2008 Service Pack 2Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção SQL Server 2008. A Microsoft recomenda que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

2402659 O SQL Server 2008 constrói que foram lançados após o lançamento do SQL Server 2008 Service Pack 2 Os hotfixes do Microsoft SQL Server 2008 são criados para pacotes específicos de serviços sql Server. Tem de aplicar um hotfix SQL Server 2008 Service Pack 2 a uma instalação do SQL Server 2008 Service Pack 2. Por predefinição, qualquer hotfix que seja fornecido num pacote de serviços SQL Server está incluído no próximo pacote de serviços sql Server.A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 13. Para obter mais informações sobre como obter este pacote de atualização cumulativa para SQL Server 2008 SP1, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:

2497673 Pacote de atualização cumulativo 13 para SQL Server 2008 Service Pack 1 Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção SP1 DO SQL Server 2008. Recomendamos que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

970365 O SQL Server 2008 constrói que foram lançados após o lançamento do SQL Server 2008 Service Pack 1

Sql Server 2008 R2 Service Pack 1

A correção para este problema foi lançada pela primeira vez na Cumulativa Update 1 para SQL Server 2008 R2 Service Pack 1. Para obter mais informações sobre como obter este pacote de atualização cumulativa, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:

2544793 Pacote de atualização cumulativo 1 para SQL Server 2008 R2 Service Pack 1Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção R2008 do SQL Server 2008. Recomendamos que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

2567616 O SQL Server 2008 R2 constrói que foram lançados após o lançamento do SQL Server 2008 R2 Service Pack 1

SQL Server 2008 R2

A correção para este problema foi lançada pela primeira vez na Atualização Cumulativa 7. Para obter mais informações sobre como obter este pacote de atualização cumulativa para SQL Server 2008 R2, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:

2507770 Pacote de atualização cumulativa 7 para SQL Server 2008 R2 Nota Como as construções são cumulativas, cada nova versão de correção contém todos os hotfixes e todas as correções de segurança que foram incluídas com o anterior lançamento de correção R2008 do SQL Server 2008. Recomendamos que considere aplicar o mais recente lançamento de correção que contém este hotfix. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:

981356 O SQL Server 2008 R2 constrói que foram lançados após o lançamento do SQL Server 2008 R2

Estado

A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".

Solução

Para contornar este problema, utilize um dos métodos seguintes:

  • Use * para incluir todas as colunas na procura em vez de uma coluna. Isto altera quantas linhas são efetivamente avaliadas antes de o Texto Integral Integrado compilar a sua estimativa de cardinaldade. Por exemplo, executar a seguinte consulta:

    SELECT count(*) FROM dbo.MyLargeTabel where CONTAINS (*, '"test@contoso.com"')
  • Faça da palavra frequente uma palavra de stop utilizando uma declaração STOPLIST ALTER FULLTEXT. Para obter mais informações sobre a declaração STOPLIST ALTER FULLTEXT para Transact-SQL, visite o seguinte website da Microsoft Developer Network (MSDN): Informações gerais sobre a declaração DE STOPLIST ALTER FULLTEXT para Transact-SQL

Mais Informações

Para acompanhar o tempo de compilação da consulta, siga estes passos:

  1. Capture um traço de perfil SQL quando executar a consulta. Para tal, monitorize os eventos TSQL:BatchCompleted e TSQL:StmtCompleted, ou os eventos RPC:Complete e SP:StmtCompleted.

  2. Note o tempo de CPU do lote e o tempo de CPU de declaração.

  3. Subtrair o tempo de CPU de declaração do tempo do Grupo CPU. O resultado indica o tempo de CPU que é tomado para analisar e compilar o lote.

Para obter mais informações sobre como usar um predicado CONTÉM para Transact-SQL, visite o seguinte website da Microsoft Development Network (MSDN):

Como usar um predicado CONTÉM para Transact-SQL

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Obrigado pelos seus comentários!

Obrigado pelo seu feedback! Parece que poderá ser benéfico reencaminhá-lo para um dos nossos agentes de suporte do Office.

×