哪个sql在Hbase上用凤凰更好?

时间:2015-02-15 02:26:04

标签: hbase phoenix

我在Hbase上用凤凰制作了两张桌子。

一个是ORIGIN_LOG,另一个是ORIGIN_LOG_INDEX。

在ORIGIN_LOG中,键是info_key。 在ORIGIN_LOG_INDEX中,键是(log_t,zone)

我们在ORIGIN_LOG_INDEX中保存log_t,zone,info_key,这样我们就可以通过ORIGIN_LOG_INDEX中的log_t和zone非常快速地搜索info_key。然后使用info_key,我们可以通过info_key从ORIGIN_LOG获取详细日志信息,因为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) |

如果我们只使用条件log_t和zone的ORIGIN_LOG,如下所示:

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更适合性能。

谢谢。

的BR

1 个答案:

答案 0 :(得分:2)

您的第一个查询是ORIGIN_LOG_INDEX上HBase的范围基础扫描,然后是ORIGIN_LOG上的获取。 您的第二个查询是HBase中基于范围的扫描,您可以在其中为扫描提供“startkey”和“endkey”。 第二个查询要好得多,因为您要避免查找另一个表,并且您也没有进行明确的操作 但是,startKey和endkey范围可能跨越整个表。因此,扫描的最坏情况是“FULL TABLE”扫描。 因此,我认为,解释计划将其显示为全表扫描。也许,您可以在邮件列表上询问进一步的说明。