1. 程式人生 > >vertica-distinct,projection的segment by,order by

vertica-distinct,projection的segment by,order by

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;