递增式SQL查询

4
我的应用程序有一组固定的SQL查询。这些查询以轮询模式运行,每10秒运行一次。
由于数据库的大小(> 100 GB)和设计(超级规范化),我遇到了性能问题。
是否可能在发生更改查询结果的CRUD事件时,获取给定查询的增量更改?即如果我正在查询所有姓氏为FOO的员工,则希望在以下情况下得到通知:a)有新员工加入并具有姓氏为FOO b)姓氏为FOO的员工被解雇等等。
顺便说一句,我正在运行SQL Server 2005。
谢谢!!
编辑:为了澄清,数据库大小为100GB。查询不是存储过程。数据库是SQL Server 2005(但可以升级到2008)。由于数据非常规范化,我的查询中有9或10个表的JOIN。因此,这些查询相当缓慢。即使进行索引也是如此。
当前,当轮询触发时,我在整个数据库上运行我的查询。无论记录是否已更改。理想情况下,我想要做的是向服务器注册我的查询,并在查询结果集发生任何更改时获得通知。因此,如果添加与我的查询匹配的记录,请仅通知我此更改。我认为这比在轮询循环中重新运行整个查询要好。这就是我所说的增量。这样,我只需将更改推送到客户端,就可以摆脱轮询。再次感谢所有评论!

SQL没有任何通知/消息功能。审计可能会帮助您,但我不认为我完全理解您想要做什么... - OMG Ponies
1
我认为他想要某种智能缓存查询结果的方式,以便只在必要时才实际运行查询。不过,除了创建一个表并按计划填充查询结果之外,我不知道有什么好方法可以实现这一点。 :/ - nathan gonzalez
对我来说,他似乎想要一些帮助跟踪数据库中的值以进行查询/更新的工具。我想知道他是否听说过“索引”。 - Andrew Barber
就记录而言,有一种工作方式是这样的,它是发布/订阅的一种形式。我的大脑现在无法思考,否则我会为您谷歌一下。 - jcolebrand
3个回答

2

CDC 看起来是一个不错的功能。我想我可以在 CDC 生成的表上运行我的查询,以查看增量更改。 - Jacko

1

不好意思,但是规范化比非规范化快十到一百(很多未规范化的文件集合存在!)。

你真的需要每10秒返回一个100GB的结果集吗?无论数据库是否规范化,那可能都是一个愚蠢的想法。你正在攻击服务器并且每10秒洪泛着99%没有变化的100GB数据到网络上。

“当对更改[先前]查询的结果的数据库进行 CRUD 事件时,能否获取增量更改的给定查询?”

可以的。ANSI SQL提供了某些基本功能,而供应商在此基础上提供扩展。当然,通过事件被唤醒要比轮询好,但在你的情况下这不是问题。如果数据库中有一些系统标准,获取仅更改行是易如反掌的。合理的系统具有 TIMESTAMP 或 DATETIME 列以防止丢失更新和实现乐观锁定。如果你懂得这些,并且拥有可以进行 RPC 的服务器,则编写 SQL 代码只更新(删除、插入)已更改的行非常简单。

如果您没有实现这些列,那么您可以将它们放入其中(无需进行应用程序代码更改),或编写丑陋的代码来检查每行中的每个列(不建议这样做)。
如果您有Sybase,则提供通知(消除轮询)。
但问题是,为什么需要将整个数据库复制到其他位置?
Sybase和其他公司有一种产品可以复制数据(消除了每十秒移动100GB的应用程序)。

1

我同意,DML触发器听起来是您最好的选择。当插入/更新/删除操作发生时,SQL会触发一个事件。您可以利用此事件来更新另一个表。但是,在经常更新的表上,这可能会产生不必要的开销。

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

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

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

每10秒运行的查询是否进行了优化?SARGable参数?一个好的可重复使用的查询计划。


DML 触发器可以工作。但这只是解决方案的一部分。 - Jacko
DML触发器可以触发服务代理请求,然后您可以监视更新队列。 - MarkPm
如果你要去2008年,扩展事件可能是一个不错的选择。另一个选项可能是......我写了一些.NET代码来实现。 - MarkPm
抱歉 - 就像一个DML触发器,等待SQL触发事件 - 不确定是否正确,但这可能有所帮助。在C# Windows应用程序中实现SQL Server 2005查询通知 - http://support.microsoft.com/kb/555893 - MarkPm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接