簡體   English   中英

在數據倉庫中使用標識或序列

[英]Using Identity or sequence in data warehouse

我是數據倉庫的新手,所以我嘗試遵循最佳實踐,模仿 Microsoft Demo DB WideWorldImportersDW中的一些實現細節,我注意到的一件事是使用Sequence作為 PK 而不是Identity的默認值。


請問,一般來說,在數據倉庫中是否更喜歡使用Sequence而不是Identity ,哪一個更方便,尤其是在 ETL 過程中?。

序列比標識列有更多的保證。 特別是,對序列的每次調用都保證為該序列產生下一個值。

但是, identity列可能存在間隙和其他不一致。 這都記錄在這里

由於對序列的額外保證,我懷疑它們速度較慢。 特別是,我懷疑數據庫無法批量預分配值。 這意味着在多線程環境中,序列會對事務強加序列化,從而減慢速度。

一般來說,我看到identity用於標識表中的列。 雖然可能有一個性能比較,但我還沒有看到。 但我懷疑在某些情況下序列會慢一些。

SequenceIdentity都是為OLTP表設計的,以便在多會話環境中有效分配唯一鍵。

需要意識到的重要一點是,在數據倉庫環境中,您通常會有不同的設置,並且只有一個作業填充特定的表。

單用戶環境中,您根本不需要上述功能,您可以簡單地手動分配鍵,從max(id) +1開始,每行遞增 1。

數據倉庫的一般規則是您不應該搜索銀彈推薦,而是檢查您的 onw 測試中的功能和性能。

如果您對SQL 服務器身份與序列進行一些研究,例如此處此處,您會得到各種結果,部分偏愛前者,部分偏愛后者功能。

因此,我的建議是使用手動分配的ID (即沒有開銷)執行測試,以獲得期望的基線。

比用身份順序重復它 - 比較和選擇。

SQL 服務器中的sequence是后來添加的,基於 Oracle 序列,所以我不認為它有一些基本問題。

Oracle 的經驗告訴我們,序列中需要有足夠大的cache來支持有效的批量插入。

同時, identity也可以被定義為緩存,(IDENTITY_CACHE = { ON | OFF }) 所以再次嘗試所有三種可能性(序列、身份、無)並選擇最好的一種。

標識的范圍僅限於單個表,是表定義 (DDL) 的一部分,並在截斷時重置。 標識在表中是唯一的。 每個表在配置時都有自己的標識值,並且不能跨表共享。 一般情況下,表上發生插入時,SQL 服務器會消耗“下一個”值。+

序列是第一個 class object,范圍為數據庫。 使用序列時會消耗“下一個”值(NEXT VALUE FOR)。

當您需要跨多個表存儲一個人可讀的唯一標識符時,最有效地使用序列。 例如,將票類型存儲在不同表中的票務系統可以使用序列來確保沒有票接收到相同的號碼,而不管它存儲在哪個表中,並且人們可以合理地引用該號碼(而不是 GUID)。

在數據倉庫中,維度表需要在表中唯一的行標識符。 通常,OLTP 主鍵是不夠的,因為它可能在維度表中重復,具體取決於維度的類型,並且您不想冒險為 OLTP PK 分配額外的上下文,因為這可能會在源數據時造成挑戰變化。 維度行標識符應該只對與其關聯的非度量事實列有意義。 事實列未跨不同維度連接。++

由於維度表標識符的 scope 僅限於維度表,因此標識鍵是理想的行標識符。 它創建簡單,存儲緊湊,在維度之外毫無意義。 您不會在報告中使用維度標識。 (真的,請不要成為那個開發者。)

+ 很少有人需要知道下一個值而不需要分配給一行。 如果您試圖在分配之前操縱標識值,則可能是一個危險信號

++ 維度視圖可以聯合不同的表來提供 OLAP 多維數據集,在這種情況下,應該從基礎數據生成持久的可重復鍵,通常通過將字符串文字與每個表鍵以標准化格式連接起來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM