Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 如果I';我期望读的比写的多?_Sql_Database_Performance_Scalability_Database Performance - Fatal编程技术网

Sql 如果I';我期望读的比写的多?

Sql 如果I';我期望读的比写的多?,sql,database,performance,scalability,database-performance,Sql,Database,Performance,Scalability,Database Performance,假设我有一个数据库,其中包含商店的数字评分,我的应用程序需要能够读取商店的平均评分: 工作表:id(主键)、名称(varchar)、平均等级(浮动-冗余列) 评级表: 标识(主键)、等级编号(整数)、车间标识(整数) 显然,最好的做法是从评级表中重新计算平均评级,以确保一致性;然而,从该应用程序的早期版本来看,预计大约80%的查询将被读取,以了解商店的平均评级。换句话说,写评级比读商店的平均评级要难得多 如果我以这种方式构建数据库,我就不需要额外的连接或查询来跳到评级表。有什么需要注意的吗?我想

假设我有一个数据库,其中包含商店的数字评分,我的应用程序需要能够读取商店的平均评分:

工作表:id(主键)、名称(varchar)、平均等级(浮动-冗余列)

评级表: 标识(主键)、等级编号(整数)、车间标识(整数)

显然,最好的做法是从评级表中重新计算平均评级,以确保一致性;然而,从该应用程序的早期版本来看,预计大约80%的查询将被读取,以了解商店的平均评级。换句话说,写评级比读商店的平均评级要难得多


如果我以这种方式构建数据库,我就不需要额外的连接或查询来跳到评级表。有什么需要注意的吗?

我想说,这完全没问题,而且可能会节省一些阅读流量,特别是如果你无论如何都需要查找店名的话

您可能会在插入新评级的事务中更新平均评级。另一种方法是创建触发器来执行此操作。你更喜欢哪一个更取决于品味,因为所做的工作大致相同


然后,您需要在
(shop\u id,rating\u num)
上输入一个键,以使计算店铺的新平均评级变得高效(假设
rating\u num
是实际评级分数)。

在Sql Server中解决此情况的最佳方法是使用,MySql称之为物化视图


索引视图可以自动为您保持平均评级数据的最新状态,而无需在表中实际复制。当然,数据仍然在视图中重复。区别在于,您只需要告诉Sql Server该数据是什么样子。您不需要自己管理保持它的最新状态。

根据您正在使用的数据库,您可以使用一个数据库来完成相同的任务。如果您的服务器支持,我会探索这条路径(Oracle、MSSQL和Postgresql都支持),谢谢您的提示!但是,对于不支持物化视图的数据库呢;我想你必须使用触发器或计划作业来更新缓存的平均值,这取决于你想要它的最新程度,但我看不出有什么大问题。每件事都有时间和地点。我帮助维护一个数据仓库,其中包括汇总表。这些表仅用于报告,并且包含计算值。对不起,请您解释一下为什么评级需要索引?我假设“rating_num”是给定的实际评级(1..5或其他),因为我看不到其他列可能是这样的。我建议的索引称为“覆盖索引”--如果在评级表中只有“shop_id”上的索引,那么数据库引擎在找到索引中的商店后必须转到行本身,这将是非常分散的I/O和糟糕的性能,无法计算平均评级数量。使用索引中所需的所有数据,I/O将是连续的,甚至不需要转到基表存储。缺点是速度较慢(或者可能较慢,除非您非常小心并确切知道自己在做什么)。鉴于性能是这个问题的根源,我认为性能优化是主要目标。只有当你有大量的写操作时,它才会变慢,而有更多的读操作是问题的一个明确部分。无论如何,问题的性能部分有点过早优化的味道。