2012-02-01 62 views
1

我有各種辦公室和一箇中央總部。每個辦公室都有自己的SQL Server 2008實例,因此每個辦公室都有自己的數據集和自己的一組ID。TSQL - 從不同來源彙總數據...重構PK和FK

每個辦公室已經將數據導入總部,並將數據存儲在一組看起來像這樣的STAGING_Tables中。

DECLARE @STAGING_COUNTRY TABLE 
(
    Original_CountryID INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    Data VARCHAR(200) NOT NULL 
); 

DECLARE @STAGING_CITY TABLE 
(
    Original_CityID INT NOT NULL, 
    Original_CountryID_FK INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    OtherData VARCHAR(100) NOT NULL 
); 

STAGING_COUNTRY有每一行(其關閉過程將被複制,因爲每個辦公室都會有ID=1的第一行上的Country表),還具有獨特的OfficeID值與Original_CountryID在一起的原始ID。 。具有獨特的價值。

STAGING_CITY也有各行的原始ID,獨特的OfficeID值代表每個辦事處,在這種情況下,FK到CountryID,(當然在這一點上,我們必須結合了Original_CountryID ..that參考可以識別辦公室ID)。

讓我們增加一些虛擬行:

/* ADD DUMMY VALUES TO STAGING_COUNTRY */ 
INSERT INTO @STAGING_COUNTRY 
(Original_CountryID, OfficeID, Data) VALUES (1, 'Office1', 'USA') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (2, 'Office1', 'Canada') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (3, 'Office1', 'Japan') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (1, 'Office2', 'USA') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (1, 'Office2', 'Italy') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (3, 'Office2', 'Canada') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (3, 'Office3', 'Canada') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (2, 'Office3', 'France') 

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data) 
VALUES (3, 'Office3', 'USA') 



/* ADD DUMMY VALUES TO STAGING_CITY */ 
INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, OfficeID, OtherData) VALUES 
(1, 1, 'Office1', 'New York') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (2, 1, 'Office1', 'Vancouver') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (3, 1, 'Office1', 'Tokia') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (1, 2, 'Office2', 'New York') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (2, 2, 'Office2', 'Rome') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (3, 2, 'Office2', 'Vancouver') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (1, 3, 'Office3', 'Vancouver') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (2, 3, 'Office3', 'Paris') 

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, 
OfficeID, OtherData) VALUES (3, 3, 'Office3', 'New York') 

中央總部要運行從幾乎包含了複製的所有辦事處,但爲了使該報告的數據庫優化了所有的數據中心dtabase報告,我們需要重新洗牌了一下STAGING_Tables ...和重組在FINAL_Tables看起來像這樣的數據:

DECLARE @FINAL_COUNTRY TABLE 
(
    CountryID INT IDENTITY PRIMARY KEY, 
    Original_CountryID INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
(
    CityID INT IDENTITY PRIMARY KEY, 
    Original_CityID INT NOT NULL, 
    CountryID_FK INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    OtherData VARCHAR(100) NOT NULL 
); 

問題:
爲了報告目的,FINAL_COUNTRYFINAL_CITY表應儘可能優化。這些報告將用T-SQL存儲過程編寫。

問題:
什麼是重組FINAL_Tables,使每個記錄有一個真正的PK標識符(如在原Office_Tables)的最佳方式和每個FK更新爲指向正確的新創建的PK ..在服務器級別?

注:
請注意,這兩種分期&決賽桌是相同的數據庫裏面,在服務器上。 另外我們仍然需要保留OriginalID s在FINAL_Tables用於其他目的。

目標:
這裏的主要目標是重組爲一組表可以很容易地編入索引的性能的目的。

如果需要,請詢問更多信息。

很多很多先進的感謝...

+0

如果你還沒有,在讀了[**索引視圖**](http://msdn.microsoft.com/en- us/library/dd171921%28v = sql.100%29.aspx),在某些情況下,它們可以大大提升性能。 – 2012-02-03 21:56:13

回答

0

這可能只是一個部分的答案。您可能需要考慮在每個臨時表上放置一個通用的IDENTITY ID。喜歡的東西:

DECLARE @STAGING_COUNTRY TABLE 
( 
    Stage_Country_id INT IDENTITY(1,1) NOT NULL, 
    Original_CountryID INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    Data VARCHAR(200) NOT NULL 
); 

DECLARE @STAGING_CITY TABLE 
( 
    Stage_City_id INT IDENTITY(1,1) NOT NULL, 
    Original_CityID INT NOT NULL, 
    Original_CountryID_FK INT NOT NULL, 
    OfficeID VARCHAR(10) NOT NULL, 
    OtherData VARCHAR(100) NOT NULL 
); 

你的決賽桌不應該有original_ids,你應該只有每個城市/國家1個記錄在其中。

然後我認爲你需要一些交叉參考表來將你的最終表格連接到你的舞臺表。這看起來是這樣的:

DECLARE @COUNTRY_xref TABLE   
( 
    country_xref_id INT IDENTITY(1,1) not null, 
    CountryID INT not null, 
    Stage_Country_id INT    
);   

DECLARE @CITY_xref TABLE   
(   
    city_xref_id INT IDENTITY(1,1) not null, 
    CityID INT not null,   
    Stage_City_id INT not null   
); 

您是否還問加載/轉換過程會是什麼樣子呢?

最終桌可能會是這樣的:

DECLARE @FINAL_COUNTRY TABLE 
( 
    CountryID INT IDENTITY PRIMARY KEY, 
    Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
( 
    CityID INT IDENTITY PRIMARY KEY, 
    CountryID_FK INT NOT NULL, 
    OtherData VARCHAR(100) NOT NULL 
);