针对SQLite中的大型数据集优化JOIN

时间:2019-07-15 19:24:06

标签: sqlite query-optimization

我需要创建一个表,其中包含来自大型数据集(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)
)

0 个答案:

没有答案