我正在开发一个记录数十亿的应用程序,我需要进行一个需要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
);
情境:
用户将选择来源,假设来源ID(1,2,3)
我们需要获取针对事件时间范围的来源多次发生的所有事件
相同的事件标准(相同的platenumber,platecodeId,platestateId,plateCountryId)
我已准备好执行上述操作的查询,但需要很长时间才能执行。
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
您能为它推荐优化查询吗?
答案 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
来查看正在使用的算法。