继my previous question后,我正在寻找对对象模型的各种潜在架构表示进行一些性能测试。然而,问题是虽然模型在概念上是完整的,但它实际上还没有最终确定 - 因此每个表中确切的表数和数量/类型的属性都不确定。
从我(可能是天真的)的角度来看,似乎应该可以为每种方法组合一个代表原型模型,并测试每种方法的性能以确定哪种方法最快对于每个案例。
这就是问题的来源。我知道数据库的性能特征可能非常不直观,因此一个小的(甚至“微不足道的”)变化可能导致一个数量级的差异。因此,我想知道在设置虚拟表结构并使用虚拟数据填充它时可能存在的常见陷阱。由于环境可能在这里产生巨大差异,因此目标是在RHEL 3上运行的Oracle 10.2.0.3.0。
(特别是,我正在寻找一些例子,例如“确保你的一个表的索引比另一个更具选择性”;“确保你有超过 x 行/ columns因为在这之下你不会遇到页面错误而且性能会有所不同“;”确保你使用DATETIME数据类型进行测试,如果你要使用它,因为它会大大改变查询计划“,依此类推。我试过谷歌,期望在这个领域有很多关于最佳实践的网页/博客文章,但是找不到木材的树木(很多关于调整现有数据库性能的页面)。)
作为一个说明,我愿意接受这样的回答:“如果确实如此,那么对结果的传递性进行任何程度的信任是不可行的。” / p>
答案 0 :(得分:1)
针对概念模型的各种假设实现运行性能测试并不像英雄式的前瞻性思维那么幼稚。唉,我怀疑这会浪费你的时间。
我们举一个例子:数据。据推测,您打算生成随机数据来填充表格。这可能会让您对查询在大容量中的执行情况有所了解。但是,性能问题往往是数据偏差的结果;随机数据集将为您提供平均值的分布。
另一个例子:代码。大多数性能问题都是由于编写错误的SQL,特别是不合适的连接。您可以应用索引来调整SELECT * FROM my_table WHERE blah
的个人,但这不会帮助您阻止编写错误的查询。
关于过早优化的真理适用于数据库和算法。最重要的是让数据模型完整和正确。如果你管理你已经领先于游戏。
修改强>
阅读了与之相关的问题后,我会更清楚地了解您的来源。我从数据库设计者的角度对这个Hibernate映射问题有一点经验。以你在页面末尾给出的例子为例......
Animal
> Vertebrate
> Mammal
> Carnivore
> Canine
> Dog type
层次结构,
...关键是尽可能在链的实例化实例化对象。实例化Animals
列将比实例化Dogs
,Cats
等单独的集合执行速度慢得多(假设您有所有或部分子类型的表)。
这更像是一个应用程序设计问题,而不是数据库问题。有什么区别的是你是否只在具体级别(CATS,DOGS)构建表格,或者是否复制表格中的层次结构(ANIMALS,VERTEBRATES等)。不幸的是,这里没有简单的答案。例如,您不仅要考虑数据检索的性能,还要考虑Hibernate如何处理插入和更新:在持久化数据时,一个表现良好的查询设计可能是一个真正的噩梦。关系完整性也会产生影响:如果你有一个适用于所有Mammals
的实体,那么能够对MAMMALS表强制执行外键是令人欣慰的。
答案 1 :(得分:1)
您可以采取一些措施来确定自己的绩效目标。我认为他们按此顺序发生:
每个人的更多内容:
体系结构,最佳实践和模式:报告数据库无法执行的最常见原因之一是构建数据库的人完全不熟悉报告域。他们可能是事务数据库域的专家 - 但该域中的技术不会转换为仓库/报告域。因此,您需要很好地了解您的域名 - 如果您这样做,您将能够快速确定几乎始终有效的适当方法 - 并且您可以从那里进行调整。
数据库的工作原理:您需要了解优化程序/计划程序对查询的选项。对添加索引的不同语句有什么影响?索引256字节varchar有什么影响?报告查询甚至会使用您的索引吗?等
既然您已经采用了正确的方法,并且通常了解90%的模型将如何执行 - 您通常会使用大多数中小型数据库预测性能。如果你有一个巨大的,有一个岌岌可危,你必须得到更精确(可能需要订购更多的硬件),或在设计中有一些古怪的点 - 然后专注于你的测试。生成合理的测试数据 - 以及您在生产中看到的(重要)统计数据。并查看数据库将对该数据执行的操作。除非你有真正的数据和真正的prod大小的服务器,你仍然需要推断 - 但你应该至少能够合理地接近。
答案 2 :(得分:1)
数据库的性能问题无法与数据量线性扩展。其中包含一百万行的数据库可能会显示一个热点,而一个包含十亿行的类似数据库可能会显示一个完全不同的热点。注意用样本数据进行的测试。
您需要良好的声音数据库设计实践,以保持您的设计简单和健全。担心您的数据库是否满足数据要求,以及您的模型是否相关,完整,正确和关系(假设您正在构建关系数据库),甚至在开始担心速度之前。
然后,一旦你有一些简单,合理和正确的东西,就开始担心速度。只需调整数据库的物理特性,而不更改任何应用程序代码,您就会惊讶于您可以加快速度。为此,您需要了解有关特定DBMS的许多信息。
他们从未说数据库开发会很容易。他们只是说这会很有趣!