Cube、數據分割和維度處理的錯誤組態
適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium
Cube、資料分割或維度物件上的錯誤組態屬性會決定伺服器在處理期間發生數據完整性錯誤時的回應方式。 索引鍵數據行中的重複索引鍵、遺漏索引鍵和 Null 值通常會觸發這類錯誤,而造成錯誤的記錄不會新增至資料庫,您可以設定屬性來決定接下來會發生什麼事。 根據預設,處理會停止。 不過,在 Cube 開發期間,您可能會想要在發生錯誤時繼續處理,以便測試 Cube 行為與匯入的數據,即使數據不完整也一樣。
本主題包含下列各節:
在維度中 Null 索引鍵
執行順序
在每筆記錄 ErrorConfiguration 規則之前,伺服器一律會執行 NullProcessing 規則。 請務必瞭解,因為將 Null 轉換成零的 Null 處理屬性,在索引鍵數據行中有兩個以上的錯誤記錄時,後續可能會引發重複的索引鍵錯誤。
默認行為
根據預設,處理會在涉及索引鍵數據行的第一個錯誤時停止。 此行為是由錯誤限制所控制,將零指定為允許的錯誤數目,以及「停止處理」指示詞,指示伺服器在達到錯誤限制時停止處理。
由於 Null 或遺漏或重複值,觸發錯誤的記錄會轉換成未知的成員或捨棄。 SQL Server Analysis Services 不會匯入違反數據完整性條件約束的數據。
轉換成未知的成員預設會因為 KeyErrorAction的 ConvertToUnknown 設定而發生。 配置給未知成員的記錄會隔離在資料庫中,作為您在處理完成後可能想要調查的問題辨識項。
未知的成員會從查詢工作負載中排除,但如果 UnknownMember 設定為 Visible,則某些用戶端應用程式中會顯示這些成員。
如果您想要追蹤已轉換成未知成員的 Null 數目,您可以修改 NullKeyConvertedToUnknown 屬性,將這些錯誤報告至記錄檔或處理視窗中。
當您手動將 keyErrorAction 屬性設定為 DiscardRecord時,就會發生 Discard。
透過錯誤組態屬性,您可以判斷伺服器在發生錯誤時如何回應。 選項包括立即停止處理、繼續處理但停止記錄,或繼續處理和記錄錯誤。 預設值會根據錯誤的嚴重性而有所不同。
錯誤計數會追蹤發生多少錯誤。 當您設定上限時,當達到該限制時,伺服器回應就會變更。 根據預設,伺服器會在達到限制之後停止處理。 默認限制為 0,導致處理在第一個計算錯誤時停止。
應該快速解決高影響錯誤,例如索引鍵欄位中遺漏的索引鍵或 Null 值。 根據預設,這些錯誤會遵循 ReportAndContinue 伺服器行為,其中伺服器會攔截錯誤,將其新增至錯誤計數,然後繼續處理(除了錯誤限制為零,因此處理會立即停止)。
其他錯誤是產生,但預設不會進行計數或記錄(這是 IgnoreError 設定),因為錯誤不一定會造成數據完整性問題。
錯誤計數會受到 Null 處理設定的影響。 對於維度屬性,Null 處理選項會決定伺服器在遇到 Null 值時回應的方式。 根據預設,數值數據行中的 Null 會轉換成零,而字串數據行中的 Null 會當做空白字串處理。 您可以覆寫 NullProcessing 屬性,以攔截 null 值,再變成 KeyNotFound 或 KeyDuplicate 錯誤。 如需詳細資訊,請參閱維度中的 Null 索引鍵。
錯誤會記錄在 [處理] 對話框中,但不儲存。 您可以指定索引鍵錯誤記錄檔名稱,以收集文字檔中的錯誤。
錯誤組態屬性
有九個錯誤組態屬性。 當發生特定錯誤時,會使用五個來判斷伺服器回應。 其他四個範圍是錯誤組態工作負載,例如允許的錯誤數目、達到該限制時該怎麼做、是否要在記錄檔中收集錯誤。
伺服器回應特定錯誤
財產 | 違約 | 其他值 |
---|---|---|
CalculationError 初始化錯誤組態時發生。 |
IgnoreError 記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 |
ReportAndContinue 記錄並計算錯誤。 ReportAndStop 報告錯誤並立即停止處理,而不論錯誤限制為何。 |
KeyNotFound 當事實數據表中的外鍵在相關維度數據表中沒有相符的主鍵時發生(例如,Sales 事實數據表具有產品識別碼不存在於 Product 維度數據表中的記錄)。 此錯誤可能發生在分割區處理期間,或雪花維度的維度處理。 |
ReportAndContinue 記錄並計算錯誤。 |
ReportAndStop 報告錯誤並立即停止處理,而不論錯誤限制為何。 IgnoreError 記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 觸發此錯誤的記錄預設會轉換成未知的成員,但您可以變更 KeyErrorAction 屬性以改為捨棄它們。 |
KeyDuplicate 在維度中找到重複的屬性索引鍵時發生。 在大部分情況下,可以接受具有重複屬性索引鍵,但此錯誤會通知您重複專案,以便檢查維度是否有可能導致屬性之間不一致關聯性的設計缺陷。 |
IgnoreError 記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 |
ReportAndContinue 記錄並計算錯誤。 ReportAndStop 報告錯誤並立即停止處理,而不論錯誤限制為何。 |
NullKeyNotAllowed 發生於 NullProcessing = 在維度屬性上設定錯誤,或當用來唯一識別成員的屬性索引鍵數據行中有 Null 值時發生。 |
ReportAndContinue 記錄並計算錯誤。 |
ReportAndStop 報告錯誤並立即停止處理,而不論錯誤限制為何。 IgnoreError 記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 觸發此錯誤的記錄預設會轉換成未知的成員,但您可以改為設定keyErrorAction 屬性 |
NullKeyConvertedToUnknown 當 Null 值後續轉換成未知成員時發生。 在維度屬性上設定 NullProcessing = ConvertToUnknown 將會觸發此錯誤。 |
IgnoreError 記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 | 如果您將此錯誤視為參考,請保留預設值。 否則,您可以選擇 [ReportAndContinue 將錯誤報告至 [處理] 視窗,並將錯誤計算為錯誤限制。 ReportAndStop 報告錯誤並立即停止處理,而不論錯誤限制為何。 |
一般屬性
屬性 | 值 |
---|---|
KeyErrorAction | 這是伺服器發生 KeyNotFound 錯誤時所採取的動作。 此錯誤的有效回應包括 convertToUnknown |
KeyErrorLogFile | 這是使用者定義檔名,其擴展名必須.log,位於服務帳戶具有讀寫許可權的資料夾。 此記錄檔只會包含處理期間所產生的錯誤。 如果您需要更詳細的資訊,請使用 Flight Recorder。 |
KeyErrorLimit | 這是伺服器在處理失敗之前允許的數據完整性錯誤數目上限。 -1 值表示沒有限制。 默認值為 0,這表示在第一個錯誤發生之後,處理會停止。 您也可以將它設定為整數。 |
KeyErrorLimitAction | 這是伺服器在金鑰錯誤數目達到上限時所採取的動作。 停止處理時,處理會立即終止。 使用 停止記錄,處理會繼續,但不再報告或計算錯誤。 |
設定錯誤組態屬性的位置
在部署資料庫之後,或在 SQL Server Data Tools 的模型專案中,使用 SQL Server Management Studio 中的屬性頁。 這兩個工具中都找到相同的屬性。 您也可以在 msmdrsrv.ini 檔案中設定錯誤組態屬性,以變更錯誤組態的伺服器預設值,並在 Batch 和 Process 命令中,以腳本作業的形式執行。
您可以在任何可當作獨立作業處理的物件上設定錯誤組態。
SQL Server Management Studio
在 [物件總管] 中,按兩下 [屬性] 下列其中一個對象:維度、Cube 或分割區。
在 [屬性] 中,按兩下 [錯誤組態]。
SQL Server Data Tools
在 [方案總管] 中,按兩下維度或 Cube。 ErrorConfiguration 會出現在下方窗格中的屬性中。
或者,僅針對單一維度,以滑鼠右鍵按兩下 [方案總管] 中的維度,選擇 [處理
],然後在 [處理維度] 對話框中選擇 [變更設定] 。 錯誤組態選項會出現在 [維度索引鍵錯誤] 索引標籤上。
遺漏金鑰 (KeyNotFound)
遺漏索引鍵值的記錄無法新增至資料庫,即使忽略錯誤或錯誤限制不受限制也一定。
當數據表事實上包含外鍵值時,伺服器會在分割區處理期間產生 KeyNotFound 錯誤,但外鍵在相關維度數據表中沒有對應的記錄。 當處理相關或雪花維度數據表時,也會發生此錯誤,其中一個維度中的記錄會指定不存在於相關維度中的外鍵。
發生 KeyNotFound 錯誤時,會將違規記錄配置給未知的成員。 此行為是透過 Key Action來控制,設定為 ConvertToUnknown,以便檢視已配置的記錄以進行進一步調查。
事實資料表中的 Null 外鍵 (KeyNotFound)
根據預設,事實數據表外鍵數據行中的 Null 值會轉換成零。 假設零不是有效的外鍵值,則會記錄 KeyNotFound 錯誤,並計入預設為零的錯誤限制。
若要允許繼續處理,您可以在轉換 Null 並檢查錯誤之前處理 Null。 若要這樣做,請將 nullProcessing 設定為 Error。
在量值上設定 NullProcessing 屬性
在 SQL Server Data Tools 的 [方案總管] 中,按兩下 Cube 以在 Cube 設計師中開啟它。
以滑鼠右鍵按鍵按下 [量值] 窗格中的量值,然後選擇
[屬性] 。在 [屬性] 中,展開 [來源] 以檢視 NullProcessing 屬性。 它預設會設定為 自動,而 OLAP 專案會針對包含數值數據的欄位,將 null 轉換成零。
將值變更為 Error,以排除具有 Null 值的任何記錄,以避免 null 到數值 (零) 轉換。 這項修改可讓您避免與索引鍵數據行中具有零的多個記錄相關的重複索引鍵錯誤,而且當零值外鍵在相關維度數據表中沒有對等主鍵時,也避免 KeyNotFound 錯誤。
維度中的 Null 索引鍵
若要在 snowflaked 維度的外鍵中找到 null 值時繼續處理,請先在維度屬性的
您有兩個選項可用來處理維度屬性上的 Null:
設定 NullProcessing=UnknownMember,將具有 Null 值的記錄配置給未知的成員。 這會產生 NullKeyConvertedToUnknown 錯誤,預設會忽略此錯誤。
設定 NullProcessing=Error,以排除具有 Null 值的記錄。 這會產生 NullKeyNotAllowed 錯誤,而錯誤會記錄並計入密鑰錯誤限制。 您可以在 Null 索引鍵不允許 上設定錯誤組態屬性,以 IgnoreError,以允許繼續處理。
非索引鍵欄位的 Null 可能會有問題,因為 MDX 查詢會根據 Null 解譯為零或空白,傳回不同的結果。 基於這個理由,SQL Server Analysis Services 提供 Null 處理選項,讓您預先定義所需的轉換行為。
在維度屬性上設定 NullProcessing 屬性
在 SQL Server Data Tools 的 [方案總管] 中,按兩下維度以在維度設計師中開啟它。
以滑鼠右鍵按下 [屬性] 窗格中的屬性,然後選擇 [屬性]
。 在 [屬性] 中,展開 KeyColumns,以檢視 NullProcessing 屬性。 它預設會設定為 自動,這會針對包含數值數據的欄位,將 null 轉換成零。 將值變更為 Error 或 UnknownMember。
這項修改會藉由捨棄或轉換記錄,在檢查錯誤之前捨棄或轉換記錄,來移除觸發 keyNotFound 的基礎條件。
根據錯誤組態,其中一個動作可能會導致報告和計算的錯誤。 您可能需要調整其他屬性,例如將 keyNotFound 設定為 ReportAndContinue 或 KeyErrorLimit 為非零值,以允許在報告和計算這些錯誤時繼續處理。
產生不一致關聯性的重複索引鍵 (KeyDuplicate)
根據預設,重複索引鍵的存在不會停止處理,但會忽略錯誤,並將重複的記錄從資料庫排除。
若要變更此行為,請將 KeyDuplicate 設定為 ReportAndContinue 或 ReportAndStop 來報告錯誤。 然後,您可以檢查錯誤,以判斷維度設計的潛在缺陷。
變更錯誤限制或錯誤限制動作
您可以引發錯誤限制,以便在處理期間允許更多錯誤。 沒有引發錯誤限制的指引;視您的案例而定,適當的值會有所不同。 錯誤限制會指定為 SQL Server Data Tools 中 ErrorConfiguration 屬性中的 KeyErrorLimit,或 SQL Server Management Studio 中維度、Cube 或量值群組屬性的 [錯誤組態] 索引卷標中 錯誤數目。
達到錯誤限制后,您可以指定處理停止或記錄停止。 例如,假設您在錯誤限制為100時,將動作設定為 StopLogging。 在 101 發生錯誤時,處理會繼續,但不會再記錄或計算錯誤。 錯誤限制動作會指定為 SQL Server Data Tools 中 ErrorConfiguration 属性中的 KeyErrorLimitAction,或指定為 SQL Server Management Studio 中維度、Cube 或量值群組屬性的 [錯誤組態] 索引卷標的 錯誤動作。
設定錯誤記錄檔路徑
您可以指定檔案來儲存在處理期間報告的金鑰相關錯誤訊息。 根據預設,錯誤會在 [處理] 視窗中的互動式處理期間顯示,然後在關閉視窗或會話時捨棄。 記錄檔只會包含與索引鍵相關的錯誤資訊,與您在處理對話框中所報告的錯誤相同。
錯誤會記錄到文本檔,而且必須有.log擴展名。 除非發生錯誤,否則檔案會是空的。 根據預設,將會在 DATA 資料夾中建立檔案。 只要 Analysis Services 服務帳戶可以寫入該位置,您就可以指定另一個資料夾。
下一步
決定是否要停止處理或忽略錯誤。 請記住,只會忽略錯誤。 不會忽略造成錯誤的記錄;它會被捨棄或轉換成未知的成員。 違反數據完整性規則的記錄永遠不會新增至資料庫。 根據預設,處理會在發生第一個錯誤時停止,但您可以藉由提高錯誤限制來變更這個。 在 Cube 開發中,放寬錯誤組態規則,讓處理能夠繼續,讓有數據可供測試會很有用。
決定是否要變更預設 Null 處理行為。 根據預設,字串數據行中的 Null 會當做空值處理,而數值數據行中的 Null 則會以零處理。