AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[change-tracking](dba)

Martin Hope
Lance
Asked: 2022-07-01 21:49:02 +0800 CST

维基百科如何存储文章差异(或任何每条记录包含大量文本差异的网站)?

  • 0

查看维基百科文章历史上的奥巴马差异,可能有数千个差异。单击特定的较旧差异大约需要 3-5 秒才能加载,而不是更活泼的 Wikipedia 页面。然后你可以看到两个版本之间的具体差异,旧的旧版本和当前版本。

在此处输入图像描述


问题是,如果他们不使用 git(我会假设),他们如何有效地存储这些差异?

我正在寻找如何在我正在使用的小型玩具应用程序中实现文本差异跟踪。可能会有一百万页,每页的记录可能有 0 到 1000 次编辑。编辑将比维基百科的文章小得多,有时是一个单词的字符差异,有时是几个句子。

到目前为止我看到的推荐方法是存储记录文本的当前全文形式,然后存储“反向差异”以获取前一个,以及从那个等前一个。然后水合旧的文章,您将获取所有旧的差异(可能像维基百科差异中的 3000 个差异),然后从当前文本倒退以获取旧版本。不过,这似乎效率极低(而且我不确定如何计算“反向”差异,例如使用jsdiff)。这是最好的方法吗?我想您不想在每次更改时都存储全文的副本,或者维基百科会这样做吗?我想象的内容规模会爆炸式增长,尤其是在维基百科上。

基本上想知道如何通过以某种方式将内容存储在 SQL 数据库中来实现类似于维基百科的差异。我的案例没有维基百科那么大的内容,但如果知道如何针对这种“更糟糕的情况”正确解决它会很好。

postgresql change-tracking
  • 1 个回答
  • 41 Views
Martin Hope
grochu
Asked: 2021-11-05 03:22:10 +0800 CST

更改跟踪中是否有任何选项可以跟踪表特定列的更改?

  • 0

您是否知道是否可以使用“跟踪更新的列”来跟踪更改(更改跟踪或 CDC),但只能跟踪我们想要跟踪的特定列。原因是我们有一个包含 300 列的表,我们只想跟踪其中的 5 个。

sql-server-2016 change-tracking
  • 1 个回答
  • 206 Views
Martin Hope
Danielle Paquette-Harvey
Asked: 2020-01-23 07:50:58 +0800 CST

更改跟踪导致闩锁争用

  • 7

我正在使用 Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64) Jun 15 2019 23:15:58 版权所有 (c) Microsoft Corporation Standard Edition (64-bit) o​​n Windows Server 2012 R2 Standard 6.3 (构建 9600:)

该数据库的大小约为 870 GB。它是 SQL 标准,我在服务器上有 128 GB 的 RAM。该数据库位于 SSD 驱动器上。数据文件与日志文件位于不同的驱动器上,并且 Tempdb 也有自己的 SSD 驱动器。服务器平均每秒大约 1200 个查询,它可以高达 2000 个查询/秒。重新编译保持在较低水平,每秒只有 1 到 8 次。页面预期寿命不错,平均为 61 分钟。

服务器有 6 个物理核心 + 超线程。

我们在一个有数千台设备连接并尝试使用跟踪键同步更改的系统上大量使用 SQL Server 的更改跟踪。

它通常运行良好,但随后,服务器的锁存器会不时地飙升,从 0 毫秒到平均 60677 毫秒。

SQL 锁存器

当我检查正在运行的查询时,我只能看到同步查询,全部被阻止,带有“PAGELATCH_UP”,所有尝试访问更改跟踪表,超过 300 个查询被阻止。

我有几个问题:

  • SQL Server 在查找更改跟踪更改时是否会锁定整个表?
  • 使用 SQL Entreprise 会有更好的结果还是不会改变任何东西?
  • 知道为什么更改跟踪在大多数情况下都能正常工作,但每周都会在没有明显原因的情况下崩溃吗?

这些是我的更改跟踪表大小。我的查询阻塞的表是前三个表,只有几 mb 的数据。

