L'exécution de SqlCommand est ralentie si la window de requête de Management Studio n'est pas ouverte

J'ai travaillé actuellement sur une application qui est supposée tester certains scénarios pendant l'exécution de SQL Server, comme par exemple la réinitialisation d'un PC, comme si le courant était tombé.

Le code est assez simple, j'ai déclaré une class statique qui contient la déclaration de la SqlConnection:

public static void CreateConnection(ssortingng connectionSsortingng) { connection = new SqlConnection (connectionSsortingng); } 

Et deux classs qui à la fois ouvrir et fermer la connection (fermeture non pertinente pour cette question, mais toujours inséré à des fins de finalisation):

 public static void OpenConnection() { if (connection == null) return; connection.Open (); } public static void CloseConnection() { if (connection == null) return; connection.Close (); } 

Le connectionSsortingng n'a rien de spécial non plus, juste la source de données, le login et le mot de passe, plus de parameters définis pour celui-là.

Ainsi, le process de l'application est le suivant.

  1. Démarrer l'application
  2. Créer une connection
  3. login ouverte
  4. Créer une database si elle n'existe pas
  5. Créer une table si elle n'existe pas et append un index à une colonne
  6. Démarrer un minuteur qui exécute une class qui contient l'instruction INSERT
  7. Exécuter l'application de fermeture (non pertinent)
  8. L'événement de fermeture ferme la connection (non pertinent)
  9. L'application a été fermée (non pertinente)

Désolé pour les étapes 7 à 9, n'a pas pu résister à les insert.

Le Timer qui exécute cette instruction INSERT s'exécute à chaque fois dans un intervalle de 50 ms, et bien sûr, à partir des étapes 3 à 6, je n'ai jamais fermé l'application ou la connection, je laisse juste l'ouvrir.

Maintenant, voici le comportement étrange que j'ai trouvé intéressant et j'ai décidé de requestr ici car je ne pouvais rien find en ligne: Vous pouvez littéralement remarquer le bégaiement dans le countur que j'ai inséré sur l'interface graphique pour suivre la vitesse d'exécution, exemple: 1 2 3 4 .. 5 6 7 8 .. 9 10 11 12 …. et ainsi de suite, il y a un bégaiement visible.

Maintenant, voici la chose étrange, dès que j'ouvre Management Studio 2014, naviguez vers ma database et ouvrez la window "New Query", l'instruction INSERT devient flamboyant rapidement sur mon application! Ce qui auparavant avait du bégaiement fonctionnait comme un Golf MK2 de 800 chevaux, absolument fluide comme je m'attendais au moment où je l'ai écrit, plus de bégaiement comme expliqué plus haut.

Et après la fermeture de Management Studio, je reviens au bégaiement jusqu'à ce que je recommence à utiliser New Query. Quelle pourrait en être la cause?

Oh, bien sûr, voici ma déclaration INSERT, désolé pour la longue lecture:

 public static void InsertValues(ssortingng tableName, ssortingng dbName) { ssortingng query = @"INSERT INTO " + dbName + ".dbo." + tableName + " VALUES ('" + Text + "','" + Date + "')"; using (var command = new SqlCommand (query, connection)) { command.ExecuteNonQuery (); } } 

Définissez l'option de database AUTO_CLOSE sur OFF à l'aide de l'instruction ALTER DATABASE . L'effet que vous voyez peut être provoqué par la fermeture de la database après l'exécution de votre command en raison de la fermeture de la connection, rendant nécessaire la réouverture complète de la database pour l'exécution ultérieure de la command. L'ouverture d'une window de requête ouvre et maintient une connection, empêchant ainsi la fermeture automatique de toute la database.

Comme Management Studio et SqlConnection ont des valeurs par défaut SET différentes, ces commands set sont exécutées automatiquement pour configurer l'environnement d'exécution. SQL Profiler peut être utilisé pour surveiller quelles commands SET sont émises par SSMS et .NET afin que vous puissiez find d'autres différences. Vous pouvez surveiller la différence entre ces commands set en utilisant Profiler.

Vous pouvez essayer ces instructions Set dans votre code C # comme ceci et comparer les résultats.

 SqlCommand comm = new SqlCommand("SET ARITHABORT ON", connection) 

Merci à cynic j'ai réussi à corriger le bégaiement en mettant AUTO_CLOSE à OFF. J'ai utilisé la requête suivante au cas où quelqu'un en aurait besoin à l'avenir:

 EXECUTE sp_MSforeachdb ' IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER DATABASE [?] SET AUTO_CLOSE OFF WITH NO_WAIT'') ' 

Ce que j'ai obtenu d' ici .

Bien sûr, je n'ai fait cela que parce que j'avais plusieurs DB, si vous avez seulement besoin de faire ça:

 ALTER DATABASE DBNAME SET AUTO_CLOSE OFF