小编Lu4*_*Lu4的帖子

递归sql查询性能问题

这是我第六次问这个问题,也是最短的一次。之前的所有尝试都产生了更类似于博客文章而不是问题本身的东西,但我向您保证,我的问题是真实的,只是它涉及一个大主题,并且没有这个问题包含的所有细节,它将是不清楚我的问题是什么。所以这里...

抽象的

我有一个数据库,它允许以一种奇特的方式存储数据,并提供我的业务流程所需的几个非标准功能。特点如下:

  1. 通过仅插入方法实现的非破坏性和非阻塞更新/删除,允许数据恢复和自动记录(每个更改都与进行更改的用户相关联)
  2. 多版本数据(同一数据可以有多个版本)
  3. 数据库级权限
  4. 与 ACID 规范和事务安全的创建/更新/删除的最终一致性
  5. 能够将当前的数据视图倒回或快进到任何时间点。

可能还有其他功能我忘了提及。

数据库结构

所有用户数据都Items以 JSON 编码字符串 ( ntext) 的形式存储在表中。所有的数据库操作都通过两个存储过程进行GetLatestInsertSnashot,它们允许类似Git是如何操纵源文件中的数据进行操作。

结果数据在前端链接(JOINed)成完全链接的图,因此在大多数情况下不需要进行数据库查询。

也可以将数据存储在常规 SQL 列中,而不是以 Json 编码形式存储。然而,这增加了整体复杂性压力。

读取数据

GetLatest结果与指令形式的数据,请考虑下图进行解释:

结构图

该图显示了对单个记录所做更改的演变。图上的箭头显示了编辑所依据的版本(假设用户正在离线更新一些数据,与在线用户进行的更新并行,这种情况会引入冲突,基本上是两个版本的数据而不是一个)。

因此,GetLatest在以下输入时间跨度内调用将产生以下记录版本:

GetLatest 0, 15  => 1       <= The data is created upon it's first occurance
GetLatest 0, 25  => 2       <= Inserting another version on top of first one overwrites the existing version
GetLatest 0, 30  => 3       <= The overwrite …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 query-performance

9
推荐指数
1
解决办法
1836
查看次数