问题标签 [filtered-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3205 浏览

sql-server - 过滤索引寻找“为空”条件并扫描相反的条件

假设有一个像这样的表:

将一些数据放入其中:

还有两个索引:

查询数据如下:

或者

如果我检查查询计划,我会看到在第一种情况下执行索引查找,在第二种情况下执行索引扫描。为什么它在第一种情况下寻找并在第二种情况下扫描?

评论后补充

如果我创建普通覆盖索引而不是两个过滤覆盖:

查询计划显示索引搜索is NULLis not NULL条件,忽略列中 NULL 值的百分比(0% 的 NULL 或 10% 或 90% 或 100%,没关系)。当有两个过滤索引时,查询计划is NULL总是显示索引搜索,可以是索引扫描或表扫描(取决于 NULL 的百分比),但绝不是索引搜索。所以,看起来,本质上的区别在于条件“不是NULL”的处理方式。

这可能意味着,如果索引仅用于“不是 NULL”检查,那么普通索引或过滤索引应该表现更好并且是首选,不是吗?哪一个?

SqlServer 2008、2008r2 和 2012

0 投票
1 回答
1783 浏览

sql - Can I use a Filtered Index for querying "recently modified" rows

I am using SQL Server 2008-R2, but I'd be interested in a more general answer too ...

I have a table with hundreds of millions of rows, each with a "DateModified" field (datetime2(7))

Now I very frequently poll that table with a query like

Here the parameter is always recent (like within the last few minutes) and there are probably only a few records matching that value.

It occurs to me that I am maintaining a big index on the whole table, when I will never use the index for many of those values ... so this sounds like a perfect use of a Filtered Index where I only index the rows that I would possible be querying against...

But in this case what could the filter look like? My only idea was to Filter on

where [yesterday] is a date literal, but then I'd have to re-define the filter periodically or the advantage of the filter would diminish over time.

On a whim I tried ModifiedDate > DATEADD(d,-1,GETDATE()) but that gave a nondescript error ... wasn't sure how that would be possible.

Is there some other way to accomplish this?

Then finally, if there is a way to do this, should I expect the stats to be wildly wrong in my situation, and would that affect my query performance?

My concern about the stats comes from this article.

I'm trying to propagate changes from one system to another with some disconnected data ... if you'd like to suggest a completely alternate approach to polling "DateModified", I'd be happy to consider it.

0 投票
1 回答
552 浏览

sql - 与唯一过滤索引合并

所以我今天发现了一个奇怪的 SQL Server 行为。

假设我有一个这样的表,id 是主键

假设我有一个filtered unique index on name where active = 1. 现在,我只想为 rows 切换为活动状态,将第一行设置为非活动状态并将第二行设置为活动状态。当我尝试更新它时

工作正常。但如果我尝试合并:

如果失败并出现错误Cannot insert duplicate key row in object 'dbo.Table1' with unique index 'ix_Table1'. The duplicate key value is (a)

更奇怪的是,如果我有这样的表(第一行有活动 = 1,第二行有活动 = 0):

并像这样合并它:

它再次正常工作。所以看起来合并确实逐行更新在每行之后检查索引。我检查了唯一约束,没有过滤器的唯一索引,一切正常。只有当我结合合并和过滤索引时它才会失败。

所以问题是 - 它是一个错误吗?如果是,最好的解决方法是什么?

你可以在sql fiddle demo上试试。

0 投票
2 回答
1582 浏览

sql - 为什么在创建索引时使用 Where 子句?

当我读到这本书时,

我发现我可以创建一个具有 where 条件的索引。

我发现我们可以像这样创建索引

或者

但是不知道有什么好处?

What are the benefits of a filtered index?

哪些列最常用Where conditions

0 投票
2 回答
242 浏览

tsql - SQL Server 2012:带有“或”条件的过滤索引

我有 SQL Server 2012 Standard 和一个带有 column 的表[IS_Deleted]

如何创建带有条件的过滤索引?

0 投票
0 回答
518 浏览

knockout.js - 具有许多选择列表的剔除过滤器列表

在淘汰赛中过滤集合时,我正在尝试完成以下操作。

  1. 根据数据收集呈现下拉列表(我这样做了)
  2. 使用多个下拉列表过滤集合(目前我只能使用一个,呃)
  3. 当使用任何选择列表过滤集合时,所有其他选择列表将使用可用于新过滤集合的选项进行更新

    表格示例

索引视图模型:

看法:

0 投票
3 回答
667 浏览

sql - 使用覆盖 WHERE 子句的过滤索引上使用哪些键列?

我正在创建一个过滤索引,以便 WHERE 过滤器包含完整的查询条件。有了这样的索引,似乎不需要键列,尽管 SQL 要求我添加一个。例如,考虑下表:

表上的查询查找要处理的新发票,即:

因此,我可以使用过滤索引调整这些查询:

我的问题:关键列应该IX_Invoice_IsProcessed_IsInvalidated是什么?大概没有使用键列。我的直觉使我选择了一个较小的列,并使索引结构保持相对平坦。我应该选择表主键 ( Id) 吗?过滤器列之一,还是两者都?

0 投票
0 回答
91 浏览

sql - SQL Server 2008 R2 奇怪的索引用法

我有一个关于 SQL Server 2008 R2 索引使用的问题,特别是过滤索引的使用。这是我的场景:

@@版本输出:

  • Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
  • 2010 年 4 月 2 日 15:48:46
  • 版权所有 (c) 微软公司
  • Windows NT 6.1(内部版本 7601:Service Pack 1)上的企业版(64 位)

有问题的表有52.114.057条记录(带有主键 Id 字段)。它由一个 ID (int) 主键 IDFK (int)(唯一,外键)、TypeID (int) 字段(不是主键!)和多个自定义元数据字段(vcValue001 - vcValue020 用于 varchar 值,dcValue - dcValue020 用于数字值(十进制 sql 类型)和 dtValue001 - dtValue020 用于日期时间字段)。

简单的布局将是:

  • ID (int) (主键)
  • IDFK (int) (唯一,外键) (已编辑)
  • 类型 ID (int)
  • vcValue001 (varchar)
  • ...
  • vcValue020 (varchar)
  • dcValue001(十进制(38,8))
  • ...
  • dcValue020(十进制(38,8))
  • dtValue001(日期时间)
  • ...
  • dtValue020(日期时间)

该表中不同的 TypeID 是71,而有问题的 TypeID 是 131 (数字实际上不相关,只是碰巧这是使用的实际数字)。对于这个 TypeID=131,一个表中有27.583.573条记录。在每个单独的 TypeID +(“vc”、“dc”和“dt”字段)上创建索引(这意味着它有 60 个索引 + 其他一些)。例如“TypeID, vcValue001”上的索引(因为我在构建查询时总是使用 TypeID 作为标准)。

现在到查询部分:

我用 A、B 和 C 替换了实际值,只有 datepart 是正确的。不同范围的计数如下:

  • 对于 nFileTypeID = 131 和 vcValue001 = 'A':180
  • 对于 nFileTypeID = 131 和 dtValue002 范围:1.179.463
  • 对于 nFileTypeID = 131 和 vcValue003 = 'B':2.380.090
  • 对于 nFileTypeID = 131 和 vcValue011 = 'C':33

为了获得更快的性能,我还创建了过滤索引:

以我目前的 SQL 知识,上述查询应该受益于使用过滤索引,但不幸的是没有。最奇怪的部分是,如果我按列从“m.IDFK”中删除“desc”关键字,那么它使用过滤索引。我还尝试了两列(m.dtValue002 和 m.IDFK)的 asc 顺序,但它仍然不会使用它。如果未使用过滤索引,则查询使用 (nTypeID, dtValue002) 上的索引,结果约为。5.000.000 次读取,而使用过滤索引时,我得到 17 次读取。我也无法使用索引表提示强制过滤索引,因为 SQL Server 不允许这样做,尽管过滤索引中使用了 WHERE 条件匹配条件。

这是“排序依据”组合和过滤索引使用情况的表:

  • (m.dtValue002 asc, m.IDFK asc):过滤索引未使用(5mio 读取)
  • (m.dtValue002 asc, m.IDFK desc):过滤索引USED(17次读取)
  • (m.dtValue002 desc, m.IDFK asc):过滤索引USED(17次读取)
  • (m.dtValue002 desc, m.IDFK desc):过滤索引未使用(5mio 读取)

仅当“order by”字段的方向(asc,dec)不匹配时,才可能使用过滤索引。我已经搜索过这个问题,但没有找到任何解决方案。我还尝试按所有降序、备用顺序创建过滤索引,但没有运气。但是,我确实需要以相同的方式对这两个字段进行排序。任何方向或建议都会对我有很大帮助。

就在我认为我知道一些 SQL 知识的时候,像这样的谜题却动摇了我的知识;)

编辑:如果我不使用 IDFK 而是使用 ID 字段进行排序,它可以正常工作(例如,我得到的读取次数要少得多,并且两种排序都可以变成相同的方向)。

PS我是新手,所以如果我的问题有问题,请告诉我。

此致!

0 投票
1 回答
4188 浏览

sql - 无法添加过滤索引但不明白为什么

我正在尝试从 Visual Studio 中的数据库项目更新数据库。

更新脚本是自动生成的。在第 133 行,脚本添加了一个过滤索引。

但是这一行会产生一些错误:

(133,1): SQL72014: .Net SqlClient 数据提供者: Msg 1935, Level 16, State 1, Line 1 无法创建索引。对象“ProgramCodes”是在关闭以下 SET 选项的情况下创建的:“ANSI_NULLS”。

(133,0):SQL72045:脚本执行错误。执行的脚本: CREATE UNIQUE NONCLUSTERED INDEX [ProgramCodes_Value] ON [dbo].[ProgramCodes]([Value] ASC) WHERE ([IsDeleted] = (0));

执行批处理时发生错误。

首先,我真的不明白 ANSI_NULLS 的事情。通常,这只是一个无害的警告。

其次,我在尝试添加过滤索引时可以看到它失败了,但我真的不明白为什么。检查数据,没有会违反此唯一索引的重复项。

