增量 SQL 查询

Posted

技术标签:

【中文标题】增量 SQL 查询【英文标题】:incremental SQL query 【发布时间】:2010-10-30 03:17:24 【问题描述】:

我的应用程序有一组固定的 SQL 查询。这些查询以轮询模式运行,每 10 秒一次。

由于数据库的大小(> 100 GB)和设计(超级标准化),我遇到了性能问题。

每当数据库上发生更改查询结果的 CRUD 事件时,是否可以对给定查询进行增量更改?即,如果我正在查询所有姓 FOO 的员工,那么我希望在以下情况下得到通知:a)新员工加入姓 FOO b)姓 FOO 的员工被解雇等。

顺便说一句,我正在运行 SQL Server 2005。

谢谢!!

编辑:澄清一下,数据库大小为 100GB。查询不是存储过程。数据库是 SQL Server 2005(但如果需要可以升级到 2008)。因为数据非常规范化,所以我的查询中有 9 或 10 个表的 JOIN。因此,这些查询非常慢。即使有索引。

目前,当民意调查触发时,我在整个数据库上运行我的查询。任何记录是否已更改。理想情况下,我想做的是注册我的查询 与服务器,并在查询结果集有任何更改时收到通知。因此,如果添加了与我的查询匹配的记录,只需通知我这一更改。 我认为这会比在轮询循环中重新运行整个查询更好。这就是我所说的增量。这样,我可以将更改推送给我的客户,并摆脱轮询。再次感谢所有 cmets!

【问题讨论】:

SQL 没有任何通知/消息。审核可能会对您有所帮助,但我认为我并不完全了解您想要做什么...... 我认为他希望对查询结果进行某种智能缓存,以便仅在必要时实际运行查询。但是,除了创建一个表并使用查询结果按计划填充它之外,不知道实现这一目标的好方法。 :// 这听起来有点像他想要一些东西来帮助跟踪数据库中的值以进行查询/更新。我想知道他是否听说过indexes 记录一下,有些东西是这样工作的,它是 pub/sub 的一种形式。我的大脑现在让我失望了,否则我会为你搜索它。 【参考方案1】:

您可以使用触发器记录中间表中的更改,然后在计划脚本中处理修改。 为了捕获更改,SQL Server 2008 引入了一项称为 CDC 的新功能。有关 CDC 的更多详细信息,请查看这篇文章:

http://blog.sqlauthority.com/2009/09/01/sql-server-download-script-of-change-data-capture-cdc/

【讨论】:

CDC 看起来是个不错的功能。我想我可以在 CDC 生成的表上运行查询以查看增量更改。【参考方案2】:

对不起,规范化比非规范化快十到一百(那里有许多非规范化的文件集合!)。

您是否认真地每 10 秒返回一个 100GB 的结果集?这可能是一件愚蠢的事情(无论数据库是否标准化)。您每 10 秒敲击服务器并用 100GB 的数据淹没网络,其中 99% 没有变化。

“每当数据库上发生改变 [previous] 查询结果的 CRUD 事件时,是否可以对给定查询进行增量更改?”

当然。 ANSI SQL 提供了某些基础知识,供应商在此基础上提供了扩展。当然,被事件唤醒比轮询更好,但在你的情况下,这不是问题。如果数据库中有一些标准,那么只获取有变化的行是不费吹灰之力的。合理的系统有一个 TIMESTAMP 或 DATETIME 列来防止丢失更新和乐观锁定。如果你有它,并且服务器可以相互 RPC,那么编写只更新(删除、插入)那些已更改的行的 SQL 代码是非常简单的。

如果您没有实现此类列,那么您可以将它们放入(无需更改应用程序代码),或者编写丑陋的代码来检查每行中的每一列(不推荐。)

如果您有 Sybase,它会提供通知(消除轮询)。

但问题是,为什么需要将整个数据库复制到其他位置?

Sybase 和其他公司推出了一种复制数据的产品(消除了每十秒移动 100GB 的应用程序)。

【讨论】:

【参考方案3】:

我同意,DML 触发器听起来是您的最佳选择。当插入/更新/删除发生时,SQL 会触发一个事件。然后,您可以使用此事件来更新另一个表。但在经常更新的表上,这可能会产生不受欢迎的开销。

http://msdn.microsoft.com/en-us/library/ms178110.aspx

Extended Events 和 CDC 是 2008 年的功能,所以它们已经过时了。

“我的应用程序有一组固定的 SQL 查询”——这些是存储过程吗?

每 10 秒运行一次的查询是否已优化? SARGable 参数?一个很好的可重用查询计划。

【讨论】:

DML 触发器可以工作。但这只是解决方案的一部分。 DML 触发器可以触发服务代理请求,然后您可以查看队列以获取更新。 如果您要去 2008 年 - 预期的事件可能是要走的路。另一种选择可能是……我写了一些 .net 代码 抱歉 - 就像 dml 触发器一样,等待 sql 触发事件 - 不确定是否是这样,但这可能会有所帮助。在 C# Windows 应用程序中实现 SQL Server 2005 查询通知 - support.microsoft.com/kb/555893

以上是关于增量 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将自动增量 ID 列添加到从 SQL 查询生成的表中? [复制]

如何在表中插入变量(@id)作为 SQL 服务器查询中的自动增量?

如何使用单个查询在 SQL 中获取最后一个增量 id

MySQL第五天(增量备份和增量恢复)

SQL查询如何对增量键RANK中的相同结果进行单独分组

如何避免 BigQuery 中的 Power BI 增量刷新重复查询?