vertica-distinct,projection的segment by,order by
阿新 • • 發佈:2019-01-31
1,計算distinct聚合比其他聚合更消耗資源,查詢中distinct聚合能夠替換成其他聚合往往效率更高
注意:
多個distinct聚合語句不能非常直接的重寫,而且沒有辦法讓Projection避免進行GROUP BY HASH和資料重新分段,也就是說此事將會有hash by重新計算,然後排序,各節點資料重新分佈(注意這裡的分佈都是不落地的),然後在運算,這樣是極其不合理的。為了保證正常執行和提升效能需要保證足夠的記憶體,因此處於效能考慮儘可能避免同一個語句中出現多個DISTINCT聚合,可以用group
by代替的。
2,Vertica使用了兩種演算法的join方式,分別是 hash join和merge join。
如下第一個查詢比第二個查詢效能優化,因為第二個需要更多的計算
SELECT * FROM T JOIN X WHERE T.a - T.b = X.x1;
VS
SELECT * FROM T JOIN X WHERE T.a = X.x1 + T.b
使得join效率得到優化,要檢查是否總是選擇了大表作外層表,小表作內層表。為了提升多表關聯效率,建立projection讓其能夠在關聯鍵上相等的分段,,這種projection叫做ISPS,ISPS允許關聯查詢只在每個本地節點上查詢資料,不需要跨節點移動資料。
判斷projection是否在查詢時的關聯鍵上想等分段時,使用explain,若輸出包含RESEGMENT或者 BROADCAST,則就不是想等分段。
create table t1(id int,x1 int,y1 int) segmented by hash(id) all nodes;
create table t2(id int,x2 int,y2 int) segmented by hash(id) all nodes;
explain SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND t1.x1 = t2.x2;
可以看到這個sql資料沒有進行重新分佈就計算,說明是想等關聯分段ISPS
explain
SELECT * FROM t1 JOIN t2 ON t1.x1 = t2.x2;
這裡進行了資料重新分佈計算,不是相等分段 3,order by對效能影響 我們在查詢表的時候可以多看看標的ddl,其設計的排序方式對效能影響很大 然後儘量使得查詢語句和表的相關projection的order by 子句相同,這樣效能更好 CREATE TABLE sortopt ( a INT NOT NULL, b INT NOT NULL, c INT, d INT ); CREATE PROJECTION sortopt_p ( a_proj, b_proj, c_proj,
d_proj )
AS SELECT * FROM sortopt
ORDER BY a,b,c
UNSEGMENTED ALL NODES;
INSERT INTO sortopt VALUES(5,2,13,84);
INSERT INTO sortopt VALUES(14,22,8,115);
INSERT INTO sortopt VALUES(79,9,401,33);
#查詢包含以下order by子句可以不必重新排序ORDER BY a 、ORDER BY a, b 、ORDER BY a, b, c 但是下面查詢需要重新排序,因為建立Projection時不能指定排序方式,物理儲存上只能是asc方式 SELECT
* FROM sortopt ORDER BY a DESC b, c;
可以看到這個sql資料沒有進行重新分佈就計算,說明是想等關聯分段ISPS
這裡進行了資料重新分佈計算,不是相等分段 3,order by對效能影響 我們在查詢表的時候可以多看看標的ddl,其設計的排序方式對效能影響很大 然後儘量使得查詢語句和表的相關projection的order by 子句相同,這樣效能更好 CREATE TABLE sortopt ( a INT NOT NULL, b INT NOT NULL, c INT, d INT ); CREATE PROJECTION sortopt_p ( a_proj, b_proj, c_proj,