【问题标题】:Optimization of database数据库优化
【发布时间】:2013-12-14 04:17:41
【问题描述】:

我有一个名为 MetricTbl 的表,其字段为 User_Id、Entity、Metric、ModifiedDate、Value。值、UserId 是整数。 Entity 和 Metric 是 nvarchar。表有大约 3000 万行。

我想优化查询 - 从 MetricTbl 中选择 SUM(Value),其中 UserId = 1 且 Entity = 'Room' 和 Metric = 'Temperature'

我必须为这种查询设计一个策略。我正在使用天蓝色联邦。这是一个联合表。 我已经在 User_Id、Entity、Metric、ModifiedDate 上创建了唯一索引。因为它是天蓝色的联邦所以我不能有索引视图。 请提出一些策略。 如果需要,我可以创建新表。 谢谢 马尼什

【问题讨论】:

  • 你到底想要什么????
  • 哇 30*10^6 行 那么这有什么问题呢? 从 MetricTbl 中选择 SUM(Value),其中 UserId = 1 且 Entity = 'Room' 和 Metric = 'Temperature'
  • 在用户 ID、实体、指标上添加索引,并将值作为包含的列
  • 按照@AllanS.Hansen 的建议,尝试将value 列作为最后一个字段添加到您的索引中。 (User_Id, Entity, Metric, ModifiedDate, Value)(User_Id, Entity, Metric, ModifiedDate) INCLUDE (Value)。这意味着可以通过仅查看索引来回答查询,而无需执行从索引到表的有效连接(查找要求和的值)。然后,如果 Azure 允许,请调查聚集索引的工作方式以及它们在这种情况下是否合适。

标签: sql sql-server azure-sql-database federation


【解决方案1】:

我对 Azure 联合技术不是很熟悉,但在您上面描述的典型场景中,我将创建一个索引,涵盖 WHERE 子句中使用的所有列,其中 INCLUDE 包含您的列中的列选择。如果可能,我还将创建过滤后的索引以节省空间和性能,具体取决于您永远不会查询的每个 WHERE 列中是否有很多值。

IE,如果您只需要查询“温度”、“距离”和“压力”等虚构值,您可以这样做。

CREATE NONCLUSTERED INDEX Metric_SUM_IDX ON MetricTbl (UserId, Entity, Metric) 
INCLUDE (Value) 
WHERE Metric IN ('Temperature','Distance','Pressure')

但如前所述,实际索引完全取决于您的特定场景。而且我必须提醒您免责声明,我不知道 Azure Federation 上的分片可能对此有什么特殊影响。可能没有,但我不能确定。

【讨论】:

  • 分片没有特殊效果...我只提到了一个分片数据库....但我的问题是20k用户插入记录并且每个条目都是一个键值对并且有大约 100 个键值对,所以我每天有大约 200 万个条目,然后每 15 分钟更新一次记录。第二天我再次有 200 万个条目,将有大约 10k 用户访问我的网站,该网站显示汇总记录/月/季度,用户可以要求自定义报告。我必须优化这个过程。
猜你喜欢
  • 2012-07-20
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2011-11-30
  • 2011-07-03
相关资源
最近更新 更多