SQL查询在代码中比查询db direct需要更长的时间

时间:2011-09-15 07:49:24

标签: c# sql ado.net

我有一个SQL查询,在我使用SQL Management Studio时执行时间不到一秒,但是当我的代码执行它时,从数据库服务器获取结果需要30秒以上。结果包含1700行。另一个返回900行的类似查询需要几毫秒才能执行。这种奇怪的行为可能是什么原因?

    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);
}

2 个答案:

答案 0 :(得分:1)

根据您对评论的回复,我会说正确的解决方案是索引。

最简单的方法是在运行普通查询时运行sql日志记录,然后运行sql profiler运行。

根据其建议,它可能会发现缺少索引。

答案 1 :(得分:0)

我遇到了同样的问题,但在看这个问题时想到了解决方案。

使用带参数的SQLCommand运行查询时,查询的执行不相同。它使用存储过程帮助程序打包参数。类似于Exec sp_Execute。

如果你进行参数替换,你应该注意到一个改进(我知道存在SQL注入的风险)。

您还可以进一步指定表格旁边的WITH(INDEX)以指定要使用的索引。 (因为它可能会尝试使用PK索引)。