在此处输入图像描述

他们都在等待同一个waitresource。

等待资源

Waitresource 2:4:88968 在 tempdb 中。但是 tempdb 只负责大约 9% 的服务器写入和 6% 的读取。

io报告

但是我的查询不使用 tempdb,所以我猜是因为内部更改跟踪的工作方式?这是我的查询

DECLARE @Id INT; SET @Id = (SELECT Id FROM Users WHERE No=@No); 

SELECT DISTINCT lh.Key1 
FROM ( 
    SELECT Key1 FROM CHANGETABLE(CHANGES dbo.Table1, @TrackingKey) AS CT 
    UNION ALL 
    SELECT Key1 
    FROM dbo.Table2 lhd 
    INNER JOIN (SELECT Key2 FROM CHANGETABLE(CHANGES dbo.Table2, @TrackingKey) AS CT) AS CTLHD ON(CTLHD.Key2=lhd.Key2) 
    UNION ALL 
    SELECT Key1 
    FROM CHANGETABLE(CHANGES dbo.Table3, @TrackingKey) AS CT 
) AS L 
JOIN dbo.Table1 lh ON lh.Key1 = L.Key1 
WHERE lh.Id = @Id AND lh.Date BETWEEN @StartUtc AND @EndUtc 

我的 tempdb 有 10 个文件,它们的大小相同。

临时数据库

我通常最终使客户端恢复正常的做法是将其置于停机时间,然后逐渐将其恢复,以便所有移动设备逐渐同步。但是我们的系统是关键任务,这不是一个长期的解决方案。

我一直在考虑的另一个解决方案是改变系统处理更改跟踪查询的方式。让移动设备与“自制”表同步,并用来自更改跟踪的单个服务读取更改填充此表。这样,我会将并发查询限制在更改跟踪表中,但恐怕我只会将问题转移到自制表中。

对此有什么想法吗?任何帮助将不胜感激。


编辑:头部阻滞剂

我试图确定谁是拦路者以及它在等待什么,但这是一项艰巨的任务。看来我有很多“头脑障碍者”。

所有查询都运行相同的 SELECT,几乎都分成 4 个线程,对于某些查询,它们根本没有被阻塞,而是在等待“MISCELLANEOUS”,但对于某些查询,至少部分线程被其他查询阻塞。

例如,现在有 294 个线程正在显示。

查询 202 被分成 4 个线程,其中一个线程被 123 阻塞,但其他线程没有被阻塞。三个线程正在等待“MISCELLANEOUS”,阻塞线程正在等待“PAGELATCH_UP”

至于查询 123,它没有被阻塞,它有 4 个线程正在等待“MISCELLANEOUS”

或者例如,查询 219 在一个线程上被查询 140 阻塞,在其他三个线程上被 69 阻塞。

69 被 193 阻​​止,193 正在运行,再次等待“杂项”。140 不再在列表中,因此它要么超时要么已完成。

我的并行成本阈值为 70。
锁定 0
最大并行度 3
查询等待 -1

未在数据库上启用快照隔离级别。查询未使用快照隔离级别。

数据库选项

我还检查了表的统计信息,甚至 sys.change_tracking 表。对于查询的表,表上的索引没有碎片化(小于 10%)。

我运行了一个或两个查询,一般查询的结果是 4 行,由于 DISTINCT 子句而变成只有一行。所以它不像返回数千行。

当我在 SSMS 中运行查询时,它速度很快并且不会阻塞,即使我目前在同一查询的服务器上看到数百个被阻塞的查询。所以我想这可能与参数嗅探有关?

这是我在 SSMS 中执行时的 I/O 统计信息。

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server parse and compile time: 
   CPU time = 92 ms, elapsed time = 92 ms.
Table 'Users'. Scan count 0, logical reads 2, physical reads 0, read-ahead  reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syscommittab'. Scan count 3, logical reads 555, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'change_tracking_62623266'. Scan count 1, logical reads 3364, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 3, logical reads 9, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table2'. Scan count 0, logical reads 34281, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'change_tracking_46623209'. Scan count 1, logical reads 1152, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'change_tracking_78623323'. Scan count 1, logical reads 1077, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 296 ms,  elapsed time = 435 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

