数据库架构重组以优化性能和空间

时间:2019-01-23 07:06:12

标签: database-design sql-server-2012 database-schema database-performance

我正在使用 SQL SERVER 2012 Express Edition ,(我不是数据库架构师,仅c#开发人员)我的表有30列和10+百万行

CID      PID    DID     FID  DateTimeStamp   P01    P02   P03.....P30

CI1001  PI1001  DI1001  30  2017-04-02 9:14  12     230   230

CI1001  PI1001  DI1002  51  2017-04-02 9:14  34     3430  3430

CI1001  PI1001  DI1003  5   2017-04-02 9:14  56     340   340

CI1001  PI1001  DI1004  4   2017-04-02 9:14  78     340   340

CI1001  PI1001  DI1005  5   2017-04-02 9:14  33     340   340

当前架构所面临的问题是

  1. 我无法在此结构中实现动态列添加。 例如。有时在客户很少的地方,我需要在“ P01,P02 ... P30”旁边添加其他列,例如P31,P32。

  2. 不一定所有列(即P01,P02 ... P30)始终都具有值,P01,P02 ... P020可能会有值,其余列为空/空。因此分配的空间在那里浪费。

  3. 在当前模式中,我需要应用2、3索引来维护查询和过程的性能。它工作正常,但不幸的是索引本身消耗了30%的存储空间,并且自从其快速版本以来,它在几个月内为我创建了文件大小限制问题。

现在我正在考虑将上述表架构分为两个表,例如

该表格将为每一列保存唯一的代码,例如(P01,P02,P03)

   CID       PID        PCODE      PNAME
   CI1001   PI1001      C1          P01
   CI1001   PI1001      C2          P02
   CI1001   PI1001      C3          P03
   CI1001   PI1001      C4          P04
   CI1001   PI1001      C5          P05

这将是实际的事务表,在其中我将为每一列插入一个新行。

CID     PID     DID     FID   PCODE       DateTimeStamp            Value
CI1001  PI1001  DI1001   30   C1          2017-04-02 9:14          230
CI1001  PI1001  DI1002   51   C2          2017-04-02 9:14          3430
CI1001  PI1001  DI1003   3    C3          2017-04-02 9:14          340
CI1001  PI1001  DI1004   4    C3          2017-04-02 9:14          340
CI1001  PI1001  DI1005   5    C5          2017-04-02 9:14          340

通过这种模式,我确定可以添加任何编号。在运行时的列数,但我不确定是否会因此获得任何性能和大小增长。 任何人都可以建议这种方法是否正确,或者对如何设计这种模式有任何建议?

已编辑

有了上面我解释的问题的模式3,我的问题已经解决,并且我对此进行了一些尝试,并且仅使用索引,所有查询集就可以顺利运行,因此性能不是问题,而是字面消耗的空间7倍于上一个。

下面是两个表的模式

主要交易表:-

    ClientID      varchar(8)    
    PlantID       varchar(8)
    DeviceID      varchar(8)    
    FeederID      tinyint   
    PCODE         varchar(10)   
    Dates         date
    TimeStamp     time(7)   
    VALUE         decimal(19, 3)

带有每个COL唯一代码的标签

ClientID     varchar(8) 
PlantID      varchar(8) 
PCODE        varchar(10)    
PARANAME     varchar(15)    

所以我正在考虑更改表架构,有人可以建议任何有关如何设计这种架构的意见吗?

0 个答案:

没有答案