热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

特定列的最佳索引经常被过滤为NULL?-BestindexforparticularcolumnoftenfilteredwithISNULL?

Imabitunsureoverthebestindextouseforaparticularcolumninmytable.对于我的表中特定的列使用的最佳索引,我

I'm a bit unsure over the best index to use for a particular column in my table.

对于我的表中特定的列使用的最佳索引,我有点不确定。

I have a [Deleted] column that is a DateTime, and represents the moment that the record was "deleted" from the system (it's a soft delete, so the physical record itself is not deleted).

我有一个[已删除]列,它是一个DateTime,表示记录从系统中“删除”的时刻(它是一个软删除,所以物理记录本身不会被删除)。

Almost all queries hitting the table will have a 'WHERE [Deleted] IS NULL' filter to it. I am not worried about the performance of queries that do no have this filter.

几乎所有访问该表的查询都有一个“WHERE [Deleted]为空”的过滤器。我并不担心没有这个过滤器的查询的性能。

What would be the best index to construct for this scenario? A filtered Index WHERE [Deleted] IS NULL? An index on a computed column of definition IsDeleted = Deleted IS NOT NULL ? I'm a bit unsure.

对于这个场景,最好的索引是什么?一个过滤索引,其中[已删除]为空?定义的计算列上的索引被删除=删除是否为NULL ?我有点不确定。

2 个解决方案

#1


2  

As you have said almost all the queries will have this clause in them. I would suggest to add a BIT column to your table, once a row is deleted (Soft deletion) set it to 1. Also keep this Datetime column probably as Deleted_Datetime to keep track of when records are being deleted.

正如您所说,几乎所有查询都将包含此子句。我建议将位列添加到表中,一旦删除一行(软删除),将其设置为1。还可以将这个Datetime列保留为Deleted_Datetime,以跟踪记录被删除的时间。

Then Create a Filtered Index on that BIT field something like

然后在那个位域上创建一个过滤索引

CREATE NONCLUSTERED INDEX NCIX_Deleted_Data
ON dbo.Table(Deleted)
WHERE Deleted = 0

Bit being the smallest datatype, and having a filtered index on it will give you a massive performance boost.

位是最小的数据类型,并且有一个经过过滤的索引,这将极大地提高性能。

You can create this filtered index on your Datetime column as well. But the logic is in that case sql server will have to go through 8 bytes of data on index to see if row is filtered or not.

您也可以在Datetime列上创建这个经过过滤的索引。但是逻辑是,在这种情况下,sql server必须在索引上遍历8字节的数据,以查看是否过滤了行。

Whereas if you have Bit column sql server will have to go through 1 byte of data to filter it out or to keep it.

然而,如果您有位列sql server,则必须通过一个字节的数据来过滤或保留它。

Smaller data quick processing, Bigger data more time to process it :).

更小的数据快速处理,更大的数据处理时间:)。

#2


2  

This is a lost battle. You can add a filter to all other indexes, see filtered indexes. But you won't be able to filter the clustered index.

这是一场失败的战斗。您可以向所有其他索引添加筛选器,请参阅过滤索引。但是您无法过滤聚集索引。

A filter on Deleted column will be too unselective for NULLs and all queries would hit the index tipping point. And a bit Deleted column is worse, with a 0/1 selectivity it will be always ignored.

删除列上的过滤器对于空值来说太没有选择性了,所有查询都将达到索引临界点。而一个删除的列更糟糕,因为它将总是被忽略。

I would recommend you investigate partitioned views instead. You can store current data in one table, deleted data in another one, and operate over a view that unions the two. When properly designed (this is why reading the link is critical, to understand the 'proper' part) this scheme works fine and you never scan the 'cold' data.

我建议您调查分区视图。您可以将当前数据存储在一个表中,并在另一个表中删除数据,并在一个视图中操作。如果设计得当(这就是为什么阅读链接对于理解“合适”部分非常重要),这个方案就会运行得很好,而且你永远不会扫描“冷”数据。


推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
个信2602907025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有