Completion time: 2020-01-22T14:18:25.9480651-05:00

这是我的查询计划 https://www.brentozar.com/pastetheplan/?id=By7k-7UWI

但同样,这是不阻止的版本。我启用了查询存储,所以我可以尝试获取阻止的版本,我只是不是 100% 如何做到这一点。


已编辑:查询商店信息

我的查询是查询存储的“回归查询”中的第一个。

查询店铺信息

计划

根据查询商店,这里是“坏计划” https://www.brentozar.com/pastetheplan/?id=ryqKGQUbL

这是“好计划” https://www.brentozar.com/pastetheplan/?id=rknnGQ8WL

我应该“强迫”这个好计划吗?


编辑我的解决方案

好的,所以我使用了 Brent Ozar 的 sp_blitzcache ( https://www.brentozar.com/blitz/ ),“expert_mode”为 1,以便能够检索“坏计划”的句柄并能够从缓存(不清除任何其他内容)。

DBCC FREEPROCCACHE (0x06000800155A5106F08F632F1C00000001000000000000000000000000000000000000000000000000000000);

我的服务器再次恢复正常状态,所有数百个被阻止的查询都消失了。我猜那是参数嗅探?希望不要再发生了。想找个办法让它不再发生。

sql-server-2016 change-tracking
  • 1 个回答
  • 487 Views
Martin Hope
SeanOB
Asked: 2016-07-07 21:18:56 +0800 CST

使用来自另一个数据库的更改跟踪功能

  • 5

如果我在名为 Production 的数据库上打开更改跟踪,我可以使用这些函数从另一个数据库获取更改数据吗?

例如:CHANGE_TRACKING_CURRENT_VERSION();

我尝试了以下方法,还尝试使用替换架构,sys但我认为这种方法不起作用:

Use [Analysis]
GO
SELECT Production.dbo.CHANGE_TRACKING_CURRENT_VERSION() 

我通过在 Production 上创建一个调用此函数的存储过程来解决它。然后我可以从该 SQL Server 上的其他数据库调用该存储过程。但是想知道有没有更直接的方法。

我正在尝试将数据从一个系统迁移到另一个系统(在一两周内,然后关闭旧系统)。在另一个数据库上启用了更改跟踪。我受 SQL Server 版本的限制,CDC 需要 Enterprise、Developer 或 Evaluation。

sql-server change-tracking
  • 1 个回答
  • 1777 Views
Martin Hope
popq
Asked: 2015-10-13 04:56:55 +0800 CST

在函数中无效使用副作用运算符“change_tracking_min_valid_version”

  • 2

我正在尝试创建一个包装 change_tracking_min_valid_version(object_id) 的函数,以在使用同义词而不是表名时简化查询。像这样的东西:

CREATE FUNCTION MY_CHANGE_TRACKING_MIN_VALID_VERSION(@synonym VARCHAR(100))
RETURNS BIGINT
BEGIN
    RETURN (SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(base_object_name))
    FROM sys.synonyms WHERE name = @synonym);
END

我已经尝试单独获取基础对象名称,以便能够删除返回语句的选择部分,即

set @retval = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(@table_name))

MS SQL Server Management Studio 产生此错误:

Msg 443, Level 16, State 1, Procedure MY_CHANGE_TRACKING_MIN_VALID_VERSION, Line 5
Invalid use of a side-effecting operator 'change_tracking_min_valid_version' within a function.

我确实知道我不能在函数中使用带有副作用的操作,但是由于我似乎无法找到有关(或理解为什么会有任何)此特定函数的副作用的任何信息,所以我的问题是:

CHANGE_TRACKING_MIN_VALID_VERSION 的副作用是什么?

(我使用的是 SQL Server 2012。)

sql-server change-tracking
  • 1 个回答
  • 2123 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve