AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 144853
Accepted
Kenneth Fisher
Kenneth Fisher
Asked: 2016-07-26 09:17:51 +0800 CST2016-07-26 09:17:51 +0800 CST 2016-07-26 09:17:51 +0800 CST

Por que esse índice filtrado não apenas não é usado, mas também apresenta erros quando tento forçá-lo [duplicado]

  • 772
Essa pergunta já tem resposta aqui :
Dica de índice filtrado rejeitada pelo SQL Server (1 resposta)
Fechado há 6 anos .

Estou tentando ajustar uma consulta bastante irritante em que várias tabelas têm algo parecido com:

date = '9999-12-31 23:59:59.9999999'

Pelo menos algumas das tabelas estão na faixa de 300 mil linhas e, quando filtro isso, acabo na faixa de 2 mil. Parecia razoável tentar um índice filtrado.

CREATE TABLE test (col1 int PRIMARY KEY, col2 int, col3 varchar(50), col4 datetime2(7), col5 int);
CREATE INDEX ix_filtered ON test(col2,col3) INCLUDE (col4) 
       WHERE col4 = '9999-12-31 23:59:59.9999999' ;
GO

SELECT col2,col3 FROM test 
WHERE col4 = '9999-12-31 23:59:59.9999999';
GO

No entanto, quando verifiquei o plano de consulta, ele não usaria o índice. Ele apenas fez uma varredura de índice clusterizado e uma pesquisa de chave. Obviamente, sem nenhum dado, isso faz sentido, mas mesmo com todos os meus dados, aconteceu a mesma coisa. A razão pela qual não me preocupei em fornecer nenhum dado é esse segundo problema que ocorre de qualquer maneira.

Quando tentei forçar o índice para ver como ficaria o plano de consulta:

SELECT col2,col3 FROM test 
WITH (index (ix_filtered))
WHERE col4 = '9999-12-31 23:59:59.9999999'

Eu recebo este erro:

Msg 8622, Nível 16, Estado 1, Linha 52 O processador de consulta não pôde produzir um plano de consulta devido às dicas definidas nesta consulta. Reenvie a consulta sem especificar nenhuma dica e sem usar SET FORCEPLAN.

Estou tentando descobrir por que estou recebendo o erro com a dica de consulta. Meu palpite é que a resposta para isso também me dirá por que o índice filtrado não está sendo usado.

sql-server-2008-r2 filtered-index
  • 1 1 respostas
  • 423 Views

1 respostas

  • Voted
  1. Best Answer
    Kendra Little
    2016-07-26T09:44:19+08:002016-07-26T09:44:19+08:00

    Descobrimos que esse erro ocorreu porque a parametrização forçada estava ativada no nível do banco de dados. Para outros leitores que desejam reproduzi-lo, use o código de exemplo de Kenneth em um banco de dados com esta configuração:

    create database filterme;
    GO
    
    alter database filterme set parameterization forced;
    GO
    

    Para consultas parametrizadas, o SQL Server não deseja armazenar em cache um plano de execução com um índice filtrado que pode não funcionar para outros valores de parâmetro.

    Em versões posteriores do SQL Server, o plano de consulta para o plano "não sugerido" mostraria (espero) um aviso de "índices não correspondentes" para alertá-lo melhor sobre isso. Isso simplesmente não existia no SQL Server 2008R2. (Observação: acabei de testar no SQL 2016 e não estou vendo o aviso de índices incompatíveis, preciso investigar mais por que ele não está aparecendo com este código de exemplo.)

    Para que a consulta funcione sem alterar a configuração do banco de dados, você pode usar uma dica "Option recompile" nas consultas. Isso funciona porque instrui o SQL Server a não armazenar em cache o plano para reutilização.

    • 7

relate perguntas

  • Propriedades de redução automática, criptografia e modelo de recuperação no SQL Server 2008 R2

  • A instalação autônoma do cluster do SQL Server 2008 R2 falha com o erro - "Caracteres ilegais no caminho".

  • Migração de banco de dados grande

  • plano de manutenção executado pelo agente

  • Randomizando o conteúdo da tabela e armazenando-o de volta na tabela

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve