SQL移动到垂直记录

时间:2010-10-28 15:43:21

标签: sql informix

我在Informix v11.10中有一个表(200万行),复制(50+节点)环境

基本布局如下:
ID(PK)(int)
师(int)
公司(int)
feature1 char(20)
feature2 int
...
功能200字符(2)

我目前的布局有几个问题: 此记录有200个“功能”,但在任何给定时间可能有5-10个不是默认/ null(每个记录都不同)。

更新公司的所有记录有时意味着更新100k行会导致复制并且不易管理。

所以我改变了一个像这样的表:
ID(int)
ID_TYPE(ID,部门或公司)
FEATURE_NAME
Feature_value

另一张桌子只有:
ID(int)
师(int)
公司(国际)

因此,对于ID#1,表中将有10行,相关的部门可能有一些记录,公司可能会有一些。 ID记录将“覆盖”具有与该部门匹配的相同feature_name的任何记录,并且部门将覆盖任何公司。

我创建了一个函数,当你传入一个ID和一个feature_name时,它会根据公司进行查询,然后查询除法,然后根据ID,并根据上面的覆盖逻辑返回特征值。 (基本上是一个有序的foreach循环)

然后我创建了一个看起来像的视图:
选择
    my_func(feature1,ID)as feature1
    my_func(feature2,ID)as feature2
    ...
    my_func(feature200,ID)as feature200
从表

现在的问题是,我正在为每个功能敲击200 * 3(用于ID,公司,部门)时间,这些功能无法正常工作,它会占用CPU。新记录数量约为2000万,占用的空间更少。

有什么想法?我觉得我错过了某个临时表的使用,这使得它不需要在600万行表中使用600次。

2 个答案:

答案 0 :(得分:1)

您不应该为每个功能敲击200 * 3,但对于视图的每一行 - 这是因为您的视图包含每行200次my_func调用(每个功能一次)。

这引出了一个问题:您是否需要同时访问所有200个功能?从问题中所写的内容来看,似乎任何给定的ID都可能只使用一小部分功能 - 任何特定于特定功能的查询都应该直接访问my_func(而不是通过视图)特征

另一方面,在必须检索所有200个功能的情况下,基于对my_func的200次调用的视图将保证每行检索600次逻辑访问。相反,我建议重写视图以直接访问要素表,按ID分组以及由MAX(CASE WHEN ...类型结构派生的每个要素。这仍然会导致600个物理行被读取,但对于返回的每个视图行,最多只能有3个逻辑读取 - 我希望这会有更好的表现。

答案 1 :(得分:0)

我的常识告诉我你应该规范化为两个单独的表。