Я делаю две таблицы phoenix на Hbase.
Один ORIGIN_LOG, другой ORIGIN_LOG_INDEX.
В ORIGIN_LOG ключом является info_key. В ORIGIN_LOG_INDEX ключ (log_t, зона)
И мы сохраняем log_t, zone, info_key в ORIGIN_LOG_INDEX, чтобы мы могли очень быстро искать info_key по log_t и zone в ORIGIN_LOG_INDEX. Затем, используя info_key, мы можем получить подробную информацию журнала из ORIGIN_LOG по info_key, потому что info_key является ключом для ORIGIN_LOG.
Но когда мы объясним следующий sql. мы обнаружили, что полное сканирование ORIGIN_LOG будет стоить.
explain select "log_t", "app_ver", "device_id", "mobage_uid", "param1","param2","param3", "param4" , "param5", "user_id", "a_typ", "a_tar", "a_rst" from "ORIGIN_LOG" where "info_key" in (select distinct "info_key" from "ORIGIN_LOG_INDEX" where "log_t">='1423956600' and "log_t"<'1423956601' and "zone" ='18')
CLIENT 4-CHUNK PARALLEL 4-WAY FULL SCAN OVER ORIGIN_LOG
CLIENT MERGE SORT |
| SKIP-SCAN-JOIN TABLE 0 |
| CLIENT 2-CHUNK PARALLEL 2-WAY SKIP SCAN ON 2 RANGES OVER
ORIGIN_LOG_INDEX [0,'1423956600','18'] - [1,'1423956601','18'] |
| SERVER FILTER BY FIRST KEY ONLY |
| SERVER AGGREGATE INTO DISTINCT ROWS BY [info_key] |
| CLIENT MERGE SORT |
| DYNAMIC SERVER FILTER BY info_key IN ($5.$7) |
Если мы используем только ORIGIN_LOG с условиями log_t и zone, как показано ниже:
select "log_t", "app_ver", "device_id", "mobage_uid", "param1","param2","param3", "param4" , "param5", "user_id", "a_typ", "a_tar", "a_rst" from "ORIGIN_LOG" where "log_t">='1423956600' and "log_t"<'1423956601' and "zone" ='18';
Мы также получаем полное сканирование.
CLIENT 4-CHUNK PARALLEL 4-WAY FULL SCAN OVER ORIGIN_LOG |
| SERVER FILTER BY (log_t >= '1423956600' AND log_t < '1423956601' AND zone = '18') |
| CLIENT MERGE SORT |
Итак, в чем разница между двумя sql. И какой sql лучше по производительности.
Спасибо.
БР