2011-09-15 9 views
4

SQL Management Studioを使用しているときに実行するSQLクエリが1秒未満ですが、コード実行時に30秒でデータベースサーバーから結果を取得します。結果には1700行が含まれています。 900行を返す別の同様のクエリは、実行に数ミリ秒かかります。この奇妙な行動の理由は何でしょうか?SQLクエリではクエリdbよりも多くの時間がかかります

public SqlDataReader ExecuteReader(string strSQL, ArrayList arParams) 
    { 
     OpenConnection(); 

     SqlCommand myCommand = new SqlCommand(strSQL, myConnection); 
     myCommand.CommandTimeout = intTimeout; 


     foreach (SqlParameter myParameter in arParams) 
      myCommand.Parameters.Add(myParameter); 

     return myCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
    } 

ます。strSQL:

SELECT [Group].[Id] 
     ,[Group].[intCustomerId] 
     ,[Group].[strName] 
     ,[Permission].[dtmCreated] 
     ,[Permission].[intPermissionTypeId] 
     ,[Permission].[intObjectTypeId]   
     ,[Permission].[intObjectId]    
     ,[Permission].[blnActive]    
     ,[Permission].[blnHaveAccess] 
     ,[Permission].[intLevelTypeId]    
FROM [Group] 
LEFT JOIN Permission ON [Group].[Id] = intGroupId AND 
         intObjectId = @ObjectId AND 
         intObjectTypeId = @ObjectTypeId AND 
         intLevelTypeId = @LevelType AND 
         intPermissionTypeId = @PermissionTypeId AND 
         blnActive = 1            
WHERE [Group].[intCustomerId] = @CustomerId AND 
     [Group].[blnDeleted] = 0 
ORDER BY strName, blnActive DESC 

arParams:

arParams.Add(DatabaseHandler.MakeSqlParameter("@CustomerId", customer.Id)); 
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectId", masterprocess.Id)); 
arParams.Add(DatabaseHandler.MakeSqlParameter("@ObjectTypeId", Convert.ToInt32(ObjectType.MasterProcess))); 
arParams.Add(DatabaseHandler.MakeSqlParameter("@PermissionTypeId", Convert.ToInt32(permissiontype))); 
arParams.Add(DatabaseHandler.MakeSqlParameter("@LevelType", Convert.ToInt32(leveltype))); 

がDatabaseHandler.MakeSqlParameter:コメントのお返事に基づいて

public static SqlParameter MakeSqlParameter(String strName, int intInput) 
{ 
    return new SqlParameter(strName, intInput); 
} 
+1

http://stackoverflow.com/questions/1642453/sql-query-and-datetime-parameter-takes-long-time-to-execute&@gbnによる回答をご覧ください。私は、SQLの予想と同期していないSQLParametersのデータ型である可能性があります。例えば、 1つ以上のSQLParameterのパラメータタイプがvarcharであるのに対し、int型である必要があります(SQLが期待するように)。 – shahkalpesh

+0

'parameter sniffing 'の場合がありますが、' strSQL'はリテラルクエリですか、それとも内部的にクエリを呼び出すストアドプロシージャの名前ですか?どちらの場合も同じパラメータ値でテストしますか? –

+0

おそらく、そのボックスに十分なRAMがある場合は投稿しますか?現在のRescourceが待っていることについて、SQL管理ツールから何が言われていますか? – EKS

答えて

1

私は正解がインデックスであると言うでしょう。

最も単純な方法は、通常のクエリを実行した後、SQLのプロファイラを実行した後に少しだけSQLログを実行することです。

推奨事項に基づいて、欠落しているインデックスがある可能性があります。

+1

あなたは正しい方向に私を押し込んだようです。私はインデックスを再構築できることを知りました。私はPermissionテーブルでやりましたが、現在は通常の速度で実行されています。まだ管理スタジオでクエリを実行すると、コードでそれを実行するよりもはるかに速く行くことを理解していない。 –

0

私は同じ問題を抱えていましたが、この問題を見て解決策を考えました。

SQLCommandでパラメーターを使用してクエリを実行すると、クエリは同じに実行されません。ストアドプロシージャヘルパーを使用してパラメータをパッケージ化します。 Execのようなものsp_Execute。

パラメータを置き換えると、改善が見られるはずです(SQLインジェクションのリスクがあることがわかっています)。

また、テーブルの横にWITH(INDEX)を指定して、使用するインデックスを指定することもできます。 (PK索引を試して使用する可能性があるため)。

関連する問題