今天聊聊怎麼高效SELECT

阿里雲官網 發佈 2019-12-31T12:14:31+00:00

上期給大家分享了在交互式分析中如何給表導入數據,在PostgreSQL中的標準insert語句,往期精彩傳送門:今天聊聊怎麼給表寫入數據,同時相關的建表操作也可以參見往期:今天來聊聊怎麼高效建表通常來說,數據存儲需要耗費存儲資源,當查數據的時候,也會耗費計算資源,如何快速查詢到想

上期給大家分享了在交互式分析中如何給表導入數據,在PostgreSQL中的標準insert語句,往期精彩傳送門:今天聊聊怎麼給表寫入數據 ,同時相關的建表操作也可以參見往期:今天來聊聊怎麼高效建表

通常來說,數據存儲需要耗費存儲資源,當查數據的時候,也會耗費計算資源,如何快速查詢到想要的結果又能省去不必要的計算資源,也是性能優化的一大挑戰。今天小編就為大家講解,如何在交互式分子中,高效使用SELECT以達到快速查詢數據又能節約資源的目的。


語法

SELECT [ALL | DISTINCT [ON (expression [, ...])]]
  * | expression [[AS] output_name] [, ...]
  [FROM from_item [, ...]]
  [WHERE condition]
  [GROUP BY grouping_element [, ...]]
  [HAVING condition [, ...]]
  [{UNION | INTERSECT | EXCEPT} [ALL] select]
  [ORDER BY expression [ASC | DESC | USING operator] [, ...]]
  [LIMIT {count | ALL}]


使用示例


1.SELECT *

直接使用SELECT語句查整個表,如示例:

select * from test;

在使用select * 時,會整個表做索引,但實際業務中,整張表的數據並不是所有的都會同時需要,因此會浪費大量的計算資源,當整個表數據量特別大時,也會耗費大量時間去查詢。

2. SELECT FROM

當要大量查詢某些欄位時,一般建議不做整張表的查詢,而是查需要的列,示例如下:

select id,name from test;


3.GROUP BY

GROUP BY 語句用於結合聚合函數,根據一個或多個列對結果集進行分組。

SELECT kind, sum(length) AS total FROM films GROUP BY kind;

說明:group by 裡面的欄位包含不能float/double這種浮點型。


4.DISTINCT/COUNT DISTINCT

在表中,可能會包含重複值,使用distinct來返回不同的值,而count distinct是用來計算非重複數據的數目。

//distinct用法
SELECT DISTINCT ON (location) location, time, report
    FROM weather_reports
    ORDER BY location, time DESC;
 
//精確uv
SELECT c1, COUNT(DISTINCT c2) FROM table GROUP BY c1

//非精確uv
SELECT c1, approx_count_distinct(c2) FROM table GROUP BY c1
    


5.UNION

UNION用於將兩個或者更多的 SELECT 語句的運算結果組合起來。

說明:每個 SELECT 語句必須有相同數量的選中列、相同數量的列表達式、相同的數據類型,並且它們出現的次序要一致,不過長度不一定要相同。

 SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         LEFT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
    UNION
         SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         RIGHT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;


6.ORDER BY

ORDER BY用於對查詢的結果進行排序。可用於根據指定的列對結果集進行排序。

說明:默認排序是升序,若要使用降序,需要使用DESC關鍵字

SELECT Company, OrderNumber FROM Orders ORDER BY Company;

//降序排列
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC;


7.WHERE

where用於按照指定條件來選擇數據。

SELECT * FROM Persons WHERE FirstName='Bush';


使用優化

1.只需要查某些列,將select全表替換成select指定欄位

select * from table
替換成:
select id,name from table;

2.對於查詢較大的數據,加一些過濾條件以及限定條件

select id,value from table where id=123 limit 1000;

3.對於數據量較大的表,查詢主要以等值查詢為主要查詢場景時,建議可以創建或者將原表修改為Hash Clustering表,利用CLUSTERED欄位加速該欄位的filter效率。

4.對於數據量不大但查詢時長明顯較大時,需要判斷是否存在數據傾斜問題:可以通過ANALYZE EXPLAIN方式查看執行計劃,獲取診斷信息。

作者:May-交互式分析

關鍵字: