TSQL - 从不同来源汇总数据...重构PK和FK

问题描述:

我有各种办公室和一个*总部。每个办公室都有自己的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

这可能只是一个部分的答案。您可能需要考虑在每个临时表上放置一个通用的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 
);