Как получить некоторые результаты в середине запроса, используя SqlCommand - PullRequest
0 голосов
/ 20 ноября 2018

Я использую SqlCommand для выполнения запроса, однако этот запрос в целом очень медленный - на его выполнение уходит около 50 секунд - есть ли в любом случае возможность прочитать результаты по мере их поступления?

using (SqlConnection connection = new SqlConnection(ExportMetrics.CreateConnectionString()))
{
    SqlCommand command = new SqlCommand(sqlQuery, connection);
    connection.Open();
    SqlDataReader reader = command.ExecuteReader();

    try
    {
        while (reader.Read())
        {
                //Read results
        }
        catch (Exception e)
        {
            //Exception
        }
        finally
        {  
            reader.Close();
        }
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Чтение результатов «по мере их поступления» - это то, что SqlDataReader уже делает.

Помогает ли это, зависит от запроса.Запросы с агрегатными функциями GROUP BY + или предложениями ORDER BY 1 , как правило, должны материализовать весь набор результатов в памяти сервера, прежде чем они смогут начать возвращать результаты.Другие языковые конструкции также могут требовать этого.Запросы без этих языковых функций могут быть в состоянии начать возвращать результаты быстрее, в зависимости от плана выполнения.

Но 50 секунд - слишком долгое время в мире SQL.Почти всегда есть способ переписать запрос или настроить индексы, чтобы работать намного быстрее.Конечно, мы не сможем помочь с этим, если не сможем увидеть запрос , структуру таблицы и индексацию, перечисленные как часть вопроса.


1 Если предложение ORDER BY соответствует первичному ключу или другим важным индексам относительно JOIN, так что запрошенный порядок соответствует порядку, используемому для рабочего набора запроса, и это может быть математически показано, вы могли бы по-прежнему бытьхорошо.

...