Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DB存储vs DB CPU-存储计算数据或使用视图计算_Sql_Sql Server_Database Design_Database Schema_Database Performance - Fatal编程技术网

Sql DB存储vs DB CPU-存储计算数据或使用视图计算

Sql DB存储vs DB CPU-存储计算数据或使用视图计算,sql,sql-server,database-design,database-schema,database-performance,Sql,Sql Server,Database Design,Database Schema,Database Performance,我正在考虑为我的数据库设计一个新的表。我在将最终计算存储在表列中,还是在计划创建的视图中计算它们之间左右为难。例如,如果要在一列中存储值10,在另一列中存储值5,并且希望在另一列中获取(10/5),您认为将值5存储在其自己的列中,还是在计划视图中计算它更好 该表大约一年左右的时间内每天将包含约40万条记录。即使我可以使用简单的数据类型来降低存储成本,但我仍然必须为每个记录维护另外4个字节的数据*同一行中可能有多少个计算记录 我将在几天的数据中查询计算值。我仍然需要速度,但也需要更小的数据库、更易

我正在考虑为我的数据库设计一个新的表。我在将最终计算存储在表列中,还是在计划创建的视图中计算它们之间左右为难。例如,如果要在一列中存储值10,在另一列中存储值5,并且希望在另一列中获取(10/5),您认为将值5存储在其自己的列中,还是在计划视图中计算它更好

该表大约一年左右的时间内每天将包含约40万条记录。即使我可以使用简单的数据类型来降低存储成本,但我仍然必须为每个记录维护另外4个字节的数据*同一行中可能有多少个计算记录

我将在几天的数据中查询计算值。我仍然需要速度,但也需要更小的数据库、更易于维护的表以及视图的灵活性


您的看法和想法是什么?

如果您有一个开发环境,我建议您测试这两种方法,并选择一种在每项工作/维护成本中提供最佳性能的方法。即使该表存储了约400k条记录,根据您访问这些数据的方式,一种方法可能更有意义

我将根据计算值进行查询

我怎么走

  • 如果选择列表中只提到计算值,则不要存储它。1
  • 如果它在WHERE中,您可能希望对它进行索引,在这种情况下,大多数DBMS将迫使您以某种方式将其持久化

1对于CPU的少量增加,您将降低存储需求,从而提高缓存效率,从而降低I/O,这往往是大多数OLTP工作负载中最重要的性能瓶颈。当计算成本很高时,缓存结果是合理的,但简单的除法离阈值相差很远


2在表中作为普通字段,或作为持久化计算列,或在物化/索引视图中。数据完整性是最重要的

在视图中计算结果一定会为您提供最新的答案。权衡是SELECT语句的运行时性能,特别是在WHERE子句中使用结果时。根据我的经验,计算结果很少用于WHERE子句。说到计算,我指的不仅仅是算术,还有字符串和子字符串的提取和连接,校验和计算,等等

将计算结果存储在基表中可提供最佳选择性能。取舍是数据完整性。如果可以编写一个CHECK()约束来保证结果总是正确的,那么应该这样做。但是,如果不使用用户定义的函数,复杂计算的CHECK()约束有时无法表达,而且并非所有平台都支持CHECK()约束中的用户定义函数

如果无法编写CHECK()约束,则仍然需要某种过程来定期检查数据是否存在错误。在最坏的情况下,您可以在低需求期间每天或每周运行报告

一个物化视图可能会提供两个方面的最佳效果——一个可以作为sargable WHERE子句的目标的计算,并且始终保证是正确的。(SQL Server等价物称为索引视图。)取舍是存储空间和CPU周期,在更新基表后,需要保持物化视图及其索引的最新状态


通常,我会先看一看。但在您的特殊情况下——365天每天40万行——我想我应该先尝试物化视图。无论出于何种原因,如果无法正常工作,您可以将其替换为基表中的一列,删除物化视图,然后创建一个具有相同名称的新视图。(逻辑数据独立性很强。)

在“拿两个——快、好、便宜”中,你似乎想要所有3个。。。您的数据量似乎足够大,因此尝试和测量这两种情况应该很容易在长期内获得回报……是的,我将对这两种情况进行一些测试,只是好奇其他人可能会发现什么最重要。