AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

为什么这个过滤后的索引不仅没有被使用,而且在我尝试强制使用它时出现错误[重复]

  • 772
这个问题在这里已经有了答案:
被 SQL Server 拒绝的过滤索引提示 1 个回答
6 年前关闭。

我正在尝试调整一个相当烦人的查询,其中许多表的内容如下所示:

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

至少有几个表在 3 亿行范围内,当我过滤它时,我最终在 2 百万行范围内。尝试过滤索引似乎是合理的。

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

但是,当我检查查询计划时,它不会使用索引。它只是进行了聚簇索引扫描和键查找。显然,在没有任何数据的情况下,这是有道理的,但即使使用我所有的数据,它也做了同样的事情。我懒得提供任何数据的原因是无论如何都会出现第二个问题。

当我试图强制索引查看查询计划时:

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

我收到此错误:

由于此查询中定义的提示,消息 8622、级别 16、状态 1、第 52 行查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

我试图弄清楚为什么我会收到查询提示错误。我的猜测是,这个问题的答案也会告诉我为什么过滤索引根本没有被使用。

sql-server-2008-r2 filtered-index
  • 1 1 个回答
  • 423 Views

1 个回答

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

    我们发现发生此错误是因为在数据库级别启用了强制参数化。对于其他想要重现它的读者,请在数据库中使用 Kenneth 的示例代码并启用此设置:

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

    对于参数化查询,SQL Server 不希望缓存具有可能不适用于其他参数值的过滤索引的执行计划。

    在更高版本的 SQL Server 中,“非提示”计划的查询计划(希望)会显示“不匹配的索引”警告,以更好地提醒您注意这一点。SQL Server 2008R2 中不存在这种情况。(注意:我刚刚在 SQL 2016 上进行了测试,但没有看到不匹配的索引警告,需要更多地研究为什么它没有出现在这个示例代码中。)

    要在不更改数据库设置的情况下使查询工作,您可以在查询中使用“选项重新编译”提示。这是可行的,因为它指示 SQL Server 不缓存计划以供重用。

    • 7

相关问题

  • SQL Server 2008 R2 中的自动收缩、加密和恢复模型属性

  • SQL Server 2008 R2 群集的无人参与安装失败并出现错误 - “路径中有非法字符”。

  • 迁移大型数据库

  • 代理执行的维护计划

  • 随机化表内容并将它们存储回表中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve