优化数据库结构 - 提高查询速度

时间:2015-04-20 15:26:52

标签: sql .net database performance optimization

我正在编写一个可以使用相当大的数据库的新软件。该软件将从许多尺度捕获数据,这将向软件发送许多权重值。每个刻度都有一个序列号。

考虑每一行的基本信息,即weight_id,scale_id,weight和timestamp ......是一个唯一的表,它会有一个名为scale_id的列,还是每个比例的表更好?考虑到我们不能有太多的尺度...最大数量将是16 ...更常见3-4。

案例A. 独特的表格

  • ID
  • scale_id
  • 重量
  • 时间戳

案例B. 表scale_1123,表scale_2222

  • ID
  • 重量
  • 时间戳

我对这个问题有疑问,因为我们希望每个规模的行数每年可达到100.000.000 ......并且机器可以运行长达10年......或许更多。< / p>

最后,我应该按月或按周打破桌子吗?或者我可以把它们放在一起吗?

我们的目标是 - 当我们拥有一个大型数据库时 - 在特定时间范围内进行查询,以便在最短的时间内提取一个或多个量表的统计数据(如平均体重,STD。偏差,......)< / p>

我很抱歉这些问题......但是阅读数据库文档我找不到哪个是最好的答案

2 个答案:

答案 0 :(得分:3)

预赛

  

阅读数据库文档我无法找到最佳答案

数据库文档告知您如何使用该产品,它没有告知您如何设计数据库。为此,你需要接受教育。

  

该平台尚未定义......因此我们在此阶段具有灵活性

嗯,最重要的建议是,获得一个真正的SQL平台(即一个符合ISO / IEC / ANSI SQL标准的平台),你赢了;当你从假装中迁移时必须重写你的代码 - sql或非sql到真正的SQL。这些天有很多免费软件/共享软件/ vapourware,都是不合规的,所有这些都是通过引用&#34; SQL&#34;在手册中,在每一页上,但它们都是欺诈行为。他们有许多额外的东西,但他们缺乏基础。

你总能得到你付出的代价,所以要确保你付出一些有价值的东西,以获得有价值的东西。商业SQL(Oracle除外)具有服务器架构,它们比vapourware快三个数量级。

记录ID

在IT的这些黑暗时期,趋势似乎是:

  • 关注数据,尤其是数据。这为您提供了一个很好的电子表格视角

  • 在每个文件上标记ID字段。这样就可以修复电子表格。

  • 在某个非SQL平台的数据库容器中实现它。

  • 编写应用

  • 期待它的任何和所有关系数据库功能。

现在,在上述步骤中,确切地说是使用关系数据库原则;造型;设计;正常化;等?在什么基础上,任何理性的人都可以期待任何关系能力(更不用说Integrity; Power;或Speed)?那件事如何获得关系能力?

如果你把一袋垃圾放在标有&#34;瑞士巧克力 Top Quailty &#34;的盒子里,它仍然是垃圾。这个位置并没有将垃圾神奇地转化为瑞士巧克力。

重点是双重的:

  1. 如果你没有自己教育关系数据库技术,应用它,那么这个东西就不会是关系型的。

  2. 上述步骤的结果始终是1970年以前的ISAM记录归档系统。没有关系数据库的完整性,功能或速度。

  3. 现在你一直在读书。好。但问题在于,所有关于关系数据库的书籍都是由完全不了解它的人写的。自从我们拥有真正的RDBMS平台34年以来,E F Codd博士写了 Relational Model 已经过去了45年;标准;方法,但地球的95%仍在实施1970年以前的ISAM RFS。为什么?因为这就是书籍所教导的内容。为什么?因为这是所有作者真正知道的。他们无法教授他们不知道的事情。

    你是一个聪明能干的人,但你被颠覆了。所以必须先纠正。请阅读this Answer。慢慢来。实际上使用并试验给出的示例SQL代码。

    两个总结点。如果您在电子表格的数据透视图上标记了ID

    1. 这将是一个RFS,而不是一个RDb。

    2. 这将削弱建模过程。

    3. 关系数据库

      但是你已经用数据库,性能,优化标记了你的问题,所以我假设你想要所有这些。

      瑞士牛奶和最好的可可制作瑞士巧克力。为了生成关系数据库,必须

      • 为数据建模,只为数据建模,只为数据建模。这意味着没有引用用法,应用程序或报告

      • 使用关系数据建模技术和规范化

      • 确定关系密钥(这就是完整性,功能和速度的来源)

      • 了解数据库是一系列事实,关于应用程序将要使用的真实世界。它不是具有可能相关的字段的记录集合(这是电子表格的透视图)。

      这将生成一个真正的关系数据库,其中任何报告都可以在单个SELECT命令中写入数据。选择你梦寐以求的,以及你无法想象的SELECT。

      问题

        

      目标是 - 当我们拥有一个大型数据库时 - 在特定时间范围内进行查询,以便在最短的时间内提取一个或多个量表的统计数据(如平均权重,STD。偏差,... 。)

      这只是你可以梦想的SELECT的一些例子,现在。它们都不复杂,每个都可以使用单个SELECT生成。来自RDb。从RFS开始,编写代码需要大约10倍的时间,并且需要多次迭代才能获得正确的数据。它至少需要10倍的硬件资源。

      方法是,首先我们做对了。这意味着Relational,非常非常快,可以处理数十亿行。然后,当且仅在必要时,我们使用真正的方法来提高性能。这是一个歇斯底里的神话,人们可以在正确的事情上实现性能。

        

      最好是一个唯一的表,它有一个名为scale_id的列,或者每个比例的表更好吗?
        最后,我应该按月或按周打破这些表吗?

      丑恶。

      从不&#34;休息&#34;一张桌子。

      你可能很乐意为它编码,在一个地方看两个地方或16个地方,但没有其他人会。离开项目后,用户很久就会诅咒你。这是1960年以前的方法论。我们在1969年把人放在月球上。这是2015年。我们现在用GB说话,而不是KB,而不是MB。

        

      考虑每一行的基本信息,即weight_id,scale_id,weight和timestamp

      不幸的是,这不是数据,这是上述非关系步骤的结果,包括所有类型的多余非数据。在我们考虑之前,我们必须首先正确建模数据。

      您尚未发布来自比例的传入数据。我会假设:

          serial_no
          date_time   -- time_stamp is misleading
          weight
      

      不知何故,在某个地方,你会被告知被称重的是什么,而不是通过那个饲料。

      如果通过Feed输入了其他内容,请立即告诉我。可能必须记录诸如ScaleReset之类的项目。

        

      案例A唯一表   案例B表scale_1123,表scale_2222

      好的,所以选项B似乎是每个比例一个表。可怕。你能想象跨越规模的标准偏差所需的SELECT。写这些书的人应该把它放在一个庇护所。

      其次,它过早地担心表现。

      好的,在这种情况下,选项A&#34;唯一表&#34; (这使我感到困惑,因为所有关系表都是唯一的,它们具有唯一的行)似乎是一个表中的所有比例,除了无用且误导性的ID字段之外,这更正确。

        

      考虑到我们不能有太多的量表...最大数量将是16 ...更常见的是3-4。

      无论如何都没有任何区别。系统可能会增长,您可能会有很多客户。

        

      我对这个问题表示怀疑,因为我们希望每个规模的行数每年可以达到100.000.000 ......并且这些机器可以运行长达10年。 .maybe more。

      无论如何都没有任何区别。系统可能会增长,您可能拥有许多客户。在确定性能问题之前,过早地担心性能问题。首先我们做对了,然后我们把它做得更快。

      在关系数据库中无需担心每个规模每秒3.17次插入。你应该担心的是你没有一个,你有一个RFS。这将在负载下破裂。然后你将不得不执行各种各样的杂技,以改善&#34;负面表现。最好将数据放入RDb。

      16个Billon行对于真正的SQL平台来说没问题。如果不是更早的话,假装-sllls将自己约为20亿行。

      解决方案

      这是所需的数据模型。

      • Continuous Weight Data Model

      • 如果您不习惯乐谱,请注意每个小刻度,刻痕和标记,实线与虚线,方形与圆角,意味着非常具体。仔细阅读IDEF1X Notation

      • 请仔细检查谓词。它们在验证模型时非常重要。如果不清楚,请询问。

      • 每个刻度都有一个序列号。没有更好的唯一行标识符。

      • 在历史表中,DateTime是要添加的明显组件,为了形成唯一性,它位于数据中(密钥可以由数据组成)。

      • 不需要ID个字段。如果你把它们放入,它们将是(a)多余的(b)额外的索引(c)增加插入性能的负担。

      • 密钥均匀分配数据。这意味着高并发性,因为并发插入(每秒3.12,时间4到16个刻度)将在表中传播,没有冲突。

        • 相反,&#34; PK&#34;这是一个ID字段,保证所有并发插入都会发生冲突,因为它们必须写入最后一页。这是一个有保证的热点&#34;。

        • 只能在真正的SQL平台上传播插入加载。在PK上使用聚集索引。

        • 但是,如果管理不当,则会导致页面拆分。该方法是根据索引重建的频率设置合适的FILLFACTOR。 (例如,我每三年重建一次Clustered Indices,并且仅使用最大的表格,超过50GB,使用80%的FILLFACTOR,留下20%用于插入插入。小于此的表格从不需要重建首先重建。)

      • 备用密钥的目的是在所有规模上提供DateTime的即时访问,即。你的时间范围查询。一个等级内的时间范围查询将使用PK索引,而不是AK索引,它们也将是瞬时的。

        • 相反,如果您有ID个字段,请分开以保证插入&#34;热点&#34;上的连续冲突,您的所有查询都将是&#34;跳跃&#34;整个文件。

答案 1 :(得分:1)

你的问题实际上与这个类型的大多数问题有点不同,但我认为这不会改变答案。通用答案是“将它们全部存储在一个表中,并使用分区和索引来获得所需的性能。”

但是,您说的是每个规模每年100,000,000行。拥有10年和16个等级,即高达16,000,000,000行。将scale id包括为4字节整数(相对于将数据存储在不同的表中)意味着额外增加64 GB的存储空间。这不是微不足道的,但是,当然,在10年的时间内,这似乎要少得多。

我无法回答你的问题(尽管我有偏见),但这是你应该考虑的事情:

  • 如何插入数据?这是一次一个还是每个规模3 /秒的稳定流量?
  • 各种查询的响应时间目标(要求?)是什么?
  • 新添加数据的新近度要求是什么?它需要多快才能获得?
  • 查询只能查看一个比例和多个比例?
  • 在10年的时间里,某些事情会发生什么变化吗? (这个问题的答案可能是“是”。)那会是数据量,比例数,每行的测量数量吗?
  • 查询通常会通过历史数据返回,带回许多不同的行吗?
  • 备份和恢复有哪些要求?
  • 对用户有哪些许可要求?

除了你建议的两个数据之外,这个数据量还有许多可能的架构:

  • 将每个比例存储在不同数据库中的单个表中。更适用于隔离故障和控制用户。
  • 将每个比例存储在不同数据库中的单个表中,按时间划分。
  • 将所有内容存储在一个表中。
  • 将每个比例存储在单个表中的单独分区中。
  • 将每个比例存储在单独的表格中。
  • 将每个比例存储在一个单独的表中,按时间划分。
  • 将每个比例存储在由比例和时间分区的一个表中。

而且,我认为这个清单还在继续。