2015年3月17日 星期二

[DB] Teradata SQL最佳化教學(一)-- SQL and Indexes

Teradata是一平行化儲存處理的資料庫,雖然完全支援SQL,但是一些邏輯還是不太一樣.特別是資料倉儲多半存放量大的資料(動則幾百萬筆,數百G的Table),寫得好和寫得不好的SQL執行起來效率差得非常多,這篇文章提供幾個大方向的建議.


本系列翻譯自:http://www.teradata-sql.com/2012/03/sql-optimization.html

SQL and Indexes :                                      


1) Primary indexes: 盡可能的使用Primary Index來當作Join的Key值.(譯注:Teradata使用PI值當作管理資料散佈).

2) Secondary indexes (10% rule rumor): Optimizer並不會實際的使用10%原則來決定SI是否使用,不過是個不錯的估計值.如果當SI值使用後,資料表中只有少於10%的部分會被存取,那就假設sql會使用SI.不然SQL將會執行Full Table Scan(FTS).

Opimizer將會使用最低消費的方法:Optimizer將會決定是否使用SI的消耗低於使用FTS,這些消耗包括cpu用量,和disk io.

3) Constants: index的欄位盡可能地使用常數,不然join時候需要先作轉換,這會節省一點效能.

4) Mathematical operations: 在可以得到同樣結果的情況下,數學操作比字串操作快

5) Variable length columns: 儘量減少自動長度的欄位,通常會使用固定欄位來定義表格.

6) Union: 使用Union可以將一些太長的sql語句轉為幾個比較小的步驟,這些比較小的步驟可以平行運算.但是這會消耗spool的空間.Union all是一單線程的語句.

7) Where in/where not in (subquery): where in比where not in有效率.不過如果是針對子查詢,子查詢將直接影響到sql的時間.

如果在子查詢上有執行時間的問題,可以將子查詢與原本的查詢分開來使用.這時候需要兩個sql語句,以及一個中介的資料表.步驟為:1) 將子查詢單獨執行,並插入中介表格.2)將原本的查詢語句讀取剛剛產生的中介表格.

8) Strategic Semicolon: 在每個sql語句後會有個“;"符號.在有些時候,一些位置的”;"可以減少一組sql查詢語句的執行時間.例如:1)當一組sql共享一個共同的table時,或是2)當一組sql使用相同的unix input file.不過這並不會減少單一sql查詢的時間.