Hbase apache phoenix范围扫描比完全扫描慢
我正试图在我们的平台上优化使用ApachePhoenix和HBase的性能。一个关键查询,称为Q,需要两个表之间的联接,我们称它们为X和Y。X包含15000000行,Y包含20000行 Q的解释计划如下: 客户端22块并行22路X上全扫描 一些过滤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的跳过扫描
某些聚合客户端合并排序
并行内连接表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