Question

J'ai un très grand ensemble de données (~3 millions d'enregistrements) qui doit être fusionné avec les mises à jour et de nouveaux enregistrements sur un horaire quotidien.J'ai une procédure stockée qui fait de casser le record établi en 1000 enregistrer des morceaux et utilise le MERGE commande avec des tables temporaires dans une tentative pour éviter le blocage de la table en direct alors que les données est mise à jour.Le problème est qu'il n'a pas exactement de l'aide.Le tableau "bloque" et notre site web qui utilise les données reçoit des délais d'attente lors de la tentative d'accès aux données.J'ai même essayé de le diviser en 100 enregistrer des morceaux et même essayé de faire une WAITFOR DELAY '000:00:5' pour voir si cela peut aider à mettre en pause la fusion entre les morceaux.C'est encore assez lent.

Je suis à la recherche de toutes les suggestions, les meilleures pratiques, ou des exemples sur la façon de fusionner les grands ensembles de données sans verrouiller les tables.

Merci

Était-ce utile?

La solution

Changer votre front-end à utiliser NOLOCK ou READ UNCOMMITTED lors de la sélectionne.

Vous ne pouvez pas NOLOCK de FUSION,d'INSÉRER ou de mettre à JOUR que les dossiers doivent être verrouillé afin d'effectuer la mise à jour.Cependant, vous pouvez NOLOCK la SÉLECTIONNE.

Notez que vous devez utiliser cette fonction avec prudence.Si les lectures erronées sont d'accord, puis aller de l'avant.Toutefois, si le lit nécessitent la mise à jour de données, alors vous devez aller vers le bas un chemin différent et de voir exactement pourquoi la fusion de 3M dossiers est à l'origine d'un problème.

Je serais prêt à parier que la plupart du temps est consacré à la lecture des données à partir du disque lors de la commande de fusion et/ou de travail autour de peu de mémoire.Vous pourriez être mieux de simplement farce de plus de mémoire vive à votre serveur de base de données.

La quantité idéale serait d'avoir assez de ram pour tirer l'ensemble de la base de données dans la mémoire nécessaire.Par exemple, si vous avez 4 go de base de données, alors assurez-vous d'avoir 8 go de RAM..en x64, server de cours.

Autres conseils

J'ai peur que j'ai tout à fait l'opposé de l'expérience.Nous avons été effectuer les mises à jour et des insertions où la table source avait seulement une fraction du nombre de lignes que la table cible, qui était dans les millions.

Lorsque nous avons combiné la source d'enregistrements de la table à travers l'ensemble de la durée de la fenêtre, puis effectué la FUSION juste une fois, nous avons vu une augmentation de 500% de rendement.Mon explication à cela est que vous payez pour le front de montée de l'analyse de la commande de FUSION, juste une fois, au lieu de plus et plus de nouveau dans une boucle serrée.

En outre, je suis certain que la fusion de 1,6 million de lignes (source) dans 7 millions de lignes (cible), par opposition à 400 lignes dans 7 millions de lignes de plus de 4000 opérations distinctes (dans notre cas) s'appuie sur les fonctionnalités du moteur SQL server beaucoup mieux.Encore une fois, une bonne quantité de travail est dans l'analyse des deux ensembles de données, et c'est fait qu'une seule fois.

J'ai une autre question à poser est bien, c'est que vous êtes au courant que la FUSION de commande effectue beaucoup mieux avec index à la fois sur les tables source et cible?Je tiens à vous référer au lien suivant:

http://msdn.microsoft.com/en-us/library/cc879317(v=SQL.100).aspx

À partir de l'expérience personnelle, le principal problème avec la FUSION est que depuis qu'il n'verrouillage de page il s'oppose à toute simultanéité dans votre Insère dirigé vers une table.Donc, si vous allez en bas de cette route, il est fondamental que vous le lot de toutes les mises à jour qui sera frappé d'une table dans un seul écrivain.

Par exemple:nous avons eu une table sur laquelle INSÉRER pris un fou de 0,2 secondes par l'entrée, la plupart de ce temps semble être gaspillé sur l'opération de verrouillage, de sorte que nous sommes passés à l'aide de FUSION et quelques tests rapides ont montré qu'il nous a permis d'insérer 256 entrées de 0,4 secondes ou même de 512 en 0,5 secondes, nous l'avons testé avec des générateurs de chargement et tout semblait aller pour le mieux, jusqu'à ce qu'il atteint un niveau de production et tout bloqué à l'enfer sur les verrous de page, résultant dans une plus faible du débit total de l'individu s'Insère.

La solution n'était pas seulement le lot des entrées à partir d'un seul producteur dans une opération de FUSION, mais aussi à le lot le lot de producteurs va individu DB en une seule opération de FUSION avec un niveau supplémentaire de file d'attente (auparavant également d'une connexion unique par DB, mais l'utilisation de MARS à interleave tous les producteurs appel à la procédure stockée faire la FUSION de la transaction), de cette façon, nous étions alors en mesure de gérer plusieurs milliers de plaquettes par seconde sans problème.

Avoir la NOLOCK sur l'ensemble de votre front-end lit est un must absolu, toujours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top