本系列翻譯自: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查詢的時間.
沒有留言:
張貼留言