J'ai un morceau de code qui effectue des insertions dans des tables hautement dénormalisées. Les tableaux ont un nombre de colonnes allant de ~ 100 à 300+. Il s'agit de SQL Server 2008 R2, exécuté sur Windows Server 2008.
Chaque insert consiste à insérer dans un certain nombre de tables sous la même transaction. Certains encarts sont groupés par NHibernate, mais certains ne peuvent pas l'être, mais ils sont néanmoins tous soumis à la même transaction.
Lorsque j'effectue des insertions 500 fois par exemple en appelant à plusieurs reprises un morceau de code qui effectue l'insertion, j'obtiens en moyenne ~ 360 ms.
Le plus étrange est que lorsque j'exécute le code de test simultanément à l'aide de 4 processus (le même exe exécuté à partir de 4 invites de commande différentes sous Windows Server 2008), les performances d'insertion par appel s'améliorent beaucoup. Je vois des rafales qui vont aussi vite que 90 ms (presque X4 plus vite). Je mesure le temps d'insertion du code.
Étant donné que les 4 processus ne se connaissent pas, je suppose que cela a quelque chose à voir avec SQL Server, mais je ne sais absolument pas pourquoi. J'aimerais savoir pourquoi cela se produit et s'il existe une configuration qui me permettrait d'obtenir les mêmes performances lorsque les insertions ne sont pas si fréquentes.
Les suggestions concernant les méthodes de surveillance de SQL Server pour comprendre ce qui se passe au niveau de la base de données sont également les bienvenues.
la source
certains serveurs / cpus / os se souviennent des modèles. comme cache.
Puisque vous faites la même chose 4 fois, je suis sûr qu'il existe des moyens de réduire les coins, ce que je suppose, c'est que la première façon de le faire, il le considère comme un long processus (exemple 1) mais dans le second est voit le code réutilisé et l'exécute comme cache (exemple2) ou il pourrait être le premier processus est trop grand pour tout contenir dans le (exemple de ram3).
exemple1: 0111110000110111110000111011111000011110111110000
exemple2: 0111110000 | 11 | 0111110000 | 111 | 0111110000 | 1111 | 0111110000
exemple3: 0111110000011111000001111100000111110000 exemple3: boucle: 0111110000
Je sais que le serveur Ubuntu le fait avec des requêtes répétées sur mysql. Je peux les enregistrer dans le cache, bien que la seule différence de temps soit de 10 à 40 mm, mais cela s'additionne. Quand j'étais à l'école, il y avait des cours qui montraient qu'il fallait que les programmes (perl / php) utilisent ce cache pour être plus rapides.
Mais, cela peut dépendre du programme, de la langue, de la compilation et de la façon dont il a été programmé.
la source