软删除 - 使用 IsDeleted 标志还是单独的连接表?

2023-12-22

我们应该使用软删除标志还是单独的连接表?哪个更有效率?数据库是SQL Server。

背景资料

不久前,我们有一位数据库顾问进来查看我们的数据库架构。当我们软删除一条记录时,我们将更新相应表上的 IsDeleted 标志。有人建议不要使用标志,而是将已删除的记录存储在单独的表中并使用联接,因为这样会更好。我已经对该建议进行了测试,但至少从表面上看,额外的表和连接看起来比使用标志更昂贵。

初步测试

我已经设置了这个测试。

两个表,Example 和DeletedExample。我在 IsDeleted 列上添加了一个非聚集索引。

我做了三个测试,加载一百万条记录,删除/未删除比率如下:

  • 已删除/未删除
  • 50/50
  • 10/90
  • 1/99

Results - 50/50 50 50

Results - 10/90 10 90

Results - 1/99 enter image description here

数据库脚本,供参考、Example、DeletedExample 和 Example.IsDeleted 的索引

CREATE TABLE [dbo].[Example](
    [ID] [int] NOT NULL,
    [Column1] [nvarchar](50) NULL,
    [IsDeleted] [bit] NOT NULL,
 CONSTRAINT [PK_Example] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Example] ADD  CONSTRAINT [DF_Example_IsDeleted]  DEFAULT ((0)) FOR [IsDeleted]
GO

