SQL表大小和查询性能

时间:2009-11-13 14:24:22

标签: sql-server performance optimization

我们有许多来自网络服务的项目;每个项目包含未知数量的属性。我们将它们存储在具有以下Schema的数据库中。

产品
   - ItemID
   - ItemName

属性
   - PropertyID
   - 财产名称
   - PropertyValue
   - PropertyValueType
   - TransmitTime
   - ItemID [fk]

属性表变得非常大,因为每次调用Web服务时它都会存储每个项的属性。我的问题是:我们应该在什么时候停止向Properties表添加新记录,并根据它们的传输时间归档旧的Property记录?属性表什么时候变得太大,查询时间太长?有经验法则吗?

感谢。

4 个答案:

答案 0 :(得分:2)

我不确定MS SQL Server,但大多数数据库似乎都有分区表的方法。也就是说,从许多较小的表中创建一个虚拟表,并根据一些简单的规则在它们之间划分数据。

这对于基于时间的数据非常有用。将表格划分为一天或一小时的时间段。然后每个时间段添加一个新的表分区并删除最旧的表分区。比执行DELETE WHERE时间<更高效。现在 - '1小时',或其他什么。

或者不是删除最旧的,而是将其归档或者只是让它占用空间。只要您的查询始终指定日期范围,查询就只能使用最合适的子表。

答案 1 :(得分:2)

没有经验法则

一些想法:

  • 定义“大”(我们有1.6亿行表)
  • 你现在有问题吗?如果不是,请不要修理它
  • 让你运行探查器或一些奇怪的dmv来找出瓶颈(缺少索引等)
  • 如果您需要掌握数据,则无法存档
  • 你可以通过
  • 对表进行分区

答案 2 :(得分:1)

我认为这不是一个黄金法则。虽然规范化可能会导致性能显着下降,但您的架构已经很规范化了。

需要考虑的几个因素:
- 使用场景
- 服务器硬件规格
- 数据库操作的性质(例如,读取比写入更多?,插入和不更新?)

对于您的情况,如果属性数量不超过某个数字,则单个锯齿状表可能更好或者可能不是。 (我可能会因为这句话而受到抨击:P)

归档策略还取决于您的业务需求/要求。您可能需要为了满足这种需要而抽空硬件。

答案 3 :(得分:0)

根据您拥有的特定“属性类型”的数量,观察模式可能会有所帮助。

在你的例子中:
Item = Subject
Property = Observation
PropertyName = ObservationType.Name
PropertyValueType = ObservationType.IsTrait

这样,您就不会在每条记录中重复PropertyNamePropertyValueType。根据您的应用程序,如果您可以在应用层中缓存ObservationTypeSubject,那么插入也会得到改善。

  - 测量和特征是类型    观察结果。测量是一个    数字观察,像高度。    特质是描述性的观察,    喜欢颜色。

observation_model_02