2017-12-11 6 views
-1

SQL Server Management Studioで直接SQL文を実行すると非常に高速ですが、C#プログラムで同じ処理を実行しようとすると非常に遅いです!C#プログラムで使用するとSQL SELECTコマンドが遅くなる

public static DataTable GetInfosPrepa(String activite, String depot, String cle_prepa, int sortie, int waiting) 
{ 
     String connectionString = ConfigurationManager.ConnectionStrings["SQLProd"].ToString(); //Récupération de la chaîne de connexion 
     SqlConnection myConnection = new SqlConnection(connectionString); //Nouvelle connexion à la base de donnée 
     myConnection.Open(); //On ouvre la connexion 

     String query = ""; 

     if (waiting == 0) 
     { 
      query = @"Select * from reflex.hlprenp 
         where pecact = @activite 
         and pecdpo = @depot 
         and cast(penann as varchar) + cast(penpre as varchar) = @numero "; 
     } 
     else 
     { 
      query = @"Select * 
         from reflex.hlprenp, reflex.hlprplp, reflex.hlodpep 
         left join reflex.hlvaicp on oenobj = vcnobj 
         where pecact = p1cact 
         and pecdpo = p1cdpo 
         and penpre = p1npre 
         and penann = p1nann 
         and p1cact = oecact 
         and p1cdpo = oecdpo 
         and p1nano = oenann 
         and p1nodp = oenodp 
         and vccicm = 'STATUT' 
         and vcvaic = 'WAITING' 
         and pecact = @activite 
         and pecdpo = @depot 
         and cast(penann as varchar) + cast(penpre as varchar) = @numero "; 
     } 

     if (sortie < 2) 
     { 
      query += "and [email protected]"; 
     } 

     SqlDataAdapter source = new SqlDataAdapter(query, myConnection); 
     source.SelectCommand.Parameters.AddWithValue("@activite", activite); 
     source.SelectCommand.Parameters.AddWithValue("@depot", depot); 
     source.SelectCommand.Parameters.AddWithValue("@numero", cle_prepa); 
     source.SelectCommand.Parameters.AddWithValue("@sortie", sortie); 

     DataTable data = new DataTable(); 

     source.Fill(data); 
     myConnection.Close(); 

     return data; 
    } 

(= 0を待っているとき、要求が遅くなる!):ここでは

がコードです...私は、クエリのためにまったく同じパラメータを使用しますが、それは異なる反応をするようですご協力ありがとうございました !

+0

*「反応が異なるようです」*実際のパフォーマンスデータがありますか、それとも遅く感じますか?あなたはそれを推測するのではなく、パフォーマンスを測定する必要があります。 – Sefe

+0

デバッガを接続せずに実行するとまだ遅いですか? – bornfromanegg

+0

sqlserverの管理スタジオで:1秒未満、C#で:10秒以上... – alexay68

答えて

1

しかし、私がC#プログラムで同じことをしようとすると、非常に遅いです!私は、あなたがSSMSからsp_executesqlを使用する必要があります「とまったく同じパラメータを」使用するには...

をクエリに対してまったく同じパラメータを使用 が、私はあなたがSSMSでvariablesを使用推測 。

あなたの問題はを盗聴パラメータと呼ばれ、これはあなたが本当にパラメータを使用するとき、彼らは最初の実行時に「嗅ぎ」されており、計画は、これらの値「嗅い」のために構築されることを意味します。

variablesをSSMSで使用すると、スニッフィングされません(recompileオプションが指定されている場合を除く)、この場合配信統計は使用できず、実行計画が異なります。

+0

パラメータのスニッフィングを防ぐために何をすべきか分かりません( 'AddWithValue'ではなく' Add')。 –

+0

@Tim Schmelter unknownのためのSQLコード最適化では、パラメータスニッフィングを防止します。私はちょうどC#とAddWithValue/Addについては分かりません。答えを教えてください。私はAddWithValue/Addについてのコメントを見る前に書きました。最初はパラメータをパラメータとして使うのではなく、定数を置くことを想像しています。 – sepupic

関連する問題