Привет! Я использую Apache Phoenix для запроса sql через hbase.
Схема таблицы
CREATE TABLE TABLE_1 (
SF_ID VARCHAR NOT NULL,
ENTITY_ID VARCHAR NOT NULL,
PRODUCT_SKU VARCHAR,
CITY_NAME VARCHAR,
SCREEN_NAME VARCHAR,
PRODUCT_LIST_VIEWS BIGINT,
PRODUCT_LIST_CLICKS BIGINT,
PRODUCT_LIST_CTR FLOAT,
TIMESTAMP BIGINT NOT NULL,
POS INTEGER NOT NULL,
CONSTRAINT pk PRIMARY KEY (SF_ID, ENTITY_ID, TIMESTAMP, POS));
Я создал вторичный индекс следующим образом: -
CREATE INDEX GA_2 ON TABLE_1 (ENTITY_ID) INCLUDE (PRODUCT_LIST_VIEWS, PRODUCT_LIST_CLICKS, PRODUCT_LIST_CTR);
Но следующий запрос занимает от 1,5 с до 2 с при работе на строках 500 000.
select ENTITY_ID as "entityId", sum(PRODUCT_LIST_VIEWS) as "productViewSum", sum(PRODUCT_LIST_CLICKS) as "productClickSum", sum(PRODUCT_LIST_CTR) as "productCTRSum" from "TABLE_1" group by ENTITY_ID;
План объяснения следующий: -
CLIENT 1-CHUNK 0 ROWS 0 BYTES PARALLEL 1-WAY FULL SCAN OVER GA_2
SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY ["ENTITY_ID"]
Есть ли способ улучшитьвремя ответа на запрос?
/ ******************************************** /
Обновление: - Исходя из плана объяснения, я создал соленую таблицу с 12 ведрами.
Теперь план объяснения следующий: -
+-------------------------------------------------------------------+----------+
| PLAN | EST_BYTE |
+-------------------------------------------------------------------+----------+
| CLIENT 12-CHUNK PARALLEL 12-WAY FULL SCAN OVER GA_3 | null |
| SERVER AGGREGATE INTO ORDERED DISTINCT ROWS BY ["ENTITY_ID"] | null |
| CLIENT MERGE SORT | null |
+-------------------------------------------------------------------+----------+
Но время отклика все равно.
Заметил еще одну вещь: -
Если я не использую сумму в моем ответе, ответ довольно быстрый.
Например,
select ENTITY_ID, SUM(PRODUCT_LIST_VIEWS) from GA_TABLE_2 where SF_ID = '1' group by ENTITY_ID;
этот запрос занял 631 мс
, но
select ENTITY_ID from GA_TABLE_2 where SF_ID = '1' group by ENTITY_ID;
это заняло всего 30 мс.