以在 Oracle 和 SQL Server 中获得最佳性能为目标的数据建模

Posted

技术标签:

【中文标题】以在 Oracle 和 SQL Server 中获得最佳性能为目标的数据建模【英文标题】:Data modeling with the goal to get the best performance in Oracle and SQL Server 【发布时间】:2018-08-20 15:16:15 【问题描述】:

我有一个关于如何为股票数据库建模以获得最佳性能的问题。

在 SQL Server 或 Oracle 中,执行的每个更新都会生成一个小锁。

我想知道您能告诉我的最佳解决方案是什么

解决方案 1:创建一个包含数量列的产品库存表,并针对每个输入或输出对该列执行 SQL 更新

解决方案 2:为产品库存移动创建一个表,其中对于每个输入,我将执行一个正数的插入,对于每个输出,我将执行一个负数的插入。

在一天结束的时候,我会执行一个过程,用产品库存移动表的“sum”结果更新库存产品的数量 之后,我会删除产品库存移动表中的所有记录

使用 解决方案 1,我的优势在于执行简单的选择以获取产品库存数量,但在白天,我的劣势是由于销售量的许多数量更新而导致锁定很多产品

使用 解决方案 2,我的缺点是,我需要获取产品库存数量,我需要使用产品库存移动表进行查询并进行咨询产品的所有输入和输出的总和,但这样一整天我就不会有任何锁

您对提出的两种解决方案有何看法?

解决方案 2 中描述的建模是否是一种好习惯?

非常感谢

【问题讨论】:

音量是多少?两个 db 每秒都可以处理 1000 次事务,而不会出现锁定问题——甚至不会引起注意。 听起来像解决方案 2 是所谓的“过早优化”,即做出非标准的设计决策来处理尚未发生的性能问题。除非存在实际的性能问题,否则我会选择 #1。然后我会评估这个问题并确定解决它的最佳方法。 在 Oracle 中,更新会创建一个锁(或更确切地说是多个锁),但通常这些锁不会阻塞并发操作(读取或写入)。在 SQL Server 中,锁定的效果取决于:使用隔离级别的快照锁定通常也不是主要问题。当然,这些陈述仅在某些前提下才成立(尤其是短期交易)。 对于任何一个 RDBMS 来说,该卷几乎都没有;除非您的收银员之一是 Flash Gordon,否则您无需担心。我们公司有超过 2000 人不断地保存到我们在 SQL Server 上的 CRM 数据库,我们不是一家大型商店,我们很少看到争用 阅读数据库规范化。只要您的数据库是规范化的,您就可以拥有 10 个用户或 10,000 多个用户......第一次学习并做对,您将处于良好状态。同样,dba.stackexchange.com 是提供这些主题指导的好地方。 【参考方案1】:

这里做了很多假设,可能会解决“假设”问题。您没有数字可以自信地说明这些设计中的任何一个都会导致问题。我们也不知道您的硬件规格。

首先进行一些尽职调查,并弄清楚您每天或每月处理多少数量等,以及在任何给定时间(分钟/小时)将发生多少读/写?一旦你有了这些数字(即使它们不准确,你应该得到一些活动感)在托管数据库的实际实例(或类似的实例)上为你的两个解决方案运行一些基准测试,并亲自看看哪些表现更好。

以 3 倍或 5 倍的读/写次数重复该练习,并再次进行比较,以便为未来的增长做好准备。

根据一堆假设做出的决定会导致非常固执的设计,并且总是会导致糟糕的选择。始终使用数据来推动您的决策并验证您的假设。

PS:这里从经验谈起。鉴于我们正在处理非常大的事务,我们通常有一个汇总表和一个明细表,并在明细表中插入新记录时使用触发器来更新汇总表中的计数等。

祝你好运。

【讨论】:

以上是关于以在 Oracle 和 SQL Server 中获得最佳性能为目标的数据建模的主要内容,如果未能解决你的问题,请参考以下文章

格式化查询以在 Oracle SQL 中显示浮点小数

授予权限以在 oracle sql 过程中创建表

需要帮助以在 SQL Server 上启用变更数据捕获 (CDC)

启动多个存储过程以在 SQL Server Express Edition 上“在后台”运行

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

在内存(嵌入式)数据库中配置 SQL Server 以在 Spring 中进行测试