2 个表的 2 个记录之间的计算需要扩展到超过 1300 个字段。如何以及哪个数据库可以实现这一目标?
Calculations between 2 records of 2 tables need to extend to more then 1300 fields. How and which database can achieve this?
对于我们的一个项目,我们正在使用 PostgreSQL 并访问两个 table,由于性能优势,它们具有复杂的 SQL 计算。
每个 table,让我们称它们为 TableA
和 TableB
,有 1301 个双精度类型的字段(字段数量受 PostgreSQL 限制!)字段名称对于 TableA
是:id
、A1
、A2
、...、A1300
对于 TableB
:id
、B2
, ..., B1300
.
我们正在使用许多动态变化的公式,这些公式可以通过简单的 id
连接直接访问两个 table,对记录中的数字数据进行计算。
示例公式为:A99 * ((A1 * B3) / (B5 * B88))
所以程序可以简单地采用公式并直接在其 SQL 中使用它,例如:
select A99 * ((A1 * B3) / (B5 * B88)) as ResultValue
from TableA A
join TableB B on A.id = B.id
这在对 2 个索引 table 的 1 个数据库请求中工作得很快。
但是随着时间的推移,系统已经长大,所有可用的字段都用完了。
现在,要求是对使用的字段数量几乎没有限制,以在 2 table 秒的 SQL select
中容纳更长更复杂的计算.
我必须承认,我对许多其他新数据库系统及其解决此类问题的能力知之甚少。是否有数据库支持这样的概念或其他方式在数据库中完成这些计算?
旧的方式暂时很灵活,但是有没有更高效的方式来实现同样的逻辑呢?
将数据动态读出到程序中,对其进行解析和计算可能需要更长的时间。
我还认为仅使用另一个允许使用超过 1300 个字段定义 tables 的数据库将是一个短期解决方案,直到我们需要更多字段。
作为我上面评论的示例,对每个值使用数组而不是离散字段:
create table tablea (
id int not null,
a numeric[]
);
create table tableb (
id int not null,
b numeric[]
);
insert into tablea
select 2, array (select generate_series(1,10000));
insert into tableb
select 2, array (select generate_series(1,10000));
select
A[99] * ((A[1] * B[3]) / (B[5] * B[88]))
from
tablea
join tableb on
tablea.id = tableb.id
where
tablea.id = 2;
对于我们的一个项目,我们正在使用 PostgreSQL 并访问两个 table,由于性能优势,它们具有复杂的 SQL 计算。
每个 table,让我们称它们为 TableA
和 TableB
,有 1301 个双精度类型的字段(字段数量受 PostgreSQL 限制!)字段名称对于 TableA
是:id
、A1
、A2
、...、A1300
对于 TableB
:id
、B2
, ..., B1300
.
我们正在使用许多动态变化的公式,这些公式可以通过简单的 id
连接直接访问两个 table,对记录中的数字数据进行计算。
示例公式为:A99 * ((A1 * B3) / (B5 * B88))
所以程序可以简单地采用公式并直接在其 SQL 中使用它,例如:
select A99 * ((A1 * B3) / (B5 * B88)) as ResultValue
from TableA A
join TableB B on A.id = B.id
这在对 2 个索引 table 的 1 个数据库请求中工作得很快。 但是随着时间的推移,系统已经长大,所有可用的字段都用完了。
现在,要求是对使用的字段数量几乎没有限制,以在 2 table 秒的 SQL select
中容纳更长更复杂的计算.
我必须承认,我对许多其他新数据库系统及其解决此类问题的能力知之甚少。是否有数据库支持这样的概念或其他方式在数据库中完成这些计算?
旧的方式暂时很灵活,但是有没有更高效的方式来实现同样的逻辑呢?
将数据动态读出到程序中,对其进行解析和计算可能需要更长的时间。
我还认为仅使用另一个允许使用超过 1300 个字段定义 tables 的数据库将是一个短期解决方案,直到我们需要更多字段。
作为我上面评论的示例,对每个值使用数组而不是离散字段:
create table tablea (
id int not null,
a numeric[]
);
create table tableb (
id int not null,
b numeric[]
);
insert into tablea
select 2, array (select generate_series(1,10000));
insert into tableb
select 2, array (select generate_series(1,10000));
select
A[99] * ((A[1] * B[3]) / (B[5] * B[88]))
from
tablea
join tableb on
tablea.id = tableb.id
where
tablea.id = 2;