我们最近设置了一个运行 Windows Server 2008 的新虚拟机,并在其上安装了 SQL Server 2005 的副本。该服务器已经运行并顺利使用了大约两周。我们对它所做的唯一真正维护是移动数据库文件所在的分区(近一周前完成),我们运行了数据库引擎优化顾问,以查看昨天中午 12 点左右对新索引的一些建议。
下午 5 点刚过,软件像往常一样使用时,有人通知我该程序似乎不再正常工作。我检查了数据库,不仅特定于他使用该程序的数据消失了,而且每张大约五十张表的表格似乎都被抹去了所有记录。
在与应用程序开发人员进行了长时间的交谈之后,很明显这不是他们软件的远程可能的功能。
在争先恐后地恢复原状的过程中,我们通过重新启动之间的运行副本克隆了 VM 的备份,从那以后它已经运行了大约一天的时间。因此,我们没有导致问题本身的事件日志。
你以前见过这样的事情吗?(数据库的所有表中的所有记录都......消失了。)有没有人有一个合理的理论来说明这种情况是如何发生的,如果有什么是合理的预防措施呢?
我负责管理 SQL Server 200x 的一个实例,它不幸充当了一个用令人讨厌的性能问题编写的交钥匙应用程序的后端。它重复使用准备静态游标的模式,它只使用前几个条目,通常需要几十毫秒。在一个连续的流中有成千上万个这样的查询。
事情的真相是,由于应用程序数据完整性的奇怪设计,这些查询中的任何一个都根本不是问题,因此它们是静态的这一事实是悲惨的,因为如果它们是静态的,性能将提高大约 30 倍动态的。
在与供应商打交道数周后,我一无所获。事实上,我真正需要做的就是更改应用程序使用 sp_cursorprepexec 的方式中的一个参数。如有必要,我什至可以在整个服务器上以全局方式执行此操作。
我正在研究任何和所有解决方案,无论是使用 SQL Server 200x 中我无法找到的功能,编写一个位于 SQL Server 和客户端之间并修改数据的小应用程序(尽管我不会期待弄清楚如何以这种方式处理 TDS 协议),或者以某种方式重命名 sp_cursorprepexec 并用包装器替换它。
天空是极限。
(仅供参考,我们现在正在运行 SQL Server 2005,但如果有令人信服的理由支付额外的钱来升级许可证,它可能会发生。)
我负责监督使用 SQL Server 作为其后端存储解决方案的应用程序。不幸的是,该应用程序没有关于如何使用 RDBMS 的概念,似乎主要像使用 NoSQL 解决方案一样使用它。应用程序最需要的是获取和存储单个记录,并且不使用任何外键来保证数据完整性。
正如预期的那样,这种出色的设计导致了相当差的性能,因为将 RDBMS 用于仅需要磁盘散列样式方案的问题就像对蚊子使用大炮一样。但可惜的是,我无法修改该软件,因为它是第三方软件。
我已经看到许多提示,很高兴告诉我应该使用更有效的查询,但这根本不是一个选择。SQL Server 似乎主要受 CPU 限制,而且大部分数据似乎也缓存在内存中。有没有一种方法可以优化/配置 SQL 处理来自该应用程序的请求的方式?(整个 SQL Server 实例仅供应用程序使用。)或者,是否有另一种解决方案,其行为与 SQL Server 相似,但在简单查询的速度上与 NoSQL 相似?SQL Server 是否有某种单进程模式使锁定记录变得不必要?
我应该尝试一下任何离奇的想法吗?
更新: 因此,在对带有自动生成的游标准备、执行、获取等的跟踪进行大量处理之后,看起来在关注的特定应用程序功能中的大部分时间都浪费在填充表上,只有第一行实际上是获取的。这实际上似乎是应用程序编写方式的常见问题。
由于游标后面的 select 语句对数据进行排序,游标不能有效地使用动态计划。最终,应用程序试图获取的数据是下一个记录,field A = document_id并且下一个field B值大于先前寻求的field B值。当然,这是游标的典型应用——如果应用程序以典型方式使用游标的话。
我想再次联系供应商,因为这...很糟糕。我认为它们更有可能出现在一个简单的两行已经存在的修复中。因此,我希望生成一个更高效的查询版本(仍然使用游标,具有相同的客户端语义“给我下一条记录,k?”)。我不确定如何在 TSQL 中制定这样的查询,因为我给出的所有结果都会导致扫描,即使是我认为有用的索引。(真的,只需要一个 b 树搜索,但不知何故我似乎无法到达那里。)