Questions tagged «filtered-index»

5
如何在MySQL中创建条件索引?
如何在MySQL中创建索引以过滤表的特定范围或子集?AFAIK无法直接创建,但我认为可以模拟此功能。 示例:我NAME只想为带有行的列创建索引STATUS = 'ACTIVE' 此功能在SQL Server中称为筛选索引,在Postgres中称为部分索引。

5
无法在计算列上创建过滤索引
在我的上一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 计算所得的列是PERSISTED,并且根据computed_column_definition(Transact-SQL): 坚持 指定数据库引擎将物理地将计算出的值存储在表中,并在更新计算出的列所依赖的任何其他列时更新这些值。将计算列标记为PERSISTED允许在确定的但不精确的计算列上创建索引。有关更多信息,请参见计算列上的索引。任何用作分区表分区列的计算列都必须显式标记为PERSISTED。当指定PERSISTED时,computed_column_expression必须是确定性的。 但是,当我尝试在列上创建索引时,出现以下错误: CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

2
为什么不使用IS NULL值的筛选索引?
假设我们有一个这样的表定义: CREATE TABLE MyTab ( ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY ,GroupByColumn NVARCHAR(10) NOT NULL ,WhereColumn DATETIME NULL ) 和一个过滤的非聚集索引,如下所示: CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab (GroupByColumn) WHERE (WhereColumn IS NULL) 为什么此索引未针对此查询“覆盖”: SELECT GroupByColumn ,COUNT(*) FROM MyTab WHERE WhereColumn IS NULL GROUP BY GroupByColumn 我正在得到这个执行计划: KeyLookup用于WhereColumn IS NULL谓词。 这是计划:https …

1
为什么在唯一索引扫描后使用聚合运算符
我有一个带有唯一索引的表,该索引针对非空值进行了过滤。在查询计划中,使用了distinct。是否有一个原因? USE tempdb CREATE TABLE T1( Id INT NOT NULL IDENTITY PRIMARY KEY ,F1 INT , F2 INT ) go CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL GO INSERT INTO T1(f1,F2) VALUES(1,1),(1,2),(2,1) SELECT DISTINCT F1,F2 FROM T1 WHERE F1 …

3
使用IN()提高查询性能
我有以下SQL查询: SELECT Event.ID, Event.IATA, Device.Name, EventType.Description, Event.Data1, Event.Data2 Event.PLCTimeStamp, Event.EventTypeID FROM Event INNER JOIN EventType ON EventType.ID = Event.EventTypeID INNER JOIN Device ON Device.ID = Event.DeviceID WHERE Event.EventTypeID IN (3, 30, 40, 41, 42, 46, 49, 50) AND Event.PLCTimeStamp BETWEEN '2011-01-28' AND '2011-01-29' AND Event.IATA LIKE '%0005836217%' ORDER BY Event.ID; …

3
在“创建唯一索引”的“ WHERE”子句中使用“ LEN”函数
我有这张桌子: CREATE TABLE Table01 (column01 nvarchar(100)); 我想在条件为LEN(column01)> = 5的情况下在column01上创建唯一索引 我试过了: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; 我有: 表'Table01'上筛选索引'UIX_01'的WHERE子句不正确。 和: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; 产生: 无法在表“ Table01”上创建过滤索引“ UIX_01”,因为过滤表达式中的“ column01_length”列是计算列。重写过滤器表达式,使其不包括此列。

3
包含列与过滤索引
我们目前正在使用名为tb_tranfers的表。该表有4000万行,大小约为26 GB(数据11 GB,索引15 GB)。 10%到15%的行是软删除的行(DeletedDate不为null)。该应用程序仅使用DeletedDate为null的行。对该表的所有查询都将包含一个用于此目的的子句。 该表上有15个索引。缺少索引DMV包含使用DeletedDate作为包含列创建索引的建议。 WHERE DeleteDdate IS NULL在所有11个非簇状索引上使用筛选索引是否有帮助?还是将DeletedDate列作为包含的列会更好?

