

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設計 Amazon Redshift 資料表的最佳實務
<a name="best-practices-tables"></a>

本節提供設計資料庫資料表的最佳實務概觀。我們建議您遵循這些最佳實務，以實現最佳的查詢效能和效率。

## 了解排序索引鍵的運作方式
<a name="sort-keys"></a>

Amazon Redshift 依據排序索引鍵，將您的資料以排序順序儲存於磁碟。Amazon Redshift 查詢最佳化工具使用排序順序來決定最佳查詢計畫。若要有效使用排序索引鍵，建議您執行下列動作：
+ 盡可能對資料表進行排序。
+ 使用`VACUUM`排序來還原最佳效能。
+ 避免壓縮排序索引鍵資料欄。
+ 如果排序索引鍵已壓縮且`sortkey1_skew`比率顯著較高，則重新建立資料表，而不啟用排序索引鍵的壓縮。
+ 避免將函數套用至排序索引鍵資料欄。例如，在以下查詢中，如果您將其轉換為 ，則不會使用`trans_dt : TIMESTAMPTZ`排序索引鍵資料欄`DATE`：

  ```
  select order_id, order_amt
  from sales
  where trans_dt::date = '2021-01-08'::date
  ```
+ 依排序索引鍵順序執行`INSERT`操作。
+ 盡可能在 `GROUP BY`子句中使用排序索引鍵。

### 查詢調校秘訣
<a name="tuning-tips"></a>

我們建議您執行下列動作來調整查詢：
+ 一律將複合排序索引鍵從最低基數排列為最高基數，以獲得最佳效果。
+ 如果複合排序索引鍵中的前導索引鍵相對是唯一的 （也就是具有高基數），則請避免將其他資料欄新增至排序索引鍵。新增其他資料欄對查詢效能的影響很小，但會增加維護成本。

## 評估排序索引鍵有效性
<a name="sort-key-effectiveness"></a>

若要最佳化查詢，您必須能夠評估查詢的有效性。我們建議您使用 [SVL\_QUERY\_SUMMARY](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_SUMMARY.html) 檢視來尋找有關執行查詢的一般資訊。在此檢視中，您可以使用 屬性`IS_RRSCAN`來判斷`EXPLAIN`計劃步驟是否使用範圍限制掃描。您也可以使用 屬性`rows_pre_filter`來判斷排序索引鍵的選擇性。

您也可以從稱為 [v\_my\_last\_query\_summary](https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_my_last_query_summary.sql) 的 GitHub 使用管理員檢視。檢視會顯示上次執行查詢的資訊。

下列陳述式說明如何尋找有關查詢執行的一般資訊。

```
select lpad(' ',stm+seg+step) || label as label, 
       rows, 
       bytes, 
       is_diskbased, 
       is_rrscan, 
       rows_pre_filter 
from svl_query_summary 
where query = pg_last_query_id() 
order by stm, seg, step;
```

上述查詢會傳回下列範例輸出。



![上一個查詢的範例輸出。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/query-best-practices-redshift/images/query-output.png)


## 了解您的資料表
<a name="know-table"></a>

請務必了解資料表的關鍵屬性。若要進一步了解您的資料表，請執行下列動作：
+ 使用 [PG\_TABLE\_DEF](https://docs.aws.amazon.com/redshift/latest/dg/r_PG_TABLE_DEF.html) 來檢視資料表資料欄的相關資訊。
+ 使用 [SVV\_TABLE\_INFO](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_TABLE_INFO.html) 來檢視更完整的資料表相關資訊，包括資料分佈偏斜、金鑰分佈偏斜、資料表大小和統計資料。

## 選擇正確的資料表分佈樣式
<a name="distribution-style"></a>

當您執行查詢時，查詢最佳化工具會視需要將資料列重新配送至運算節點，以執行任何聯結與彙總。選取資料表分佈樣式的目標是將重新分佈步驟的影響降至最低，方法是在執行查詢之前，將資料放置在需要的位置。 

我們建議您使用下列方法來選擇正確的資料表分佈樣式：
+ 串連相同節點內的資料列，避免在查詢執行計畫中廣播和重新分佈。例如，透過選取 `DISTKEY`，您可以在其通用資料欄上分配事實資料表和單維度資料表。依據篩選過的資料集大小，選擇最大的維度。只有用於聯結的資料列必須配送，因此應考量篩選之後的資料集大小，而非資料表的大小。
+ 確定建立分發金鑰的欄沒有扭曲。否則，一個運算節點可以執行比其他運算節點更多的繁重負載。如果您注意到偏斜，請考慮變更分佈索引鍵資料欄。如果資料欄的值是均勻分佈或高基數值，則可以將其視為分佈索引鍵的候選項目。
+ 如果聯結條件中使用的資料表很小 （小於 1 GB)，請考慮分佈樣式 `ALL`。
+ 您可以壓縮分佈索引鍵，但必須避免壓縮排序索引鍵資料欄 （特別是排序索引鍵的第一欄）。

**注意**  
如果您使用自動資料表最佳化，則不需要選擇資料表的分佈樣式。如需詳細資訊，請參閱《Amazon Redshift 文件》中的[使用自動資料表最佳化](https://docs.aws.amazon.com/redshift/latest/dg/t_Creating_tables.html)。若要讓 Amazon Redshift 選擇適當的分佈樣式，請指定分佈樣式的 `AUTO`。