2010-12-07 41 views
0

這是我們當前的表在Sql Server中遷移這些數據的最有效方法是什麼?

CREATE TABLE Visitor 
(
    VisitorID bigint, 
    DayPhone varchar(50), 
    NightPhone varchar(50) 
) 

我想這個數據遷移到一個單獨的表:

CREATE TABLE VisitorPhone 
(
    VisitorID  bigint, 
    Label   varchar(50), --Day, Night, Work, Cell, etc. 
    Phone   varchar(50) 
) 

我的想法是,最有效的辦法是做這樣的:

INSERT INTO VisitorPhone(VisitorID, Label, Phone) 
SELECT VisitorID, 'day', DayPhone FROM dbo.Visitor WHERE DayPhone IS NOT NULL AND DayPhone <> '' 

INSERT INTO VisitorPhone(VisitorID, Label, Phone) 
SELECT VisitorID, 'night', NightPhone FROM dbo.Visitor WHERE NightPhone IS NOT NULL AND NightPhone <> '' 

我的其他選擇是什麼?我們已經談到了一切,從Sql CLR函數,臨時表,ADO.NET,你的名字。什麼是最有效的方法呢?請記住,DayPhone和NightPhone不是索引的一部分,並且我有16MM +的訪問者記錄,相當於約16MM到約32MM的VisitorPhone記錄。

+0

爲什麼不用一個整數列代替varchar標籤?如果你有這麼多的記錄一個int會更小,更快......和varchar(50)的電話號碼?這難道不是一點點寬容嗎? – 2010-12-07 15:39:57

回答

1

我會像你已經建議的那樣完成遷移。你的問題是訪客行在VisitorPhone表中生成零個,一行或兩行。如果它是Oracle,那麼您應該擁有「INSERT ALL」語法,這樣您就可以做到這一點。在SQL Server中可能有一些類似的語法?

任何程序方法都可能會通過基於集合的方法表現出色。

您可以做一些複雜的事情,如加入虛擬表格,並確定每個訪客行將被複制多少次(0 =沒有電話,1有日夜電話,2都有)。然後,您將使用case-when邏輯來確定如何對行進行編碼。

對於比典型開發筆記本電腦更大的東西,3000萬行數據量並不是很大。我認爲找到並測試一種替代方法所花費的時間會比執行這兩個陳述花費更長的時間。另外,您目前的解決方案很容易記錄。

只要確保之後創建索引。

相關問題