如何对规范化程度很高的数据库系统进行非规范化?

Ryu*_*Ryu 3 performance caching sql-server-2005 denormalization

我想将一些数据库非规范化引入到一个高度规范化的系统中.

我有一大堆已经发展了十多年的数据库,并且负载越来越大,所以我希望提高性能,并可能降低某些查询的复杂性.

在存储过程中完成10个连接以完成任何给定任务并不罕见.我被告知超过6个臭.

我应该保持表结构不变并提供一些物化视图或非规范化"缓存"表.

关于最佳实践或推动正确方向的一些建议会有所帮助.

谢谢

tpd*_*pdi 11

你没有说出问题所在.是性能吗?如果是这样,在什么表上?

它真的是引起问题的连接吗?还是存储过程?你不知道(至少,你不说).

最佳实践:在尝试解决尚未确诊的问题之前,先找出瓶颈所在的位置.


编辑时:当我们遇到性能问题时,我想起了工作的时间.非常慢的存储过程,可能需要几分钟才能完成.事实证明,这些sps正在进行完全正常的表更新,但使用游标.对于简单的东西update t set c = c + 1 where id = n.

因此,为了进行更新,我们通过一堆昂贵的更新游标来进行游说,declare cursor for "select c from t where id = n" for update;然后执行一个打开的游标,一个读取和错误检查以及一个带有读取和错误检查的循环,然后select c into @c; @c = c + 1; update t set c = @c where current of cursor;进行每次更新.

原来写这篇文章的人没有意识到我们可以发布更新声明.所以他写了几十个缓慢存储过程.我们甚至不需要摆脱存储的过程(尽管这会让我们获得一些速度,它会改变我们的客户端); 我们刚刚摆脱了游标,用更新语句替换它们.性能问题消失了.