我知道这可能不是构建数据库的正确方法,但是如果将数据放在一个巨大的表中而不是在其他表中逻辑分解数据库,数据库的执行速度会更快吗?
我想使用键来正确地设计和创建数据库,以便在表之间创建关系完整性,但是在查询时,JOIN比从一个表中读取所需数据要慢吗?我想尽快制作数据库查询。
答案 0 :(得分:13)
许多其他方面会影响您问题的答案。桌子的大小是多少?宽度?多少行?什么是使用模式?表中列的不同子集是否有不同的使用模式? (也就是说,两列每秒命中1000次,其他50列每天只打一次或两次?)这种情况将是垂直分割(分区)表的主要候选者(一个表中有两列,其余的在另一个)
通常,将模式规范化到可能的最大程度,然后使用典型或预测的负载和使用模式运行性能测试,并将非规范化和分区划分到性能可接受的点,并且不再...
答案 1 :(得分:3)
当然,这取决于dbms风格和实际数据。但通常更小(更窄)的表比更少(更宽)的表更快。
答案 2 :(得分:3)
必须执行连接时,访问速度会慢一些。慢多少取决于您的特定DBMS提供的功能,以及物理数据库设计如何利用这些功能,以及最常见的访问模式。有一些访问模式,在一行中存储大量数据会浪费时间,因为检索整行,但只使用了一小部分行。这取决于。
当数据存储在单个表中并且规范化规则偏离时,更新通常较慢。更新速度与查询速度的重要程度取决于您使用此数据库的特定方式。
总的来说,许多新手数据库设计师倾向于更加重视速度问题,而不是那些应得的问题。如果您的数据模型不灵活且难以理解,但速度提高了10%,那么您可能弊大于利。
答案 3 :(得分:1)
您是否正在构建像数据仓库这样的“只读”数据库?如果是这样,存储数据“预加入”可能是有意义的。对于日常OLTP数据库,您还需要考虑插入,更新和删除的性能和易用性。那么,那些只想要在一个或两个较小的表中存在的数据的查询呢?现在,他们必须通过一个装满他们不关心的东西的大桌子来磨练。
值得记住的是,加入表格对于一个体面的DBMS来说是件好事 - 他们非常擅长。
答案 4 :(得分:1)
查询单个表通常比查询多个连接表更快。但是,规范化设计允许您以多种方式查询数据,并在多种类型的查询中具有足够的性能。
如果对表进行非规范化,则可以提高一个特定查询的性能,同时牺牲针对该数据的其他查询的性能。当然,您必须手动管理参照完整性和冗余。
答案 5 :(得分:0)
您要问的是非规范化 - 如果以正确的方式完成,它可以加快读取速度,并且如果您能够确保您不会因此而将异常引入数据库。
答案 6 :(得分:0)
还要记住,可以存储在一条记录中的数据量存在硬性限制。 (不知道你有哪个数据库,我不能说它是什么。)太多列,你会达到这个限制。此外,如果你有像phone1,phone2,phone3这样的列,那么你需要规范化。如果您要插入的项目数量发生变化(如果您需要4个而不是3个电话号码,则需要添加一个列),则需要进行标准化。
答案 7 :(得分:0)
优化SELECTS的真实情况往往不是优化INSERTS,UPDATES和DELETES,因此采用这种方法。将数据分解为正确规范化的表可以减少更改数据的开销。
虽然在数据仓库或决策支持系统中我们经常存储预先加入的数据(如Tony所说),但它通常只发生在预先计算的摘要(例如物化视图)的上下文中,而不是对于粒度原子级别的数据。这样做的原因是将重复的较长字符串(例如“供应商名称”)推送到维度表中可减少所需的总存储空间和检索数据所需的物理读取次数。连接通常是等值连接,对于大型数据集,这些连接几乎不需要任何成本。