当前位置: 首页 > 知识库问答 >
问题:

Apache Phoenix查询性能改进

闾丘德业
2023-03-14

我们正在尝试使用Apache Phoenix驱动程序来提高HBase设置的读取性能,以对抗约1150万条记录的数据集。

HBase 0.98
Apache Phoenix driver 4.3.1
Squirrel Client 3.2

该表由21列组成,下面是DDL语句:

create table *table_name* (PKEY BIGINT not null primary key,DATE_KEY BIGINT,TIMEOFDAY_KEY BIGINT,GMT_TZ_PKEY BIGINT,FACT_DATE TIMESTAMP,PAGE_KEY BIGINT,FFER_KEY BIGINT,OFFER_TYPE_KEY BIGINT,SESSION_KEY BIGINT,CUSTOMER_KEY BIGINT,VISITS_CNTR BIGINT,ELIGIBLE_CNTR smallint,  PRESENTED_CNTR smallint,ACCEPTED smallint,  ACCEPTED_CLICK smallint,FIRST_RESPONSE_CNTR smallint,REJECTED_CNTR smallint,IS_FIXED smallint,  IGNORED_CNTR smallint,ENGAGED_CNTR smallint,CONVERTED_CNTR smallint)

我们已经对表执行了salting(salt buckets=3),并在所有列上创建了一个辅助索引(不可变索引)。

我们执行以下查询,相应的时间如Squirrel客户机所述:

Select count(*) from *table_name* :   
Query Time (A) = 0.031 s  
Transport time (B) = 2.631 s  
Total Execution Time (A+B)  = 2.661 s  

执行计划:

PLAN  
CLIENT 6-CHUNK PARALLEL 6-WAY 
FULL SCAN OVER OFR_FCT_IDX_SALTED  
SERVER FILTER BY FIRST KEY ONLY  
SERVER AGGREGATE INTO SINGLE ROW  
CLIENT 100 ROW LIMIT

select MAX(session_key) from *table_name* group by TIMEOFDAY_KEY having count(SESSION_KEY) > 100 order by TIMEOFDAY_KEY : Rows returned 431   
Query Time (A) = 0.04 s  
Transport time (B) = 11.894 s  
Total Execution Time (A+B)  = 11.934 s 

执行计划:

PLAN  
CLIENT 6-CHUNK PARALLEL 6-WAY FULL SCAN OVER OFR_FCT_IDX_SALTED  
SERVER FILTER BY FIRST KEY ONLY  SERVER AGGREGATE INTO DISTINCT ROWS BY ["TIMEOFDAY_KEY"]  
CLIENT MERGE SORT  
CLIENT FILTER BY COUNT(TO_BIGINT("SESSION_KEY")) > 100  
CLIENT SORTED BY ["TIMEOFDAY_KEY"]

如您所见,查询时间很长,但传输时间(读取/输出时间)似乎相当长。

我的问题如下:

  1. 这些结果是否与我们对所提到的数据集的预期一致?考虑最新性能测试结果:最新性能测试
  2. 我们能以某种方式进一步提高传输时间(读取时间)的性能吗?

共有1个答案

殳越
2023-03-14

至少升级到Apache Phoenix4.7,显然,他们开始使用protobuf作为默认的序列化方法(通过JSON)。

 类似资料:
  • 问题内容: 有没有一种方法可以改善这种SQL查询性能: 问题是当我的表中有许多数据(如百万行)时,子句的执行非常慢。我必须执行此验证,因为我无法插入重复的数据。 我使用SQLServer 2005 谢谢 问题答案: 确保您正在搜索索引列,而没有操纵这些列中的数据(例如子字符串等)

  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果

  • 我正在使用jaydebeapi(Mac OS X)查询Netezza数据库,并执行一些快速/肮脏的计时: 完成大约需要10分钟(平均超过10次)。 现在,当我使用WinSQL(Windows7,ODBC)运行相同的SQL查询时,返回数据大约需要3分钟。我似乎不明白为什么在Python中要花这么长的时间,也不确定如何或从哪里开始寻找。

  • 问题内容: 我在繁忙的数据库上有一个存储过程,该数据库在某种程度上一直在昂贵的查询列表中排在首位。该查询非常简单,它采用单个参数(@ ID,int)作为表的主键,并选择与该ID匹配的记录。主键是带有聚簇索引的身份字段,所以我很困惑如何进一步优化它? 查询如下 不确定发布执行计划的最佳方法-显示的全部内容是聚集索引扫描占用了100%的操作 问题答案: 我认为通过使用您,您将获得次优的计划。将其分为2

  • 问题内容: 我正在为创建的2个模型的终结点/项目的输出构建REST API: 项目: 参加者: 可以说,我有10个项目:(1个查询) 我遍历了所有10个人,但我也希望所有参与者: 因此,在循环结束时,Phalcon对每个项目进行了额外的查询。 这些查询是通过访问$ result->参与者进行的,同时迭代了10个项目: 题 有没有一种方法可以事先查询关系,因此将是一个查询。 当我使用Phalcon提

  • 问题内容: 我不太擅长SQL,因此我要求你们提供有关编写查询的帮助。 [SQL查询-表连接问题]https://codingdict.com/questions/208252) 我得到了答案,并且可以正常工作!它只是明显的缓慢。我讨厌这样做,但是我真的希望有人在那里推荐一些优化查询的方法。我什至没有自己尝试过,因为我对SQL不够了解,甚至无法开始使用谷歌搜索。 问题答案: 可能有帮助的是在要加入的