SQL-запрос занимает гораздо больше времени в коде, чем запрос db direct - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть запрос 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 ]

1 голос
/ 15 сентября 2011

На основании вашего ответа на комментарии я бы сказал, что правильное решение - индексы.

Простейшим способом было бы немного запустить ведение журнала sql при выполнении обычных запросов, а затем запустить запуск профилировщика sql.

Исходя из своих рекомендаций, он может определить недостающие индексы.

0 голосов
/ 06 октября 2011

У меня была такая же проблема, но я думал о решении, глядя на этот вопрос.

Когда вы запускаете запрос, используя SQLCommand с параметрами, запрос НЕ выполняется одинаково.Он использует хелпер хранимых процедур для упаковки параметров.Что-то вроде Exec sp_Execute.

Если вы выполняете замену параметра, вы должны заметить улучшение (я знаю, что есть риск внедрения SQL).

Также вы можете пойти еще дальше и указать WITH(ИНДЕКС) рядом с таблицей, чтобы указать, какой индекс вы хотите использовать.(Потому что он может попытаться использовать индекс PK).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...