GroupBy查询十亿条记录 - Vertica

时间:2018-04-03 08:31:37

标签: sql vertica

我正在开发一个记录数十亿的应用程序,我需要进行一个需要GroupBy子句的查询。

表架构:

  CREATE TABLE event (
  eventId INTEGER PRIMARY KEY,
  eventTime INTEGER NOT NULL,
  sourceId INTEGER NOT NULL,
  plateNumber VARCHAR(10) NOT NULL,
  plateCodeId INTEGER NOT NULL,
  plateCountryId INTEGER NOT NULL,
  plateStateId INTEGER NOT NULL
);


    CREATE TABLE source (
  sourceId INTEGER PRIMARY KEY,
  sourceName VARCHAR(32) NOT NULL
);

情境:

  1. 用户将选择来源,假设来源ID(1,2,3)

  2. 我们需要获取针对事件时间范围的来源多次发生的所有事件

  3. 相同的事件标准(相同的platenumber,platecodeId,platestateId,plateCountryId)

  4. 我已准备好执行上述操作的查询,但需要很长时间才能执行。

        select plateNumber, plateCodeId, plateStateId, 
        plateCountryId, sourceId,count(1) from event 
        where sourceId in (1,2,3) 
        group by sourceId, plateCodeId, plateStateId,
        plateCountryId, plateNumber
       having  count(1) > 1 limit 10 offset 0
    

    您能为它推荐优化查询吗?

1 个答案:

答案 0 :(得分:1)

由于您没有提供投影DDL,我假设投影是默认的并由CREATE TABLE声明创建

您的目标是使用GROUPBY PIPELINED算法而不是GROUPBY HASH,后者通常较慢并且消耗更多内存。 为此,您需要按表group by子句中的列对表格(' s投影)进行排序。

此处有更多信息:GROUP BY Implementation Options

CREATE TABLE event (
  eventId INTEGER PRIMARY KEY,
  eventTime INTEGER NOT NULL,
  sourceId INTEGER NOT NULL,
  plateNumber VARCHAR(10) NOT NULL,
  plateCodeId INTEGER NOT NULL,
  plateCountryId INTEGER NOT NULL,
  plateStateId INTEGER NOT NULL
)
ORDER BY sourceId,
         plateCodeId,
         plateStateId,
         plateCountryId,
         plateNumber;

您可以在查询之前添加EXPLAIN来查看正在使用的算法。