2017-01-25 2 views
0

Ich habe eine SQL Server 2016-Datenbank auf zwei verschiedenen Maschinen, eine Produktionsumgebung und Entwicklungsumgebung, beide Kopien von einander mit der Produktionsdatenbank mit ein paar Monaten im Wert von zusätzlichen Daten (1 oder 2% mehr).SqlDataAdapter.Fill Timeout auf einem Server, aber nicht die anderen

Mein Problem ist, dass ich eine gespeicherte Prozedur habe, wenn die DbDataAdapter.Fill(command)-Methode Timeout, wenn die Verbindungszeichenfolge auf den Produktionsdatenbankserver verweist, und sofort ausgeführt wird, wenn mit dem Datenbankserver verbunden ist.

Alles andere ist gleich, die gespeicherte Prozedur und die Parameter.

Wenn ich die gespeicherte Prozedur direkt mit SQL Server Management Studio für die Datenbank ausführen, läuft es in weniger als 1 Sekunde auf dem Produktionscomputer und auf dem Dev-Computer.

Was kann ich noch untersuchen? Ich

verloren

Code:

SqlCommand cmdDev = new SqlCommand(); 
cmdDev.Connection = new SqlConnection("Data Source=xxx.xx.x.53;Initial Catalog=Dev;Persist Security Info=True;User ID=userid;Password=password"); 
cmdDev.CommandText = "spName"; 
cmdDev.Parameters.Add(new SqlParameter("@OwnedByCompanyID", "100")); 
cmdDev.Parameters.AddWithValue("@ClientCompanyID", "0"); 
cmdDev.Parameters.AddWithValue("@UserID", "0"); 
cmdDev.Parameters.AddWithValue("@UserID2", "0"); 
cmdDev.Parameters.AddWithValue("@BranchID", "0"); 
cmdDev.Parameters.AddWithValue("@Search", ""); 
cmdDev.Parameters.AddWithValue("@Archived", "0"); 
cmdDev.CommandType = System.Data.CommandType.StoredProcedure; 
SqlDataAdapter adapterDev = new SqlDataAdapter(cmdDev); 
DataTable dtDev = new DataTable(); 
adapterDev.Fill(dtDev); //runs instananeously, and also instantaneously when executed in SSMS 

SqlCommand cmdProd = new SqlCommand(); 
cmdProd.Connection = new SqlConnection("Data Source=xxx.xx.x.55;Initial Catalog=Prod;Persist Security Info=True;User ID=userid;Password=password"); 
cmdProd.CommandText = "spName"; 
cmdProd.Parameters.AddWithValue("@OwnedByCompanyID", "100"); 
cmdProd.Parameters.AddWithValue("@ClientCompanyID", "0"); 
cmdProd.Parameters.AddWithValue("@UserID", "0"); 
cmdProd.Parameters.AddWithValue("@UserID2", "0"); 
cmdProd.Parameters.AddWithValue("@BranchID", "0"); 
cmdProd.Parameters.AddWithValue("@Search", ""); 
cmdProd.Parameters.AddWithValue("@Archived", "0"); 
cmdProd.CommandType = System.Data.CommandType.StoredProcedure; 
SqlDataAdapter adapterProd = new SqlDataAdapter(cmdProd); 
DataTable dtProd = new DataTable(); 
adapterProd.Fill(dtProd); //runs for 30+ seconds then times out, but instantaneously when ran in SSMS 
+0

Fügen Sie den Code ... – Gusman

+0

@Gusman Der Code ist identisch mit Ausnahme der IP-Adresse. Ich frage nicht unbedingt nach der Lösung, sondern nach allem anderen, was ich untersuchen kann. Der Code ist groß und komplex und nicht einfach für die Veröffentlichung zu minimieren. –

+0

Dann wird es niemand geben, der Ihnen helfen kann, wir können den Code, die Prozedur oder nichts sehen ... – Gusman

Antwort

0

läuft für mehr als 30 Sekunden, dann mal aus, aber sofort, wenn in SSMS lief

Dies könnte eine Reihe von Dingen bedeuten, aber wahrscheinlich sein Parameter Sniffing

Es gibt ein paar Strategien, wie man damit umgeht, Ozar deckt sie ziemlich gut in this post

Verwandte Themen