3
仅当过滤的部分位于JOIN而不是WHERE时才使用过滤的索引
我在下面创建了过滤索引,但是当我进一步向下运行2个查询时,该索引仅在JOIN中具有END_DTTM而不是where子句的第一个示例中用于查找(这是查询中的唯一区别) 。谁能解释为什么会这样? 索引创建 CREATE NONCLUSTERED INDEX [ix_PATIENT_LIST_BESPOKE_LIST_ID_includes] ON [dbo].[PATIENT_LIST_BESPOKE] ( [LIST_ID] ASC, [END_DTTM] ASC ) WHERE ([END_DTTM] IS NULL) 查询 DECLARE @LIST_ID INT = 3655 --This one seeks on the index SELECT PATIENT_LISTS.LIST_ID FROM DBO.PATIENT_LISTS LEFT JOIN DBO.PATIENT_LIST_BESPOKE ON PATIENT_LISTS.LIST_ID = PATIENT_LIST_BESPOKE.LIST_ID AND PATIENT_LIST_BESPOKE.END_DTTM IS NULL WHERE PATIENT_LISTS.LIST_ID = @LIST_ID …

2
用过滤的(非空值)索引替换索引有什么作用?
我们的项目运行着非常大,非常复杂的数据库。因此,大约一个月前,我们注意到包含空值的索引列使用的空间变得太大。为此,我编写了一个脚本,该脚本将动态搜索包含大于1%的空值的所有单列索引,然后在值不为空的情况下删除并重新创建这些索引作为筛选索引。这将在整个数据库中删除并重新创建数百个索引,通常会释放整个数据库使用的近15%的空间。 现在我对此有两个问题: A)以这种方式使用过滤索引的不利之处是什么?我认为这只会提高性能,但是会涉及性能风险吗? B)在删除和重新创建索引时,我们收到错误消息(“无法删除索引XYZ,因为它不存在或您没有权限”),即使事后检查,一切都按预期进行。怎么会这样 谢谢你的帮助! 编辑:响应@Thomas Kejser 嗨,谢谢,但事实证明这是一场灾难。当时我们还不了解几件事,例如: 在查询期间,SQLOS在确定不能使用NULL值联接表列之前先制定索引计划。IE,您确实确实需要有WHERE子句过滤器,以适合查询中使用的每个过滤索引的索引,否则该索引将根本不使用。 删除和创建索引,然后再次冗余更新其统计信息可能仍然不足以产生更新的计划,而我们认为是可以的。在某些情况下,似乎只有足够高的工作量会迫使SQL Server重新评估计划。 执行计划程序的功能有些奇特之处,仅凭常识和逻辑很难确定。甚至在成千上万的由代码背后生成的不同查询的变体中,看似无用的索引也可以帮助进行某些统计和查询计划,最终将其用于关键查询中。 最后,这些更改被还原。因此,过滤后的索引是一个强大的工具,但是您需要真正了解从这些列中获取的数据。除了空间问题以外的常规索引都非常容易应用,而过滤后的索引则代表了非常定制的解决方案。它们当然不能代替常规索引,而是在需要它们的特殊情况下对其的扩展。

2
想要在过滤索引中放置OR时有什么解决方法?
想要在过滤索引中放置OR时有什么解决方法? create index FIDX_tblbOrders_sdtmOrdCreated_INCL on dbo.tblBOrder(sdtmOrdCreated) INCLUDE (sintMarketID, strCurrencyCode, sintOrderStatusID ) WHERE ((sintMarketId=1) AND ( (sintOrderStatusId < 9) OR (sintOrderStatusId > 14))) 我正在尝试创建上面的索引,因为我对sintOrderStatusId IN(9-14)的任何情况都不感兴趣 当然,我可以创建一个视图或索引视图,但是我试图避免这种情况。 只需添加更多信息:sintOrderStatusId是smallint NOT NULL,并且可能的值范围是1到30。应避免使用9到14,因此要过滤索引。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.