0

我们有一些混乱的数据库情况。

我们的主要后台系统是用 Visual Fox Pro 编写的,带有本地数据(是的,我知道!)

为了有效地处理我们网站中的数据,我们选择定期将数据导出到 SQL 数据库。但是,执行此操作的过程基本上每次都会清除表并重新插入。

这意味着我们有两个 SQL 数据库——一个是 FoxPro 导出过程写入的,另一个是我们的网站读取的。

这个问题与从一个 SQL 数据库到另一个(SqlFoxProData -> SqlWebData)的转换有关。

对于一个特定的表(我们的主要应用程序表之一),因为在这个过程中会发生各种数据转换,所以它不是使用自连接的简单的 UPDATE、INSERT 和 DELETE 语句,而是我们不得不使用游标代替(我知道!)

这已经运行了好几个月,但现在我们开始在更新时遇到性能问题(这可能在白天经常发生)

基本上,当我们从 SqlFoxProData.ImportantTable 更新 SqlWebData.ImportantTable 时,它​​会导致实时网站上偶尔出现连接超时/死锁/其他问题。

我一直在努力优化查询、缓存等,但现在我正在寻找另一种更新数据的策略。

想到的一个想法是拥有两份重要表(A 和 B),一些关于哪个表当前“活动”的概念,更新非活动表,然后切换当前活动表

即当我们更新ImportantTableB 时网站从ImportantTableA 读取,然后我们切换网站以从ImportantTableB 读取。

问题是,这是可行的还是个好主意?我以前做过类似的事情,但我不相信它一定对优化/索引等有好处。

欢迎任何建议,我知道这是一个混乱的情况......长期目标是让我们的 FoxPro 应用程序指向 SQL。

(如果有帮助,我们将使用 SQL 2005)

我应该补充一点,数据一致性在实例中并不是特别重要,因为数据总是有点过时

4

5 回答 5

2

有很多方法可以给这只猫剥皮。

我将首先解决锁定问题。我很少使用 CURSORS,我认为提高性能和锁定行为可能会解决你的很多问题。

我希望我会通过使用两个单独的临时表来解决它。一种用于 SQL 中的 FoxPro 导出,另一种用于并行转换为 SQL 中的最终格式。然后使用 sp_rename 将最终表交换为生产,或者仅使用 3 个 INSERT/UPDATE/DELETE 事务将最终表中的所有更改应用于生产。无论哪种方式,那里都会有一些锁定,但我们在谈论多大?

于 2009-01-27T14:50:29.637 回答
1

您应该能够为网站维护一个数据库,然后从另一个 sql 数据库表复制到该表。

这是假设您不更新网站本身的任何数据。

于 2009-01-27T13:39:25.863 回答
1

“对于一个特定的表(我们的主要应用程序表之一),由于在此过程中会发生各种数据转换,这不是使用自连接的简单的 UPDATE、INSERT 和 DELETE 语句,而是我们不得不使用游标(我知道!)”

我想不出我需要使用游标执行插入、更新或删除的情况。如果可以为游标编写选择,就可以将其转换为插入、更新或删除。您可以在这些语句中加入其他表,并使用 case 语句进行条件处理。花时间以基于集合的方式执行此操作可能会解决您的问题。

如果您有大量数据要移动,您可能会考虑一件事。我们偶尔会为我们想要的数据创建一个视图,然后有两个表 - 一个是活动的,另一个是数据将被加载到的表。当数据完成加载时,作为流程的一部分,运行一个简单的命令来将视图使用的表切换到刚刚完成加载的表。这样,用户最多只能停机几秒钟。您不会在他们试图在您加载时访问数据的情况下创建锁定问题。

您还可以考虑使用 SSIS 移动数据。

于 2009-01-27T16:15:17.983 回答
0

您是否可以选择使更新更具原子性,而不是声明的“清除并重新插入”?我认为 Visual Fox Pro 支持触发器,对吗?对于您的关键表,您是否可以向更新/插入/删除添加触发器以捕获更改记录的 ID,然后仅移动(或删除)这些记录?

或者如何将所有更改写入脱机数据库,并让 SQL Server 复制负责同步?

[对不起,如果我有足够的声誉,这将是一个评论!]

于 2009-01-27T13:49:52.440 回答
0

根据您在上面对 Ernie 的回复,您询问了如何复制数据库。这是Microsoft 关于 SQL2005 中复制的操作指南。

但是,如果您询问复制以及如何进行复制,这表明您对 SQL Server 的经验有些浅薄。话虽这么说,把事情搞砸是相当容易的,虽然我完全是为了从经验中学习,但如果这是关键任务数据,你可能最好聘请 DBA 或至少测试#$@#$ % 在你实际实施它之前。

于 2009-01-27T14:57:11.587 回答