现有表1:
年度    指标  指标值
2000-01 A     100
2000-01 B     200
2000-01 C     300
...
2000-02 A     150
2000-02 B     250
2000-02 C     350
... 转换成表2:
年月     A   B   C   ...
2000-01  100 200 300 ...
2000-02  150 250 350 ...
.......表2的列是根据指标数目的多少动态创建的,
显然,如果有100个指标,表2就有1+100列,但数据行则是表1的1/100,
现在不是讨论如何转换的问题,而是想问在数据量比较大的情况下:
1、若要查询某一年月某一指标的值,用哪张表效率更高?
2、表2的列数(即指标数)多少比较合适或者可以承受?
3、当表2列数不断增多(行数不变)时,是否会很明显的影响查询性能?

解决方案 »

  1.   

    谢谢lizhaogui,
    不过大家帮忙的时候最好能有点理论支持,呵呵
    第1问为什么是表1呢?如果指标数100,表1有100万行的话,表2才1万行呀,列数多对查询性能有这么大影响吗?
      

  2.   

    1.如果是只察某一年月某一指标的值,两个表都有索引都没有索引的时候,个人认为,还是表2快
        首先不管表2有多少列,你只察其中的一列时,再有索引的条件下oracle会直接所要的定位到rowid,
        然后,直接找它的哪一列的值,表一也应该相同,但是记录要更多,因此2快。
        我认为在实际应用中,1只是用于记录,2应该是根据1表生成,用于统计
    2.ORACLE最大支持1000列,具体多少列合适,没测试过
    3.只察一列应该没有影响,也没有测试过
      

  3.   

    在数据库性能优化中,尽量少建胖表,多建窄表,
    所谓窄表就是你的表1
    胖表就是你的表2
    建窄表的效率更优。这是数据库优化里面的内容。具体的你可以在sqlplus 里面执行,看他们用的时间和执行路径就知道了。
      

  4.   

    建了两个表作了一下测试,因为指标值的重复数据较多,就没建索引。表1,3列,26种指标,1703936条数据,未建索引,取同一年月的记录要1.25秒,取一个值要1.234秒,全表查询out of memory转换后表2,27列,65536条数据,未建索引,取同一年月的记录要0.36秒,取一个值要0.296秒,全表查询164.391秒
      

  5.   

    讨论的前提应该是两表数据行本身存在一定的联系,即:表2行数=表1行数/指标数,
    如果单独来考虑,毫无疑问应该是如ynwpl(Brave&Heart) 所说窄表效率更优,我自己作了一下测试,不知道有没有参考价值。
    以200个指标,1000个时间点为样本,
    这样用表2存储仅1000行(201列的胖表),而用表1存储有20万行(3列的窄表);
    表2索引PK(年度),表1索引PK(年度,指标)。
    以下为进行各种操作所花费的时间(仅供参考)
    操作方式       表2    表1
    循环方式插入所有数据 10.03  339.85
    单个指标某时间点查询 0.15   0.15
    单个指标某时间段查询 0.19   0.19
    多个指标某时间点查询 0.16   0.19
    多个指标某时间段查询 0.22   1.28
    单个指标某时间段合计 0.16   0.16
    某时间点多个指标合计 0.16   0.16根据以上数据,进行查询统计时两种方式几乎不分上下,
    插入操作由于数据量的较大差异导致时间上的差异,
    如果以插入1000行数据到不同列数的表来测试,
    表2(201列)用时10.03秒
    表2(101列)用时4.84秒
    表1(3列)用时1.81秒