2010-12-07 21 views
0

Voici notre table actuelleQuel est le moyen le plus efficace de migrer ces données dans Sql Server?

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

Je veux migrer ces données vers une table séparée:

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

Ma pensée est que la façon la plus efficace serait de le faire:

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 <> '' 

Quelles sont mes autres options? Nous avons parlé de tout de Sql CLR, Temp Tables, ADO.NET, vous l'appelez. Quelle est vraiment la façon la plus efficace de le faire? Gardez à l'esprit que DayPhone, et NightPhone ne font pas partie d'un index, et que j'ai 16MM + enregistrements de visiteurs qui équivaudront à quelque part entre ~ 16MM - ~ 32MM VisitorPhone records.

+0

Si vous avez autant d'enregistrements, un int sera plus petit et plus rapide ... Et varchar (50) pour un numéro de téléphone? N'est-ce pas un peu pesimiste? –

+0

Je ne suis pas intéressé par les commentaires sur la façon dont je stocke les données, mais plutôt sur la façon de les migrer. – Micah

+1

Il existe de nombreuses façons de migrer les données, y compris celles que vous avez mentionnées ainsi que SSIS. Vous pouvez les profiler tous et trouver la meilleure façon, mais je suppose que le profilage prendrait plus de temps que la migration et je devinerais que les instructions INSERT que vous avez montrées ci-dessus seraient le moyen le plus rapide. –

Répondre

1

J'aurais fait la migration comme vous l'avez déjà suggéré. Le problème est qu'une ligne de visiteur génère zéro, une ou deux lignes dans la table VisitorPhone. Si c'était Oracle, vous auriez eu la syntaxe "INSERT ALL" qui vous permet de faire cela. Peut-être qu'une syntaxe similaire est disponible dans SQL Server?

Toute approche procédurale est susceptible d'être surpassée par une approche basée sur un ensemble. Vous pouvez faire quelque chose de compliqué comme vous joindre à une table fictive et déterminer combien de fois chaque rangée de visiteurs sera dupliquée (0 = pas de téléphone, 1 a un téléphone jour/nuit, 2 a les deux). Vous utiliseriez alors case-when logic pour déterminer comment encoder la ligne. 30 millions de lignes n'est pas une énorme quantité de données sur quelque chose de plus grand que votre ordinateur portable de développement typique. Je pense que trouver et tester une approche alternative prendrait plus de temps que de simplement exécuter les deux déclarations. De plus, votre solution actuelle est facilement documentée.

Assurez-vous simplement de créer les index par la suite. Pourquoi ne pas avoir une colonne entière à la place de l'étiquette varchar?