Pergunta

Cenário:

Estou usando um Proc (SQL Server Management Studio) para retornar correspondências de pesquisa para documentos de texto usando o Serviço de Indexação do MS e essa consulta (simplificada):

SELECT * 
FROM openquery( 
  filesystem2, 
  'SELECT 
     Path, Rank, Filename
   FROM 
     SCOPE('' "e:\test\documents" '')
   WHERE 
     CONTAINS('' FORMSOF (INFLECTIONAL, "test" ) '')
   ') b 

Esta consulta parou de funcionar corretamente alguns dias atrás. Embora não seja totalmente comprovada, parece que a interação entre o cache da propriedade e o índice mestre não está funcionando corretamente porque eu posso encontrar os documentos desejados por qualquer um, qualquer, por qualquer, qualquer

1) Removendo o parâmetro de escopo (ou seja, apenas usando "de scope ()" como a cláusula de

2) remover a cláusula onde (e manter a função do escopo como está)

Então, eu posso "encontrar" os documentos desejados apenas por conteúdo ou apenas por localidade, mas não usando os dois juntos.

Uma opção seria reiniciar o catálogo, mas a reindexação é, por enquanto, apenas uma opção de último recurso.

Dito isto, reescrevi a consulta para excluir o escopo especificado e incluir uma cláusula adicional onde:

SELECT * 
FROM openquery( 
  filesystem2, 
  'SELECT 
     Path, Rank, Filename
   FROM 
     SCOPE()
   WHERE 
     CONTAINS('' FORMSOF (INFLECTIONAL, "test" ) '') and 
     Path like ''%e:\test\documents%''
   ') b 

Esta consulta retorna os documentos adequados ao pesquisar. No entanto, eu estava/estou preocupado com um desempenho potencial de desempenho usando a palavra -chave semelhante. Então, eu investigei o plano de execução de cada consulta, mas eles eram exatamente iguais ... o que me diz 1 de duas coisas:

1) O componente de consulta do serviço de indexação otimiza as duas consultas de forma a torná -las iguais.

2) O analisador de consulta não fornece feedback preciso para consultas remotas quando nenhuma tabela de banco de dados é referenciada.

Perguntas (em nenhuma ordem particular). Alguém tem alguma visão do seguinte?:

1) O que poderia causar o comportamento do problema original entre o cache da propriedade e o índice mestre descrito no cenário acima?

2) em relação ao plano de execução,

a) Would the Querying Component process/optimize both queries the same?

b) Can Sql Server Management Studio provide execution plan feedback for openquery queries that do not reference any DB tables?

3) Finalmente, qual consulta é mais eficiente/mais rápida e por quê?

a) i.e. should I use the second one because it solves my problem?

Obrigada!

Foi útil?

Solução

nulo Os valores podem ser um problema. Não tenho certeza sobre esse caso exato, mas às vezes incluindo "where xxx is not null"Pode fazer uma diferença real.

Outra opção às vezes é colocar onde as condições em cima da mesa após a consulta abertaselect aaa, bbb from openquery(.....) where aaa = zzz. (Para melhor estilo, selecione as colunas necessárias em vez de *.

Para o qual é mais eficiente ou mais rápido, talvez você precise envolver a consulta com um processo de tempo simples e julgar por si mesmo se você não puder usar as métricas fornecidas pelas mensagens padrão do SQL Management.

No final, enquanto sua consulta funcionar e não quebrar nenhum padrão que você definiu para o seu projeto, sim - use -o.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top