2009-04-09 6 views
0

j'ai deux tables qui ressemble à ceci:efficaces one-to-many inserts en C# et MSSQL

News: (ID, Title, TagID) 
Tags: (ID, Tag) 

Chaque nouvelles ne peut avoir une étiquette. Quel est le moyen le plus efficace de gérer les insertions à la table des actualités? La table Tags a environ 50 000 lignes.

Je ne fais que des inserts en vrac d'env. 300 nouvelles à la fois, environ 2 fois par heure. Je suppose que j'ai besoin d'un cache en mémoire pour les balises?

Si la balise ne se trouve pas dans la table des balises, je dois l'insérer et définir TagID sur l'identifiant nouvellement inséré.

J'espère que vous aurez l'idée!

Répondre

0

Je suppose à chaque élément de nouvelles que vous obtiendrez une liste de chaînes qui sont les soi-disant « balises ». À partir de la structure que vous avez donnée, vous ne pouvez avoir qu'une seule étiquette sur chaque article? Cela semble inhabituel, mais ce qui suit s'applique de toute façon.

Si votre table Tags a un index dessus, les recherches seront vraiment rapides, et la base de données s'occupera de la mise en cache de toute façon, donc ne vous inquiétez pas de la mise en cache. Vous serez étonné combien la base de données peut accélérer les choses lorsque vous avez des index au bon endroit

Faites un choix parmi les Tags où Tag = whatever1 (faites ceci pour chaque tag), à chaque fois si aucune ligne n'est retournée insérez-la , sinon utilisez l'identifiant que vous avez trouvé pour le faire. Exécutez le proc sur chaque INSERT.

+0

Merci, j'ai testé ça et ça marche très bien. – alexn

1

Quelle version de SQL Server utilisez-vous en arrière-plan? Si vous utilisez SQL Server 2008, je recommande de charger en bloc les tags et les nouvelles de chaque jour dans une table de travail temporaire, puis d'utiliser l'instruction MERGE pour mettre à jour la table Tags et News de ces tables de travail . J'utiliserais la classe C# "SqlBulkCopy" pour cela. MERGE vous permet d'insérer facilement uniquement les éléments qui ont changé, et éventuellement de mettre à jour ceux qui existent déjà, le tout en une seule instruction SQL pratique. Si vous utilisez SQL Server 2005 ou une version antérieure, vous pouvez faire la même chose, mais vous devrez écrire du code (C# ou T-SQL) pour vérifier manuellement ce qui doit être inséré à partir de votre charge de travail temporaire. tables, et ce qui est déjà présent.

Marc

Questions connexes