在实时环境中有效地将数据从一个SQL数据库转换为另一个SQL数据库

时间:2009-01-27 13:12:53

标签: sql sql-server-2005 visual-foxpro foxpro

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

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

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

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

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

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

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

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

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

我想到的一个想法是拥有两个ImportantTable(A和B)副本,其中一个表当前是“活动的”,更新非活动表,然后切换当前的actice表

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

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

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

(如果它有帮助,我们正在使用SQL 2005)

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

5 个答案:

答案 0 :(得分:2)

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

我会首先攻击锁定问题。我很少使用CURSORS,我认为改善性能和锁定行为可能会解决很多问题。

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

答案 1 :(得分:1)

您应该能够为网站维护一个数据库,只需从其他sql db表复制到该表。

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

答案 2 :(得分:1)

“对于特定的表(我们的主要应用程序表之一),因为在此过程中发生了各种数据转换,所以不是使用自联接的直接UPDATE,INSERT和DELETE语句,但我们必须使用游标相反(我知道!)“

我想不出我需要使用游标执行插入,更新或删除的情况。如果可以为光标编写select,则可以将其转换为插入,更新或删除。您可以在这些语句中加入其他表,并使用案例库进行条件处理。花时间以基于集合的方式做这件事可以解决你的问题。

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

您可能还会考虑使用SSIS来移动数据。

答案 3 :(得分:0)

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

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

[抱歉,如果我有足够的声誉,这本来是评论!]

答案 4 :(得分:0)

根据您对上述Ernie的回复,您询问了如何复制数据库。这是Microsoft's how-to about replication in SQL2005.

但是,如果您询问复制以及如何执行此操作,则表明您对SQL服务器的体验有点轻松。话虽这么说,但是我很容易把事情搞得一团糟,虽然我只是为了经验而学习,如果这是关键任务数据,你可能最好雇用DBA或者至少测试#$ @#$在你实际实现它之前,已经达到了%。