CREATE TABLE [dbo].[DeletedExample](
    [ID] [int] NOT NULL,
 CONSTRAINT [PK_DeletedExample] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[DeletedExample]  WITH CHECK ADD  CONSTRAINT [FK_DeletedExample_Example] FOREIGN KEY([ID])
REFERENCES [dbo].[Example] ([ID])
GO

ALTER TABLE [dbo].[DeletedExample] CHECK CONSTRAINT [FK_DeletedExample_Example]
GO

CREATE NONCLUSTERED INDEX [IX_IsDeleted] ON [dbo].[Example] 
(
    [IsDeleted] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

你所掌握的数字似乎表明我的初步印象 https://stackoverflow.com/q/8841229/120955是正确的:如果您对此数据库最常见的查询是过滤IsDeleted = 0,那么使用简单的位标志性能会更好,特别是如果您明智地使用索引的话。

如果您经常分别查询已删除和未删除的数据,那么通过使用具有相同字段的已删除项目表和未删除项目表,您可以看到性能提升。但是像这样对数据进行非规范化很少是一个好主意,因为它通常会花费您更多的代码维护成本,而不是您获得的性能提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软删除 - 使用 IsDeleted 标志还是单独的连接表? 的相关文章

  • java中的高亮文本

    我们正在开发抄袭检测框架 在那里我必须强调文档中可能抄袭的短语 首先对文档进行预处理 包括停用词删除 词干提取和数字删除 因此 预处理标记的突出显示变得困难 作为和示例 原文 极限编程是敏捷软件开发的一种方法 它强调在短开发周期 称为时间盒
  • Spring Data - MongoDB 索引 DBRef

    我正在使用 spring data mongodb 1 2 0 RELEASE 我有两个类 A 和 B 其中 B 引用了 A 并且用 DBRef 进行了注释 Class A Document collection a public clas
  • SQL Server 2008 R2 DMV - sys.dm_sql_referencing_entities - 查询用法

    我正在尝试使用以下命令获取表列表的所有依赖项sys dm sql referencing entities DMV 这个查询给了我所有表的列表 SELECT TableName from FinalTableList 此查询给出 Table
  • PostgreSQL 如何对字段上的 b 树索引执行 ORDER BY?

    我有一张桌子bsort CREATE TABLE bsort a int data text Here data可能不完整 换句话说 某些元组可能没有data value 然后我在表上建立一个 B 树索引 CREATE INDEX ON b
  • 根据 MySQL 列内容的长度创建索引?

    如何根据值的长度在 MySQL v 5 0 myisam 数据库引擎 中的列上创建索引 它是文本数据类型 最多 7000 个字符 我是否必须添加具有第一列长度的另一列 是的 因为 MySQL 不支持基于函数的索引 例如ADD INDEX m
  • 如何在 MariaDB 10 中启用大索引?

    在 Debian Jessie 中 我安装了 MariaDB 服务器 10 0 30 并尝试增加最大密钥长度 AFAIU 这取决于配置参数innodb large prefix正在启用 根据docs https mariadb com kb
  • 获取 pandas 数据框中每列的前 k 个元素的索引的快速方法

    我有一个非常大的 pandas 数据框 大约有 500 000 列 每列大约有 500 个元素长 对于每一列 我需要检索该列中前 k 个元素的 索引 列 位置 所以 如果 k 等于 2 这是我的数据框 A B C D w 4 8 10 2
  • 即使将“enable_seqscan”设置为关闭后,也未使用数组列上的 GIN 索引?

    根据推荐this https stackoverflow com questions 4058731 can postgresql index array columns comment10357041 4059785评论 我建立了一个 i
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 仅使用行中包含的值获取 JTable 中的行索引?

    在Java中 JTable中是否可以通过查找该行中包含的指定值来获取该行的索引 我正在使用自定义表格模型 例如 考虑一个包含三列和三行的表 Row 1 A B C Row 2 D E F Row 3 G H I 如果我只知道表中某处有一个值
  • CUDA 的嵌套循环

    我想将我的 C 代码移植到 CUDA 主要计算部分包含3个for嵌套循环 for int i 0 i lt Nx i for int j 0 j
  • 为什么MongoDB不使用复合索引进行查询?

    以下是我对此集合的复合索引和单一索引 db Collection getIndexes 1 v 2 key id 1 name id ns service Collection 2 v 2 key FirstId 1 SecondId 1
  • Google App Engine Java:如何删除未使用的索引?

    如果我发现有关删除未使用的索引的信息 例如上传和管理Python应用程序 删除未使用的索引 http code google com appengine docs python tools uploadinganapp html Delet
  • 子查询总性能与案例总性能

    我必须根据 where 子句对一些列进行求和 以便更好地理解我在这里实现一个临时表 declare tbl table a int b int c int insert into tbl values 1 2 3 insert into t
  • SQL删除具有重复值的行同时保留一个

    假设我有这张桌子 id data value 1 a A 2 a A 3 a A 4 a B 5 b C 6 c A 7 c C 8 c C 我想删除每个数据具有重复值的行 同时保留具有最小 id 的行 例如结果将是 id data val
  • 如何使用 C# 在 Amazon Dynamo DB 中为 Json 属性(列值)创建全局二级索引?

    我有一个包含 Id 列和 JSON 列的表 Id JSON 101 person id 456 f name t l name Jack 102 person id 123 f name M l name Ron 103 person id
  • 用数组“插入”

    我想知道是否有一种方法可以在值列表上使用 插入 我正在尝试这样做 insert into tblMyTable Col1 Col2 Col3 values value1 value2 value3 所以 我想说的是 value2 将是一个字
  • 在创建 IDENTITY 的同一个 T-SQL 语句中获取 IDENTITY 值?

    有人问我是否可以有一个插入语句 其中有一个作为 身份 列的 ID 字段 以及分配的值是否也可以插入到同一插入语句中同一记录中的另一个字段中 这可能吗 SQL Server 2008r2 Thanks 你不能真正做到这一点 因为将用于的实际值
  • SQL Server 2008R2 和创建 XML 文档

    论坛上的第一篇文章 因为我真的被这个问题困住了 以下查询正确地将有效的 XML 文档分配给 xTempXML 变量 类型为 xml 注 文档的长度 转换为varchar max 711 select xTempXML select Pres
  • Elasticsearch 无法更新非动态设置

    我正在尝试创建一个测试分析器来试验弹性搜索的分析 我创建了一个名为 mytest 的索引 该索引可用且可搜索 但是当我尝试创建自定义分析器时 出现以下错误 error ElasticsearchIllegalArgumentExceptio

随机推荐

  • 将文本识别为简体中文与繁体中文

    给定一段已知为中文且以 UTF 8 编码的文本块 有没有办法确定它是简体还是繁体 我不知道这是否有效 但我会尝试使用 iconv 来查看它是否能在字符集之间正确转换 并将相同转换的结果与 TRANSLIT 和 IGNORE 进行比较 如果两
  • Opera Unite 和 Node.js 有什么区别?

    两者似乎都允许完全使用 JavaScript 编写应用程序 两者都允许服务器端 JS 和客户端 JS 那么 从技术和编程的角度来看 两者有什么区别呢 Opera Unite 是一种协作技术 它使用 Opera 桌面浏览器内的紧凑型服务器来共
  • 查询矩形集合以查找输入矩形的重叠

    在多维空间中 我有一组矩形 所有矩形都与网格对齐 我宽松地使用 矩形 这个词 在三维空间中 它们将是矩形棱柱 我想查询此集合中与输入矩形重叠的所有矩形 保存矩形集合的最佳数据结构是什么 我会不时地向集合中添加矩形和从集合中删除矩形 但这些操
  • 监听键盘事件而不捕获它们?

    我正在编写一个命令行应用程序 它侦听 X Windows 中的 Control 键释放事件 并在检测到这些事件时向另一个进程发出警报 作为 GNU Linux 的新手 我宁愿避免摸索 GCC 因此我正在寻找基于脚本的解决方案 由于我对 Py
  • 是否可以在运行时更改 AWS Lambda 的日志级别?

    我在 AWS 上运行 lambda 并使用 slf4j 进行日志记录 项目要求的一部分是可以使用环境变量在运行时设置日志级别 但我不确定这是否可能 我使用以下代码 但将 UI 中的环境变量 LOG LEVEL 更改为 DEBUG 对添加到
  • DBMS_XPLAN.DISPLAY_CURSOR 与解释计划(如果不使用 Gather_plan_statistics 提示)

    只是要求澄清两者之间的区别 据我所知 解释计划为您提供了理论的执行计划 而 DBMS XPLAN DISPLAY CURSOR 为您提供actual带有语句执行统计信息的执行计划 EXPLAIN PLAN 将此数据存储在 PLAN TABL
  • Blazor onclick 事件从循环传入计数器

    我目前正在通过 Blazor 中的本地解决方案实现表分页 但遇到了一些困难 麻烦的代码如下 用于渲染网格下方的分页按钮 for int i 0 i lt vm TotalPages i
  • easy_install 安装了各种版本的 python、mac osx

    我在 mac OSX 10 6 机器上有各种版本的 python 其中一些安装了 macports gt python select l Available versions current none python24 python26 p
  • 如何防止命令行参数由 R 解释而不是仅由我的脚本解释?

    我正在使用docopt https github com docopt docopt RR 的实现 我的脚本有一个命令行选项 其缩写形式为 g 当我运行我的脚本时 似乎这个参数首先由 R 解释 然后由我的脚本解释 因此 我因为没有为 GUI
  • SoapClient 尝试获取架构文件时出现 401 身份验证错误

    我的应用程序通常连接到第三方服务器以通过 SOAP WSDL 获取数据 this gt soap client new SoapClient https the domain 443 path wsdl array trace gt 1 l
  • 如何优化 EF Code First 查询?

    已更新 请参阅底部的更新 我使用 EF 代码优先 并且总体上对此感到满意 然而 一个简单 且常见 的操作导致 EF 生成极其复杂的 SQL 这降低了我的应用程序的速度 我只是使用 整数 ID 列表来获取一组实体 但因为我需要大量子实体的详细
  • 在 C++ 中前向声明静态 C 结构实例

    我正在编写一个代码生成器 实际上是一个数据生成器 它将生成这种形式的数据结构 显然实际的数据结构要复杂得多 typedef struct Foo int a struct Foo foo Foo extern Foo f1 extern F
  • 使用 Pandas Excelwriter 写入 StringIO 对象?

    我可以将 StringIO 对象传递给 pd to csv 就好 io StringIO StringIO pd DataFrame to csv io 但是当我使用excel writer时 我遇到了很多麻烦 io StringIO St
  • jQuery serializeArray() 键值对

    我在序列化表单时遇到了一些麻烦
  • Bootstrap 一次轮播多个框架

    这是我试图用 Bootstrap 3 轮播实现的效果 它不是一次只显示一帧 而是并排显示 N 帧 然后 当您滑动 或自动滑动时 时 它会像以前一样移动幻灯片组 这可以吗与 bootstrap 3 的轮播 我希望我不必去寻找另一个 jQuer
  • 检查 MongoDB 文档中是否存在多个字段

    我正在尝试查询一个数据库集合 该集合保存具有特定字段的文档的流程文档 为简单起见 想象以下通用文档模式 timestamp ISODate result1 pass result2 fail 现在 当一个进程启动时 会插入一个仅包含时间戳的
  • 在继续当前脚本的同时异步运行单独的 PowerShell 脚本

    PowerShell 脚本 1 执行以下操作 Performs FTP ops ending with saving updated remote directory data in a local file 该脚本快速运行 直到必须使用
  • WPF 全局字体大小

    我正在创建一个 WPF 应用程序 我想知道能够更改 ui 中每个元素的字体大小的最佳方法 我是否创建资源字典并设置样式来设置我使用的所有控件的字体大小 最佳实践是什么 我会这样做
  • CSS3 月亮形状

    我正在尝试创建一个像这样的按钮 我不知道如何在按钮顶部创建一个浅月形状 这还很遥远 小提琴演示 https jsfiddle net wgnp9ygh 2 moon width 50px height 50px border radius
  • 软删除 - 使用 IsDeleted 标志还是单独的连接表?

    我们应该使用软删除标志还是单独的连接表 哪个更有效率 数据库是SQL Server 背景资料 不久前 我们有一位数据库顾问进来查看我们的数据库架构 当我们软删除一条记录时 我们将更新相应表上的 IsDeleted 标志 有人建议不要使用标志