Hbase apache phoenix范围扫描比完全扫描慢

Hbase apache phoenix范围扫描比完全扫描慢,hbase,phoenix,Hbase,Phoenix,我正试图在我们的平台上优化使用ApachePhoenix和HBase的性能。一个关键查询,称为Q,需要两个表之间的联接,我们称它们为X和Y。X包含15000000行,Y包含20000行 Q的解释计划如下: 客户端22块并行22路X上全扫描 一些过滤 某些聚合客户端合并排序 并行内连接表0 在Y[11000000433043]-[11000000433115]上对2个键进行客户端单块并行单向跳过扫描 一些过滤 我设计了另一个查询,称之为Q*,它创建了与Q相同的输出,并利用了Phoenix的跳过扫描

我正试图在我们的平台上优化使用ApachePhoenix和HBase的性能。一个关键查询,称为Q,需要两个表之间的联接,我们称它们为X和Y。X包含15000000行,Y包含20000行

Q的解释计划如下:

客户端22块并行22路X上全扫描 一些过滤
某些聚合客户端合并排序
并行内连接表0
在Y[11000000433043]-[11000000433115]上对2个键进行客户端单块并行单向跳过扫描
一些过滤

我设计了另一个查询,称之为Q*,它创建了与Q相同的输出,并利用了Phoenix的跳过扫描

这样做的目的是先确定执行查询所需的主键,然后将Q修改为Q*,以便Phoenix可以确定在必要的主键范围内使用Skip Scan

Q*的解释计划如下:

客户端13块并行13路跳过扫描X上的1个范围
[10100000034326,4]-[101000002330223,4]
一些过滤
某些聚合客户端合并排序
并行内连接表0
在Y[11000000433043]-[11000000433115]上对2个键进行客户端单块并行单向跳过扫描
一些过滤

然而,在测试这两个查询的性能时,我发现Q*平均耗时约为Q的1.5倍。
结果:

Q*结果:平均值:9739 |最小值:9174 |最大值:11117

Q结果:平均值:6393 |最小值:6128 |最大值:6966

我可以看出Q*使用的线程比Q少,但这是有道理的,因为Q*读取的块比Q少。所以我不认为这是原因

然而,确定Q*主键范围所需的操作(这也是一个phoenix查询)可能是罪魁祸首,但我不相信

任何关于Phoenix内部工作原理的见解,如果能够解释为什么在看似更高效的HBase操作中缺乏改进的性能,我们都将不胜感激

下面是phoenix查询Q和Q*的示例

提前谢谢

问:

选择AH.date,
M.groupKey,啊,classType,
啊,prodType,啊,liabType,啊,feeType,
货币、金额(应计金额),
总和(AH.累计值),总和(AH.总价值),
金额(AH.mktValue),金额(AH.cashFlowAmt),
金额(AH.wtCashFlowAmt),金额(0)为金额
从**X**AH加入**Y**M
关于M.accountKey=AH.accountKey
其中M.groupKey(1100000043304311000000433115)
和AH.accountKey=M.accountKey
和类类型=4
日期>20021231
以及日期20021231

date MergeSort告诉我,您可能需要查看查询提示并调整连接类型以优化phoenix查询。MergeSort告诉我,您可能需要查看查询提示并调整连接类型以优化phoenix查询。
SELECT  AH.date,   
    M.groupKey,     AH.classType,   
    AH.prodType,     AH.liabType,     AH.feeType,   
    AH.currency,     SUM(AH.feeAccrued),   
    SUM(AH.accruedAmt),     SUM(AH.totalMktValue),   
           SUM(AH.mktValue),     SUM (AH.cashFlowAmt),   
           SUM(AH.wtCashFlowAmt),     SUM(0) AS uvAmount  
         FROM **X** AH   JOIN **Y** M   
         ON M.accountKey       = AH.accountKey  
         WHERE M.groupKey IN (11000000433043,11000000433115)  
         AND AH.accountKey   =M.accountKey  
         AND classType= 4  
         AND AH.date > 20021231  
         AND AH.date <= 20171030     
         AND (AH.deleteFlag IS NULL OR AH.deleteFlag = 'N')   
         AND AH.reconFlag = 'Y'  AND AH.reconActivity = 'Y'   
          AND M.etlTag = 'TEST'   
         GROUP BY AH.date,   
           M.groupKey ,     AH.classType,   
           AH.prodType,     AH.liabType,     AH.feeType,   
           AH.liabType,AH.currency  
SELECT  AH.date,   
    M.groupKey,     AH.classType,   
    AH.prodType,     AH.liabType,     AH.feeType,   
    AH.currency,     SUM(AH.feeAccrued),   
    SUM(AH.accruedAmt),     SUM(AH.totalMktValue),   
           SUM(AH.mktValue),     SUM (AH.cashFlowAmt),   
           SUM(AH.wtCashFlowAmt),     SUM(0) AS uvAmount  
         FROM **X** AH   JOIN **Y** M   
         ON M.accountKey       = AH.accountKey  
         WHERE M.groupKey IN (11000000433043,11000000433115)  
         AND AH.accountKey   =M.accountKey  
         ***AND AH.accountKey <= 10100002330223   
         AND AH.accountKey >= 10100000034326***  
         AND classType= 4  
         AND AH.date > 20021231  
         AND AH.date <= 20171030     
         AND (AH.deleteFlag IS NULL OR AH.deleteFlag = 'N')   
         AND AH.reconFlag = 'Y'  AND AH.reconActivity = 'Y'   
          AND M.etlTag = 'TEST'   
         GROUP BY AH.date,   
           M.groupKey ,     AH.classType,   
           AH.prodType,     AH.liabType,     AH.feeType,   
           AH.liabType,AH.currency