2013-03-14 92 views
1

我有一個SSIS ETL包,可將CSV文件加載到具有100列以上記帳數據的登臺表中,我們正在根據此數據創建數據倉庫。從登臺表填充數據倉庫維度的有效方法?

從數據,下面我們可以找出打造我們的「產品」維度所需的列的列超過100 ...

示例數據..

product_id,product_name,product_description 
'1','computer','power pc' 
'2','case','atx case' 
'1','computer','power pc' 
'3','cpu'intel' 
'3','cpu'intel' 

所以,我所做的是創建DIM.PRODUCT表,這是...

CREATE TABLE DIM.OFFICE ( 
"product_key" int IDENTITY (1,1) NOT NULL, -- Surrogate Key 
"product_id" varchar(150) NOT NULL, -- Business Key 
"product_name" varchar(150) NOT NULL, 
"product_Description" varchar(150) NOT NULL, 
) 

我們知道,「產品ID」從示例數據唯一標識的產品,這樣的#1產品ID將永遠有一個PRODUCT_NAME =計算r和product_description = power pc。

登臺表有300萬條記錄,我如何從登臺表填充我的維度,以便稍後在填充事實表時查找它。

尺寸爲1型尺寸,產品ID#1將始終爲「電腦」,「電源電腦」。

以前我一直在使用SELECT DISTINCT「產品ID」,「PRODUCT_NAME」,「PRODUCT_DESCRIPTION」只得到臨時表中不同的值,並加載到尺寸,但我發現這個方法是徵稅填充維度時的資源系統。

是否有更好,更高效(性能明智)的方式來做到這一點? (使用TSQL或SSIS)..

我們正在運行SQL 2008 SP3 ..計劃很快升級到SQL 2012。

+1

你是否每次加載整個維度?據推測,你可以忽略已經存在的產品?如果是這樣,你可以添加一個'IsLoaded'標誌或者類似於你的登臺表並且將這些產品從你的查詢中完全排除。即使是「WHERE NOT EXISTS」檢查維度也可能有幫助。但目前尚不清楚您是如何從暫存表加載維度的。如果你能提供更多細節,可以有人提供幫助。 – Pondlife 2013-03-14 14:20:03

回答

1

選擇不同通常需要執行排序,這實際上是所有工作完成的地方。 (您可以通過查看查詢計劃來驗證這一點)。您可以在幾個方面優化這個:

  1. 確保數據已經通過創建聚簇索引所需順序排序的身體。這會對數據進行「預先分類」,但當然現在,當您導入數據時,您必須預先對數據進行排序,因此現在會減慢導入到登臺表中的速度。如果import> staging可能需要一些時間,但維度加載不能,這可能是實用的。

  2. 通過確保TempDB運行良好來優化數據庫排序功能。

兩者都是真正的DBA類型問題。你有DBA嗎?

+0

我瞭解SELECT DISTINCT的含義,因此我正在尋找一種加載維度的替代方式。只是看到其他選項。此時,SELECT DISTINCT正常工作,但是我想將該方法更改爲更優化的方法,因爲數據加載只會隨着我們繼續生成記錄而增加。 – exxoid 2013-03-14 14:17:11

+0

從來沒有聽說過選擇快速,我GOOGLE了它,並提出了這個鏈接,它描述了一種方法的有效開展在SSIS DISTIINCT的開始。如果它與SQL Server有區別,但是它不會傷害到我會非常驚訝。 http://sqlblog.com/blogs/rob_farley/archive/2011/02/17/the-ssis-tuning-tip-that-everyone-misses.aspx。 – 2013-03-14 23:08:48

0

假設SSIS和SQL不爭奪相同的資源,您可以考慮將
OPTION (FAST 10000)附加到查詢。
這導致在SQL Server上導致非阻塞查詢計劃 - 哈希匹配,而不是對DISTINCT排序。儘管SQL查詢本身可能會運行更長時間,但整體處理速度可能會加快,因爲SSIS可以並行處理流。最終的結果可能會是一個相當大的加速。

0
  1. 尺寸表來自事實表,也許是設計問題。產品暗淡應在您的在線系統中創建

  2. SELECT DISTINCT是目前最好的選擇。也許你可以嘗試加載CSV到哈希分區表分區由product_id