-1

我想读取数据以进行报告。目前,我使用另一个表的计算数据填充一个表,并从填充的表中读取数据以进行报告。我目前的逻辑是删除旧数据并插入新数据,所有这些都在一个事务中。

更新

要求

1)下面的逻辑是每秒运行一次。请注意,其他进程也会以相同的刷新率更新 tableB。

2) 表 B 用于报告目的。TableA 和 TableB 位于不同的数据库中。

3) TableB 包含大约 1000 万行,大约 400 万行将由下面的代码每秒更新一次。其他进程也以相同的刷新率更新tableB中的其他部分数据(6 = 10-4百万)。

我担心的是:

1) 三个语句使用相似的 sum 和 where 子句,可能会有所改进。

2)tablea中大约有1-2百万行要更新到tableB。使用显式临时表可能会减慢速度。

3)使用事务可能会减慢,但这似乎是唯一的方法。

4)更新数据可能是比删除和插入更好的选择(我应该选择哪一个?)

我想找到一种更好的性能方式(包括重新设计表格等)。下面是目前的方式:

下面的伪代码:

start/begin transaction here    

DELETE from tableb data that I want to insert below, e.g. delete data where Code = 'code'


INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, price)
FROM tablea a
GROUP BY a.Code;

IINSERT INTO tableb(Code, Total)
SELECT sum(a.Code price)   -- use price
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;

INSERT INTO tableb(Code, Total)
SELECT sum(a.Code, meanPrice )   -- use meanPrice
FROM tablea a
WHERE a.meanPrice IS NOT NULL
GROUP BY a.Code;


Commit transaction here

它适用于 MySQL,但理想情况下它应该是通用的。

任何的想法?

4

3 回答 3

2

你真的需要更新表中的值吗?它们没有用任何 id 或名称标记来识别它们。

以下 SELECT 语句返回您想要的数据:

SELECT code,
       sum(price),
       sum(case when a.meanPrice is not null then price else 0 end),
       sum(case when a.meanPrice is not null then meanprice else 0 end)
FROM tablea a
GROUP BY a.Code;

如果您需要将其插入到临时表中,您可以取消透视数据。但是,这种格式对我来说没有意义。您能解释一下为什么要以这种方式使用带有一个数字列的表格吗?

于 2012-07-26T20:57:49.813 回答
1

第 3 点是错误的。

解决方案 1:创建存储过程。

解决方案 2:在受影响的表上创建触发器。

解决方案3:不要每次都求和,第一次求和,然后将数字保存在另一个表中。在这张表的每一次修改中,对你的新表求和,我不会有 100 万条记录,每张表只有一条。

数据透视表!

于 2012-07-26T20:42:14.107 回答
1

此查询INSERT分 1 步完成您的任务,但是......孩子们,如果没有实际测量实际性能,请不要在家中执行此操作:

http://sqlfiddle.com/#!2/381e2/9

INSERT INTO tableb(Total)
SELECT
  CASE
    WHEN t.v = 1
    THEN SUM( price )

    WHEN t.v = 2
    THEN SUM(
           CASE
           WHEN meanPrice IS NOT NULL THEN price
           ELSE 0
           END
         )

    WHEN t.v = 3
    THEN SUM( meanPrice )
  END AS Total

FROM tablea

INNER JOIN
  ( SELECT 1 AS v UNION ALL
    SELECT 2 AS v UNION ALL
    SELECT 3 AS v
  ) AS t

GROUP BY tablea.Code, t.v;
于 2012-07-26T20:52:44.767 回答