我希望将一些数据库非规范化引入高度规范化的系统。
我拥有大量数据库,这些数据库已经发展了十多年,并且负载量不断增加,因此我希望提高性能并可能降低某些查询的复杂性。
执行 10 次连接来完成存储过程中的任何给定任务的情况并不少见。有人告诉我,超过 6 种臭味。
我应该保持表结构不变并提供一些物化视图或非规范化的“缓存”表。
一些关于最佳实践的建议或推动正确方向会有所帮助。
谢谢
我希望将一些数据库非规范化引入高度规范化的系统。
我拥有大量数据库,这些数据库已经发展了十多年,并且负载量不断增加,因此我希望提高性能并可能降低某些查询的复杂性。
执行 10 次连接来完成存储过程中的任何给定任务的情况并不少见。有人告诉我,超过 6 种臭味。
我应该保持表结构不变并提供一些物化视图或非规范化的“缓存”表。
一些关于最佳实践的建议或推动正确方向会有所帮助。
谢谢
你不说是什么问题。是性能吗?如果是这样,在什么桌子上?
真的是导致问题的连接吗?还是存储过程?你不知道(或者至少,你不说)。
最佳实践:在尝试解决尚未诊断的问题之前,首先找出瓶颈所在。
编辑时:我想起了在工作中遇到性能问题的时候。非常慢的存储过程,可能需要几分钟才能完成。事实证明,这些 sps 正在执行完全正常的表更新,但使用 cursors。对于像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;
是每次更新。
原来写这篇文章的人没有意识到我们可以发布一个更新声明。所以他写了几十个这样的慢速存储过程。我们甚至不需要删除存储的过程(虽然这也会为我们带来一些速度,但它会改变我们的客户端);我们刚刚摆脱了游标,用更新语句替换它们。性能问题消失了。
尝试大量和明智地索引。尝试使用索引视图。尝试预编译的存储过程。如果这失败了,请记住非规范化和缓存通常需要大量的同步工作,因此在执行之前应该仔细查看每种情况。
我不得不同意,10 次加入是邪恶的,会扼杀你的表现。
很大程度上取决于您的应用程序如何与数据库交互。如果您的代码严格遵守存储过程(没有直接的 SQL 调用),那么您的生活会更轻松。
如果你要去非规范化的麻烦,我不会添加新的“缓存”表。这实际上只是修补问题。我将继续制定一个完整的计划,以使用新的优化模式对数据库进行非规范化。
我同意以利亚的观点。确保你对任何你将要改变的东西进行基准测试。
此外,根据您的设置,索引视图可能是一种选择。