如何發(fā)起實(shí)時(shí)數(shù)倉(cāng)Hologres性能壓測(cè)
本文為您介紹如何通過(guò)阿里云性能測(cè)試PTS對(duì)Hologres的性能進(jìn)行壓測(cè),幫助您快速驗(yàn)證Hologres的性能。
背景信息
Hologres是兼容PostgreSQL協(xié)議的實(shí)時(shí)交互式分析引擎,可以使用pgbench工具對(duì)其進(jìn)行性能測(cè)試,詳情請(qǐng)參見(jiàn)測(cè)試方案介紹。但測(cè)試過(guò)程可能會(huì)受到網(wǎng)絡(luò)、測(cè)試參數(shù)配置等多方面因素的干擾,導(dǎo)致測(cè)試結(jié)果受到影響。測(cè)試環(huán)境的搭建也需要花費(fèi)較多精力。
阿里云性能測(cè)試PTS(Performance Testing Service)是一個(gè)具備分布式壓測(cè)能力的SaaS壓測(cè)平臺(tái),可以模擬復(fù)雜的測(cè)試場(chǎng)景,并快速精準(zhǔn)地調(diào)度不同規(guī)模的流量,同時(shí)提供壓測(cè)過(guò)程中多維度的監(jiān)控指標(biāo)和日志記錄。您無(wú)需準(zhǔn)備資源,即可按需發(fā)起壓測(cè)任務(wù)、監(jiān)控壓測(cè)指標(biāo)和獲取壓測(cè)報(bào)告,進(jìn)而高效率、全方位地驗(yàn)證產(chǎn)品性能。關(guān)于性能測(cè)試PTS的詳細(xì)信息請(qǐng)參見(jiàn)什么是性能測(cè)試PTS。
前提條件
- 已購(gòu)買(mǎi)并開(kāi)通Hologres實(shí)例,開(kāi)通方法請(qǐng)參見(jiàn)購(gòu)買(mǎi)Hologres。
- 已開(kāi)通性能測(cè)試PTS,詳情請(qǐng)參見(jiàn)開(kāi)通方式。推薦使用按量抵扣(預(yù)付費(fèi))-內(nèi)網(wǎng)專享版,使用阿里云VPC內(nèi)網(wǎng)進(jìn)行壓測(cè),可以提高測(cè)試結(jié)果準(zhǔn)確性、降低測(cè)試成本,詳情請(qǐng)參見(jiàn)按量抵扣(預(yù)付費(fèi))。
場(chǎng)景說(shuō)明
- OLAP查詢場(chǎng)景:主要使用列存表,使用TPC-H測(cè)試中的22條查詢語(yǔ)句進(jìn)行測(cè)試。
- Key/Value點(diǎn)查場(chǎng)景:主要使用行存表,針對(duì)ORDERS使用行存表后,進(jìn)行主鍵過(guò)濾的點(diǎn)查。
- 數(shù)據(jù)更新場(chǎng)景:主要用于測(cè)試OLAP引擎在有主鍵的情況下數(shù)據(jù)更新的性能。
- OLAP查詢場(chǎng)景:
1(使用資源IP數(shù),即施壓機(jī)數(shù))×500×110(分鐘)=55000 (VUM)
。 - Key/Value點(diǎn)查場(chǎng)景:
25(使用資源IP數(shù),即施壓機(jī)數(shù))×500×5(分鐘)=62500 (VUM)
。 - 數(shù)據(jù)更新場(chǎng)景:與Key/Value點(diǎn)查場(chǎng)景一致。
本文中的價(jià)格信息僅為示例值,實(shí)際使用過(guò)程中請(qǐng)以產(chǎn)品購(gòu)買(mǎi)頁(yè)價(jià)格為準(zhǔn)。
準(zhǔn)備工作
- OLAP查詢場(chǎng)景:需要?jiǎng)?chuàng)建列存表,從數(shù)據(jù)源中同步數(shù)據(jù),設(shè)計(jì)OLAP查詢測(cè)試語(yǔ)句。
- Key/Value點(diǎn)查場(chǎng)景:需要?jiǎng)?chuàng)建行存表,從數(shù)據(jù)源中同步數(shù)據(jù),設(shè)計(jì)Key/Value點(diǎn)查測(cè)試語(yǔ)句。
- 數(shù)據(jù)更新場(chǎng)景:需要?jiǎng)?chuàng)建表,寫(xiě)入原始數(shù)據(jù),并準(zhǔn)備需要進(jìn)行更新的數(shù)據(jù)。說(shuō)明
- Hologres支持多種數(shù)據(jù)源的數(shù)據(jù)同步,包括MaxCompute數(shù)據(jù)同步、OSS數(shù)據(jù)湖同步、通過(guò)Copy命令導(dǎo)入本地文件、通過(guò)DataWorks同步MySQL等數(shù)據(jù)庫(kù)數(shù)據(jù)等,詳情參見(jiàn)數(shù)據(jù)同步概述。
- 創(chuàng)建Hologres內(nèi)部表的同時(shí),需要為其設(shè)置合適的索引,以獲得最優(yōu)的查詢性能。關(guān)于索引的創(chuàng)建,詳情請(qǐng)參見(jiàn)建表概述。
MAXCOMPUTE_PUBLIC_DATA
中的TPC-H 100 GB數(shù)據(jù)寫(xiě)入Hologres,作為本實(shí)踐的測(cè)試數(shù)據(jù)。OLAP查詢場(chǎng)景
- 測(cè)試數(shù)據(jù)準(zhǔn)備Hologres支持連接多種開(kāi)發(fā)工具,您可以使用HoloWeb登錄Hologres實(shí)例,創(chuàng)建數(shù)據(jù)庫(kù)并在SQL編輯器中執(zhí)行如下語(yǔ)句,完成內(nèi)部表、外部表的創(chuàng)建和寫(xiě)入測(cè)試數(shù)據(jù)。關(guān)于HoloWeb的簡(jiǎn)介與使用方法,請(qǐng)參見(jiàn)HoloWeb簡(jiǎn)介。
- 創(chuàng)建外部表。
DROP FOREIGN TABLE IF EXISTS odps_customer_100g; DROP FOREIGN TABLE IF EXISTS odps_lineitem_100g; DROP FOREIGN TABLE IF EXISTS odps_nation_100g; DROP FOREIGN TABLE IF EXISTS odps_orders_100g; DROP FOREIGN TABLE IF EXISTS odps_part_100g; DROP FOREIGN TABLE IF EXISTS odps_partsupp_100g; DROP FOREIGN TABLE IF EXISTS odps_region_100g; DROP FOREIGN TABLE IF EXISTS odps_supplier_100g; IMPORT FOREIGN SCHEMA "MAXCOMPUTE_PUBLIC_DATA#default" LIMIT to ( odps_customer_100g, odps_lineitem_100g, odps_nation_100g, odps_orders_100g, odps_part_100g, odps_partsupp_100g, odps_region_100g, odps_supplier_100g ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
- 創(chuàng)建內(nèi)部表。OLAP場(chǎng)景測(cè)試需要使用列存表(默認(rèn)即為列存),還需要?jiǎng)?chuàng)建合適的索引以達(dá)到更優(yōu)的查詢性能。更多關(guān)于表屬性的信息請(qǐng)參見(jiàn)建表概述。
DROP TABLE IF EXISTS LINEITEM; BEGIN; CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ); CALL set_table_property('LINEITEM', 'clustering_key', 'L_SHIPDATE,L_ORDERKEY'); CALL set_table_property('LINEITEM', 'segment_key', 'L_SHIPDATE'); CALL set_table_property('LINEITEM', 'distribution_key', 'L_ORDERKEY'); CALL set_table_property('LINEITEM', 'bitmap_columns', 'L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT'); CALL set_table_property('LINEITEM', 'dictionary_encoding_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT'); COMMIT; DROP TABLE IF EXISTS ORDERS; BEGIN; CREATE TABLE ORDERS ( O_ORDERKEY BIGINT NOT NULL PRIMARY KEY, O_CUSTKEY INT NOT NULL, O_ORDERSTATUS TEXT NOT NULL, O_TOTALPRICE DECIMAL(15,2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY TEXT NOT NULL, O_CLERK TEXT NOT NULL, O_SHIPPRIORITY INT NOT NULL, O_COMMENT TEXT NOT NULL ); CALL set_table_property('ORDERS', 'segment_key', 'O_ORDERDATE'); CALL set_table_property('ORDERS', 'distribution_key', 'O_ORDERKEY'); CALL set_table_property('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT'); CALL set_table_property('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT'); COMMIT; DROP TABLE IF EXISTS PARTSUPP; BEGIN; CREATE TABLE PARTSUPP ( PS_PARTKEY INT NOT NULL, PS_SUPPKEY INT NOT NULL, PS_AVAILQTY INT NOT NULL, PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, PS_COMMENT TEXT NOT NULL, PRIMARY KEY(PS_PARTKEY,PS_SUPPKEY) ); CALL set_table_property('PARTSUPP', 'distribution_key', 'PS_PARTKEY'); CALL set_table_property('PARTSUPP', 'bitmap_columns', 'PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_COMMENT'); CALL set_table_property('PARTSUPP', 'dictionary_encoding_columns', 'PS_COMMENT'); COMMIT; DROP TABLE IF EXISTS PART; BEGIN; CREATE TABLE PART ( P_PARTKEY INT NOT NULL PRIMARY KEY, P_NAME TEXT NOT NULL, P_MFGR TEXT NOT NULL, P_BRAND TEXT NOT NULL, P_TYPE TEXT NOT NULL, P_SIZE INT NOT NULL, P_CONTAINER TEXT NOT NULL, P_RETAILPRICE DECIMAL(15,2) NOT NULL, P_COMMENT TEXT NOT NULL ); CALL set_table_property('PART', 'distribution_key', 'P_PARTKEY'); CALL set_table_property('PART', 'bitmap_columns', 'P_PARTKEY,P_SIZE,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT'); CALL set_table_property('PART', 'dictionary_encoding_columns', 'P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT'); COMMIT; DROP TABLE IF EXISTS CUSTOMER; BEGIN; CREATE TABLE CUSTOMER ( C_CUSTKEY INT NOT NULL PRIMARY KEY, C_NAME TEXT NOT NULL, C_ADDRESS TEXT NOT NULL, C_NATIONKEY INT NOT NULL, C_PHONE TEXT NOT NULL, C_ACCTBAL DECIMAL(15,2) NOT NULL, C_MKTSEGMENT TEXT NOT NULL, C_COMMENT TEXT NOT NULL ); CALL set_table_property('CUSTOMER', 'distribution_key', 'C_CUSTKEY'); CALL set_table_property('CUSTOMER', 'bitmap_columns', 'C_CUSTKEY,C_NATIONKEY,C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT'); CALL set_table_property('CUSTOMER', 'dictionary_encoding_columns', 'C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT'); COMMIT; DROP TABLE IF EXISTS SUPPLIER; BEGIN; CREATE TABLE SUPPLIER ( S_SUPPKEY INT NOT NULL PRIMARY KEY, S_NAME TEXT NOT NULL, S_ADDRESS TEXT NOT NULL, S_NATIONKEY INT NOT NULL, S_PHONE TEXT NOT NULL, S_ACCTBAL DECIMAL(15,2) NOT NULL, S_COMMENT TEXT NOT NULL ); CALL set_table_property('SUPPLIER', 'distribution_key', 'S_SUPPKEY'); CALL set_table_property('SUPPLIER', 'bitmap_columns', 'S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_COMMENT'); CALL set_table_property('SUPPLIER', 'dictionary_encoding_columns', 'S_NAME,S_ADDRESS,S_PHONE,S_COMMENT'); COMMIT; DROP TABLE IF EXISTS NATION; BEGIN; CREATE TABLE NATION( N_NATIONKEY INT NOT NULL PRIMARY KEY, N_NAME text NOT NULL, N_REGIONKEY INT NOT NULL, N_COMMENT text NOT NULL ); CALL set_table_property('NATION', 'distribution_key', 'N_NATIONKEY'); CALL set_table_property('NATION', 'bitmap_columns', 'N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT'); CALL set_table_property('NATION', 'dictionary_encoding_columns', 'N_NAME,N_COMMENT'); COMMIT; DROP TABLE IF EXISTS REGION; BEGIN; CREATE TABLE REGION ( R_REGIONKEY INT NOT NULL PRIMARY KEY, R_NAME TEXT NOT NULL, R_COMMENT TEXT ); CALL set_table_property('REGION', 'distribution_key', 'R_REGIONKEY'); CALL set_table_property('REGION', 'bitmap_columns', 'R_REGIONKEY,R_NAME,R_COMMENT'); CALL set_table_property('REGION', 'dictionary_encoding_columns', 'R_NAME,R_COMMENT'); COMMIT;
- 測(cè)試數(shù)據(jù)寫(xiě)入并收集統(tǒng)計(jì)信息。
INSERT INTO public.customer SELECT * FROM public.odps_customer_100g ; INSERT INTO public.lineitem SELECT * FROM public.odps_lineitem_100g ; INSERT INTO public.nation SELECT * FROM public.odps_nation_100g ; INSERT INTO public.orders SELECT * FROM public.odps_orders_100g ; INSERT INTO public.part SELECT * FROM public.odps_part_100g ; INSERT INTO public.partsupp SELECT * FROM public.odps_partsupp_100g ; INSERT INTO public.region SELECT * FROM public.odps_region_100g ; INSERT INTO public.supplier SELECT * FROM public.odps_supplier_100g ; -- 清理寫(xiě)入文件 vacuum nation; vacuum region; vacuum supplier; vacuum customer; vacuum part; vacuum partsupp; vacuum orders; vacuum lineitem; -- 收集表的統(tǒng)計(jì)信息 analyze nation; analyze region; analyze lineitem; analyze orders; analyze customer; analyze part; analyze partsupp; analyze supplier; -- 針對(duì)非主鍵的JOIN KEY收集統(tǒng)計(jì)信息 analyze lineitem (l_orderkey,l_partkey,l_suppkey); analyze orders (o_custkey); analyze partsupp(ps_partkey,ps_suppkey);
- 創(chuàng)建外部表。
- 性能測(cè)試
- 登錄PTS控制臺(tái),在左側(cè)導(dǎo)航欄選擇 ,然后單擊PTS壓測(cè)。
- 在場(chǎng)景配置頁(yè)簽單擊HTTP壓測(cè)節(jié)點(diǎn)后的圖標(biāo)刪除HTTP壓測(cè)節(jié)點(diǎn)。說(shuō)明 PTS壓測(cè)場(chǎng)景中的串聯(lián)鏈路指一組壓測(cè)節(jié)點(diǎn)的有序集合。在實(shí)際測(cè)試過(guò)程中,一個(gè)串聯(lián)鏈路內(nèi)的壓測(cè)節(jié)點(diǎn)順序執(zhí)行,不同串聯(lián)鏈路間并行執(zhí)行。在本文的測(cè)試場(chǎng)景中,只需保留一個(gè)串聯(lián)鏈路,通過(guò)配置后續(xù)的并發(fā)數(shù)來(lái)模擬并行場(chǎng)景。
- 在場(chǎng)景配置頁(yè)簽單擊添加壓測(cè)節(jié)點(diǎn)右側(cè)的下拉框,并在下拉列表單擊JDBC壓測(cè)節(jié)點(diǎn),然后在目標(biāo)串聯(lián)鏈路右側(cè)單擊圖標(biāo),并在展開(kāi)區(qū)域配置壓測(cè)API的基本請(qǐng)求信息和連接池配置。
針對(duì)此OLAP查詢場(chǎng)景測(cè)試,TPC-H包含22條查詢語(yǔ)句。可以在同一條串聯(lián)鏈路下創(chuàng)建22個(gè)JDBC節(jié)點(diǎn),如下圖所示代表22條查詢語(yǔ)句。在壓測(cè)過(guò)程中,PTS會(huì)依次循環(huán)執(zhí)行這22條查詢語(yǔ)句。分類 參數(shù) 說(shuō)明 基本請(qǐng)求信息 API名稱 自定義API名稱。 數(shù)據(jù)庫(kù)類型 選擇PostgreSQL。 數(shù)據(jù)庫(kù)URL 格式為: {ENDPOINT}:{PORT}/{DBNAME}
。通過(guò)Hologres管理控制臺(tái)查看實(shí)例配置,建議使用VPC網(wǎng)絡(luò),詳情請(qǐng)參見(jiàn)實(shí)例配置。
示例:
hgpostcn-cn-i7**********-cn-hangzhou-vpc.hologres.aliyuncs.com:80/db_name
。用戶名 當(dāng)前賬號(hào)的AccessKey ID。 您可以單擊AccessKey 管理,獲取AccessKey ID。
密碼 當(dāng)前賬號(hào)的AccessKey Secret。 您可以單擊AccessKey 管理,獲取AccessKey Secret。
SQL 待執(zhí)行的SQL語(yǔ)句,本文使用TPC-H 22條查詢語(yǔ)句,SQL語(yǔ)句詳情請(qǐng)參見(jiàn)TPC-H 22條查詢語(yǔ)句。 超時(shí)時(shí)間 需要結(jié)合待壓測(cè)接口的情況配置單接口的響應(yīng)超時(shí)時(shí)間,本示例取默認(rèn)值。 limit 結(jié)果集最大讀取行數(shù)(僅針對(duì)Select開(kāi)頭的SQL),最大為 1000000
,本示例取默認(rèn)值。連接池配置 初始化連接數(shù) 初始化時(shí)建立物理連接的個(gè)數(shù),本示例設(shè)置為 1
。獲取連接最大等待時(shí)間 從連接池中獲取空閑連接的等待時(shí)間,單位毫秒,本示例設(shè)置為 4000
。最大連接數(shù) 最大活躍連接數(shù)量,本示例設(shè)置為 15
,以匹配單并發(fā)與多并發(fā)多種測(cè)試場(chǎng)景。最小連接數(shù) 池中最小空閑連接數(shù)量,本示例設(shè)置為 1
。 - 在施壓配置頁(yè)簽,配置如下參數(shù),更多施壓配置相關(guān)內(nèi)容請(qǐng)參見(jiàn)壓力來(lái)源(公網(wǎng)和VPC)。
其他施壓配置參數(shù)需要根據(jù)測(cè)試目的的不同進(jìn)行調(diào)整。參數(shù) 說(shuō)明 壓力來(lái)源 本示例選擇阿里云VPC內(nèi)網(wǎng),可以提高測(cè)試結(jié)果準(zhǔn)確性。選擇阿里云VPC內(nèi)網(wǎng)后,選擇地域。 VPC信息 請(qǐng)您根據(jù)實(shí)際情況繼續(xù)選擇VPC、安全組、虛擬交換機(jī)。 壓力模式 本示例選擇并發(fā)模式。 - 使用TPC-H數(shù)據(jù)進(jìn)行OLAP場(chǎng)景測(cè)試,主要關(guān)注的是單條Query的執(zhí)行時(shí)長(zhǎng),參數(shù)配置如下。
參數(shù) 說(shuō)明 最大并發(fā) 本示例設(shè)置為 1
,以確保每條query執(zhí)行時(shí)有充足的資源。遞增模式 由于此處不涉及并發(fā)數(shù)的變化,因此只需保證并發(fā)數(shù)始終為1即可。 壓測(cè)總時(shí)長(zhǎng) 此處涉及22條查詢語(yǔ)句,因此測(cè)試時(shí)長(zhǎng)選擇 110
分鐘。指定IP數(shù) 指發(fā)起壓測(cè)流量的IP地址數(shù)量,即施壓機(jī)數(shù)量。此處只需設(shè)置 1
個(gè)施壓IP。 - 關(guān)注并發(fā)場(chǎng)景下的OLAP查詢性能,參數(shù)配置如下。
選擇22條查詢語(yǔ)句中的5條(Q2、Q6、Q11、Q14、Q15),在測(cè)試過(guò)程中從
3
并發(fā)開(kāi)始,階梯式增加并發(fā)數(shù)至15
。參數(shù) 說(shuō)明 最大并發(fā) 可以設(shè)置為您希望達(dá)到的最高并發(fā),本示例取值 15
。遞增模式 選擇自動(dòng)遞增。 遞增百分比 每次增加并發(fā)時(shí)的增幅,本示例設(shè)為 20%
。單量級(jí)持續(xù)時(shí)長(zhǎng) 每個(gè)并發(fā)數(shù)的測(cè)試時(shí)長(zhǎng),本示例設(shè)為 20
分鐘。壓測(cè)總時(shí)長(zhǎng) 總測(cè)試時(shí)長(zhǎng),本示例設(shè)為 100
分鐘。指定IP數(shù) 指發(fā)起壓測(cè)流量的IP地址數(shù)量,即施壓機(jī)數(shù)量。本示例設(shè)置 1
個(gè)施壓IP。
- 使用TPC-H數(shù)據(jù)進(jìn)行OLAP場(chǎng)景測(cè)試,主要關(guān)注的是單條Query的執(zhí)行時(shí)長(zhǎng),參數(shù)配置如下。
- 單擊下方調(diào)試場(chǎng)景,進(jìn)行場(chǎng)景調(diào)試。調(diào)試場(chǎng)景詳情請(qǐng)參見(jiàn)調(diào)試場(chǎng)景。
- 下圖為一個(gè)正常示例。
- 下圖為一個(gè)異常示例,錯(cuò)誤原因可能是數(shù)據(jù)庫(kù)URL錯(cuò)誤、用戶名密碼錯(cuò)誤等,導(dǎo)致連接失敗。
- 單擊下方保存去壓測(cè)按鈕,選擇立即執(zhí)行后單擊確定,即可開(kāi)始?jí)簻y(cè)。
Key/Value點(diǎn)查場(chǎng)景
- 測(cè)試數(shù)據(jù)準(zhǔn)備Key/Value點(diǎn)查場(chǎng)景繼續(xù)使用OLAP場(chǎng)景創(chuàng)建的數(shù)據(jù)庫(kù),使用TPC-H數(shù)據(jù)集中的
ORDERS
表進(jìn)行測(cè)試。您在登錄Hologres實(shí)例后,可以執(zhí)行如下語(yǔ)句建表并直接從OLAP場(chǎng)景的ORDERS
表中寫(xiě)入數(shù)據(jù)。- 創(chuàng)建內(nèi)部表。Key/Value點(diǎn)查場(chǎng)景測(cè)試需要設(shè)置主鍵并使用行存表,還需要設(shè)置合適的索引以達(dá)到更優(yōu)的查詢性能。更多關(guān)于表屬性的信息請(qǐng)參見(jiàn)建表概述。說(shuō)明 由于點(diǎn)查場(chǎng)景需要使用行存表,所以不能使用OLAP查詢場(chǎng)景中創(chuàng)建的內(nèi)部表,需要重新創(chuàng)建一張內(nèi)部表。
DROP TABLE IF EXISTS public.orders_row; BEGIN; CREATE TABLE public.orders_row( O_ORDERKEY INT NOT NULL PRIMARY KEY ,O_CUSTKEY INT NOT NULL ,O_ORDERSTATUS TEXT NOT NULL ,O_TOTALPRICE DECIMAL(15,2) NOT NULL ,O_ORDERDATE TIMESTAMPTZ NOT NULL ,O_ORDERPRIORITY TEXT NOT NULL ,O_CLERK TEXT NOT NULL ,O_SHIPPRIORITY INT NOT NULL ,O_COMMENT TEXT NOT NULL ); CALL SET_TABLE_PROPERTY('public.orders_row', 'orientation', 'row'); CALL SET_TABLE_PROPERTY('public.orders_row', 'clustering_key', 'o_orderkey'); CALL SET_TABLE_PROPERTY('public.orders_row', 'distribution_key', 'o_orderkey'); COMMIT;
- 寫(xiě)入數(shù)據(jù)
INSERT INTO public.orders_row SELECT * FROM public.orders;
- 創(chuàng)建內(nèi)部表。
- 性能測(cè)試
- 登錄PTS控制臺(tái),在左側(cè)導(dǎo)航欄選擇 ,然后單擊PTS壓測(cè)。
- 在場(chǎng)景配置頁(yè)簽單擊HTTP壓測(cè)節(jié)點(diǎn)后的圖標(biāo)刪除HTTP壓測(cè)節(jié)點(diǎn)。說(shuō)明 PTS壓測(cè)場(chǎng)景中的串聯(lián)鏈路指一組壓測(cè)節(jié)點(diǎn)的有序集合。在實(shí)際測(cè)試過(guò)程中,一個(gè)串聯(lián)鏈路內(nèi)的壓測(cè)節(jié)點(diǎn)順序執(zhí)行,不同串聯(lián)鏈路間并行執(zhí)行。在本文的測(cè)試場(chǎng)景中,只需保留一個(gè)串聯(lián)鏈路,通過(guò)配置后續(xù)的并發(fā)數(shù)來(lái)模擬并行場(chǎng)景。
- 在場(chǎng)景配置頁(yè)簽單擊添加壓測(cè)節(jié)點(diǎn)右側(cè)的下拉框,并在下拉列表單擊JDBC壓測(cè)節(jié)點(diǎn),然后在目標(biāo)串聯(lián)鏈路右側(cè)單擊圖標(biāo),并在展開(kāi)區(qū)域配置壓測(cè)API的基本請(qǐng)求信息、占位符信息和連接池配置。
分類 參數(shù) 說(shuō)明 基本請(qǐng)求信息 API名稱 自定義API名稱。 數(shù)據(jù)庫(kù)類型 選擇PostgreSQL。 數(shù)據(jù)庫(kù)URL 格式為: {ENDPOINT}:{PORT}/{DBNAME}
。通過(guò)Hologres管理控制臺(tái)查看實(shí)例配置,建議使用VPC網(wǎng)絡(luò),詳情請(qǐng)參見(jiàn)實(shí)例配置。
示例:
hgpostcn-cn-i7**********-cn-hangzhou-vpc.hologres.aliyuncs.com:80/db_name
。用戶名 當(dāng)前賬號(hào)的AccessKey ID。 您可以單擊AccessKey 管理,獲取AccessKey ID。
密碼 當(dāng)前賬號(hào)的AccessKey Secret。 您可以單擊AccessKey 管理,獲取AccessKey Secret。
SQL 待執(zhí)行的SQL語(yǔ)句。 Key/Value點(diǎn)查場(chǎng)景的SQL與OLAP場(chǎng)景不同,查詢方式可以分為單值點(diǎn)查與多值點(diǎn)查,樣例SQL如下,詳情請(qǐng)參見(jiàn)測(cè)試方案介紹。- 單值點(diǎn)查。
SELECT O_ORDERKEY, O_CUSTKEY, O_ORDERSTATUS, O_TOTALPRICE, O_ORDERDATE, O_ORDERPRIORITY, O_CLERK, O_SHIPPRIORITY, O_COMMENT FROM public.orders_row WHERE o_orderkey = ?;
- 多值點(diǎn)查,此處以9個(gè)值為例。
SELECT O_ORDERKEY, O_CUSTKEY, O_ORDERSTATUS, O_TOTALPRICE, O_ORDERDATE, O_ORDERPRIORITY, O_CLERK, O_SHIPPRIORITY, O_COMMENT FROM public.orders_row WHERE o_orderkey IN (?, ?, ?, ?, ?, ?, ?, ?, ?);
超時(shí)時(shí)間 需要結(jié)合待壓測(cè)接口的情況配置單接口的響應(yīng)超時(shí)時(shí)間。 limit 結(jié)果集最大讀取行數(shù)(僅針對(duì)Select開(kāi)頭的SQL),最大為1,000,000。 占位符 Type 本示例占位符Type使用 bigint
。由于Key/Value點(diǎn)查場(chǎng)景需要隨機(jī)生成待查詢的主鍵值,在PTS中可以通過(guò)配置占位符實(shí)現(xiàn)。在SQL中使用?
作為占位符,并在占位符中依次配置?
代表的值。重要 SQL中?
的數(shù)量與占位符的數(shù)量需要相等,且二者按順序一一對(duì)應(yīng)。即本實(shí)踐中需要為多值點(diǎn)查的SQL示例配置九行占位符。Value PTS支持若干系統(tǒng)函數(shù),本示例使用 random
函數(shù),即Value值為:${sys.random(1,99999999)}
。連接池配置 初始化連接數(shù) 初始化時(shí)建立物理連接的個(gè)數(shù),Key/Value點(diǎn)查場(chǎng)景涉及并發(fā),這里先將壓測(cè)節(jié)點(diǎn)的連接數(shù)配置為 20
,對(duì)應(yīng)后文施壓配置中的每一臺(tái)施壓機(jī)都會(huì)產(chǎn)生20個(gè)連接。獲取連接最大等待時(shí)間 從連接池中獲取空閑連接的等待時(shí)間,單位毫秒,本示例設(shè)置為 4000
。最大連接數(shù) 最大活躍連接數(shù)量,本示例設(shè)置為 20
。最小連接數(shù) 池中最小空閑連接數(shù)量,本示例設(shè)置為 20
。 - 單值點(diǎn)查。
- 在施壓配置頁(yè)簽,配置如下參數(shù),更多施壓配置相關(guān)內(nèi)容請(qǐng)參見(jiàn)壓力來(lái)源(公網(wǎng)和VPC)。
參數(shù) 說(shuō)明 壓力來(lái)源 本示例選擇阿里云VPC內(nèi)網(wǎng),可以提高測(cè)試結(jié)果準(zhǔn)確性。選擇阿里云VPC內(nèi)網(wǎng)后,選擇地域。 VPC信息 請(qǐng)您根據(jù)實(shí)際情況繼續(xù)選擇VPC、安全組、虛擬交換機(jī)。 壓力模式 本示例選擇并發(fā)模式。 最大并發(fā) 由于本文Key/Value點(diǎn)查場(chǎng)景針對(duì)Hologres 64CU規(guī)格實(shí)例的測(cè)試并發(fā)數(shù)為 500
,本示例設(shè)為500
。因此,上文的連接池配置中,每臺(tái)機(jī)器在壓測(cè)節(jié)點(diǎn)上產(chǎn)生的連接數(shù)配置為20
,以達(dá)到需要測(cè)試的500
并發(fā)數(shù)。遞增模式 由于本文的測(cè)試場(chǎng)景不涉及并發(fā)數(shù)的變化,因此該部分只需保證并發(fā)數(shù)始終為 500
即可,即本示例選擇自動(dòng)遞增。遞增百分比 為了保證并發(fā)數(shù)始終為 500
,本示例取值100%
。單量級(jí)持續(xù)時(shí)長(zhǎng) 為了保證并發(fā)數(shù)始終為 500
,本示例取值1
分鐘。壓測(cè)總時(shí)長(zhǎng) 結(jié)合測(cè)試場(chǎng)景需要進(jìn)行填寫(xiě)。本場(chǎng)景僅涉及 1
條測(cè)試語(yǔ)句,因此測(cè)試時(shí)長(zhǎng)選擇5
分鐘。指定IP數(shù) 指發(fā)起壓測(cè)流量的IP地址數(shù)量,即施壓機(jī)數(shù)量。本場(chǎng)景預(yù)估達(dá)到的QPS為 10
萬(wàn),單臺(tái)施壓機(jī)可以提供的QPS上限為4000
,因此本示例選擇25
臺(tái)施壓機(jī)。說(shuō)明 PTS在并發(fā)模式下,單個(gè)施壓機(jī)可以提供的QPS上限為4000,因此在實(shí)際測(cè)試場(chǎng)景中,需要結(jié)合可能達(dá)到的QPS值來(lái)確定施壓機(jī)數(shù)量,而后確定連接池配置。 - 單擊下方調(diào)試場(chǎng)景,進(jìn)行場(chǎng)景調(diào)試。調(diào)試場(chǎng)景詳情請(qǐng)參見(jiàn)調(diào)試場(chǎng)景。
- 下圖為一個(gè)正常示例。
- 下圖為一個(gè)異常示例,錯(cuò)誤原因可能是數(shù)據(jù)庫(kù)URL錯(cuò)誤、用戶名密碼錯(cuò)誤等,導(dǎo)致連接失敗。
- 單擊下方保存去壓測(cè)按鈕,選擇立即執(zhí)行后單擊確定,即可開(kāi)始?jí)簻y(cè)。
數(shù)據(jù)更新場(chǎng)景
本文的數(shù)據(jù)更新場(chǎng)景使用與Key/Value點(diǎn)查場(chǎng)景相同的數(shù)據(jù)表,主要測(cè)試OLAP引擎在有主鍵情況下進(jìn)行數(shù)據(jù)更新的性能。
INSERT INTO public.orders_row (o_orderkey, o_custkey, o_orderstatus, o_totalprice, o_orderdate, o_orderpriority, o_clerk, o_shippriority, o_comment)
VALUES (?, 1, 'demo', 1.1, '2021-01-01', 'demo', 'demo', 1, 'demo')
ON CONFLICT (o_orderkey)
DO UPDATE SET
(o_orderkey, o_custkey, o_orderstatus, o_totalprice, o_orderdate, o_orderpriority, o_clerk, o_shippriority, o_comment) = ROW (excluded.*);
壓測(cè)報(bào)告查看
- 壓測(cè)完成后,在壓測(cè)報(bào)告頁(yè)簽單擊查看。
- 在報(bào)告詳情頁(yè)面的概覽頁(yè)簽,可以查看壓測(cè)場(chǎng)景運(yùn)行成功與否。
- 壓測(cè)運(yùn)行成功,可以查看成功率、平均RT、TPS/并發(fā)、異常數(shù)、總請(qǐng)求數(shù)等信息。其中,平均RT對(duì)應(yīng)平均查詢延遲,TPS指包含連接時(shí)間的每秒事務(wù)處理量。在本文的性能測(cè)試中,TPS與QPS大小一致。
- 壓測(cè)運(yùn)行失敗,請(qǐng)求數(shù)等指標(biāo)均為0,可以通過(guò)選擇 查看報(bào)錯(cuò)信息,進(jìn)行問(wèn)題排查。
- (可選)在報(bào)告詳情頁(yè)面單擊明細(xì),在壓測(cè)報(bào)告明細(xì)頁(yè)簽查看每個(gè)壓測(cè)節(jié)點(diǎn)(對(duì)應(yīng)每個(gè)Query)的相關(guān)指標(biāo)。如本文的OLAP查詢場(chǎng)景,針對(duì)單個(gè)串聯(lián)鏈路中包含多個(gè)壓測(cè)節(jié)點(diǎn)的場(chǎng)景,查看單個(gè)壓測(cè)節(jié)點(diǎn)的指標(biāo)。
更多關(guān)于壓測(cè)報(bào)告的內(nèi)容查看與分析,詳情請(qǐng)參見(jiàn)查看JDBC壓測(cè)報(bào)告。
壓測(cè)結(jié)果
- OLAP查詢場(chǎng)景
- 在不配置并發(fā)時(shí),OLAP查詢場(chǎng)景關(guān)注的指標(biāo)為Query的查詢時(shí)長(zhǎng),即對(duì)應(yīng)下圖的平均RT,本文測(cè)試得到的TPC-H 22條Query執(zhí)行時(shí)長(zhǎng)之和約為
25 s
。 - 在配置并發(fā)后的OLAP場(chǎng)景測(cè)試結(jié)果如下,此時(shí)需要同時(shí)關(guān)注查詢時(shí)間及QPS兩項(xiàng)指標(biāo)。可以看出,隨著并發(fā)數(shù)的逐步提升,測(cè)試的QPS結(jié)果保持在5附近。您也可以前往明細(xì)頁(yè),選擇對(duì)應(yīng)時(shí)間段來(lái)查看每個(gè)并發(fā)數(shù)下的性能結(jié)果。
- 在不配置并發(fā)時(shí),OLAP查詢場(chǎng)景關(guān)注的指標(biāo)為Query的查詢時(shí)長(zhǎng),即對(duì)應(yīng)下圖的平均RT,本文測(cè)試得到的TPC-H 22條Query執(zhí)行時(shí)長(zhǎng)之和約為
- Key/Value點(diǎn)查場(chǎng)景
- 對(duì)于單值點(diǎn)查,本實(shí)踐壓測(cè)得到的QPS平均值超過(guò)
100000
。 - 對(duì)于多值點(diǎn)查,以30個(gè)值的批量點(diǎn)查為例,本實(shí)踐得到的測(cè)試結(jié)果如下,其中QPS平均值為
34819
。最終的QPS性能為圖示平均QPS值乘以批量點(diǎn)查數(shù)量30
,即34819 * 30 =1044570
。
- 對(duì)于單值點(diǎn)查,本實(shí)踐壓測(cè)得到的QPS平均值超過(guò)