我需要创建一个表,其中包含来自大型数据集(200 GB)的每个客户端每天的运行总计(aka累计总和)。但是,我当前的代码太慢了:它已经运行了好几天,但仍然没有完成。
我的数据来自两个表。订单表通知订单ID和客户ID。交易表格会告知订单ID,日期和状态(状态= 5表示已批准订单,状态= 7表示已拒绝订单)。
CREATE TABLE RunningTotal AS
SELECT DISTINCT Orders.ClientId,
Transactions.Date,
SUM(CASE WHEN Transactions.Status = 5 THEN 1 ELSE -1 END) OVER (PARTITION BY Orders.ClientId ORDER BY Transactions.Date) AS RunTotal
FROM Transactions
LEFT JOIN Orders ON Transactions.Order_Id= Orders.Id
WHERE Transactions.Status IN (5,7)
我使用了一个玩具桌进行测试,我的当前代码提供了预期的结果:每位客户每天获得批准的订单的净运行总额。问题似乎在于如何优化它以与大型数据集一起使用。我可能错了,但我相信我的瓶颈是 JOIN 。如果仅用一个表运行类似的查询,则需要几分钟。
EXPLAIN QUERY PLAN命令给我以下信息:
CO-ROUTINE 3
使用索引idx_trans_status(Status =?)搜索表事务
使用索引IDx_orders_id(Id =?)搜索表订单
使用TEMP B树来订购
扫描子查询3
使用TEMP B树进行区分
使用TEMP B树来订购
编辑:
输出表如下:
CREATE TABLE Transactions (
ClientId INTEGER,
Date DATE,
RunTotal INTEGER
PRIMARY KEY (ClientId, Date)
)
ClientId Date RunTotal
-------- ----------- --------
1 2018-12-28 110
1 2018-12-30 125
3 2018-10-15 87
3 2018-11-22 93
3 2018-11-24 99
“订单”表如下:
CREATE TABLE Orders (
Id INTEGER,
ClientId INTEGER
Class INTEGER,
Recall INTEGER,
Family INTEGER,
CreationDate DATE,
DeletionDate DATE,
Level INTEGER,
Notes TEXT,
Tags TEXT,
Operator_ID INTEGER,
Node INTEGER,
PRIMARY KEY (Id)
)
“交易”表如下:
CREATE TABLE Transactions (
Id INTEGER,
Order_Id INTEGER,
Date DATE,
Status INTEGER,
Amount INTEGER,
Operator_ID INTEGER,
Notes TEXT,
PRIMARY KEY (Id)
)