谁能指出我理解问题的正确方向?

0 投票
0 回答
62 浏览

sql-server - 添加大量过滤索引是一个好策略吗?

我有以下情况:

有一种服务可以在任何给定时间同时调用同一个 SP 1 最多 40 - 50 次。

当被调用时,SP 执行良好(800 毫秒到 1 秒)。随着呼叫数量的增长,时间也在增长。存储过程在 4 个具有树状结构的表上运行,第一个表有接近 100 万条记录,而第 4 层表接近 9000 万条记录。SP 的每次调用都在一个实体上运行,并且与同时调用的其他调用完全隔离,因为对同一实体的调用是连续的。性能下降的原因主要是由于 IO 和并发(锁定和东西)而不是处理器。在某个时间点,我可以拥有 1 到 2-300 个为其调用 SP 的实体。(活动实体)查询使用 3-4 个索引(在这些大表上)。实体的寿命介于 1 小时到 3-4 小时之间。

我想要做的是,当一个新实体出现时为该特定实体创建一系列过滤索引并强制 SQL 使用它们以最小化 IO。当实体被删除时,也会删除索引。

这是很多工作,我想先在这里问一下是否值得。我的问题是我不知道过滤后的索引是如何更新的。问题是我将拥有 600 个索引(200 个实体 x 3 个索引)。一个实体将在 10 秒左右更新。我不知道这个索引的更新会给系统带来什么压力。我不想用插入速度换取选择速度。我猜 sql 足够聪明,所以如果一个实体被更新,只有它的索引会被更新。索引将相当小且可快速更新,但要检查 600 个索引的过滤条件必须消耗一些资源。