Подтвердить что ты не робот

Есть что-то быстрее, чем SqlDataReader в .NET?

Мне нужно загрузить один столбец строк из таблицы на SqlServer в массив в памяти с помощью С#. Есть ли более быстрый способ, чем открыть SqlDataReader и пропустить его. Таблица велика, и время имеет решающее значение.

ИЗМЕНИТЬ Я пытаюсь создать .dll и использовать его на сервере для некоторых операций с базой данных. Но на данный момент это замедляется. Если это быстрее, чем я должен переделать базу данных. У меня может быть какое-то решение, как ускорить процесс.

4b9b3361

Ответ 1

Устройство чтения данных

О самом быстром доступе, который вы получите к SQL, относится к SqlDataReader.

Профиль

Стоит на самом деле профилировать, где ваша проблема с производительностью. Обычно, когда вы считаете, что проблема с производительностью, доказано, что она полностью ошибочна после того, как вы ее профилировали.

Например, это может быть:

  • Время... запрос выполняется для запуска
  • Время... данные берутся для копирования по сети/последовательности процессов
  • Время....Net принимает для загрузки данных в память.
  • Время... ваш код принимает что-то с ним

Профилирование каждого из них в отдельности даст вам лучшее представление о том, где находится ваше узкое место. Для профилирования вашего кода есть отличная статья от Microsoft

Кэш

Чтобы улучшить производительность, нужно разработать, если вам нужно каждый раз загружать все эти данные. Можно ли кэшировать список (или его часть)? Взгляните на новое пространство имен System.Runtime.Caching.

Переписать как T-SQL

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

Если ваш код содержит много необходимой процедурной логики, вы можете попробовать смешивать T-SQL с CLR Integration, давая вам преимущества обоих миров.

Это очень похоже на сложность (или более процедурный характер) вашей логики.

Если все остальное не работает

Если все области оптимальны (или как близко), и ваш дизайн не является неисправным. Я бы даже не попал в микро-оптимизацию, я бы просто выбросил в нее оборудование.

Какое оборудование? Попробуйте надежность и производительность монитора, чтобы узнать, где находится горло бутылки. Скорее всего, место для проблемы вы описываете HDD или RAM.

Ответ 2

Если SqlDataReader недостаточно быстро, возможно, вы должны хранить свои файлы в другом месте, например кеш (в памяти).

Ответ 3

Нет. На самом деле это не только самый быстрый способ - это ТОЛЬКО (!). Все остальные механизмы ВНУТРЕННЕ не используют DataReader.

Ответ 4

Я подозреваю, что SqlDataReader примерно так же хорош, как вы собираетесь.

Ответ 5

SqlDataReader - самый быстрый способ. Убедитесь, что вы используете метод get по порядковым методам, а не получите по имени столбца. например GetString (1);

Также стоит экспериментировать с MinPoolSize в строке подключения, чтобы в пуле всегда были некоторые соединения.

Ответ 6

SqlDataReader будет самым быстрым способом. Оптимизируйте его использование, используя соответствующий метод Getxxx, который принимает порядковый номер в качестве параметра.

Если это не достаточно быстро, посмотрите, можете ли вы настроить свой запрос. Поместите индекс покрытия для столбца (столбцов), который вы хотите получить. Таким образом, сервер Sql должен читать только индекс, и ему не нужно напрямую обращаться к таблице, чтобы получить всю необходимую информацию.

Ответ 7

Как преобразовать один столбец строк в одну строку столбцов и прочитать только одну строку? SqlDataReader имеет оптимизацию для чтения одной строки (аргумент System.Data.CommandBehavior.SingleRow ExecuteReader), поэтому, возможно, это может немного улучшить скорость.

Я вижу несколько преимуществ:

  • Улучшение отдельных строк,
  • Не нужно обращаться к массиву на каждой итерации (reader[0]),
  • Клонирование массива (reader) для другого может быть быстрее, чем цикл через элементы и добавление каждого из них в новый массив.

С другой стороны, это имеет недостаток, чтобы заставить базу данных SQL делать больше работы.

Ответ 8

"Предоставляет способ чтения прямого потока строк из базы данных SQL Server" Это использование SqlDataReader из MSDN. Структура данных за SqlDataReder позволяет читать только вперед, оптимизирована для чтения данных в одном направлении. По-моему, я хочу использовать SqlDataReader, чем DataSet для простого чтения данных.

Ответ 9

У вас есть 4 набора накладных расходов - Доступ к диску -.net-код (CPU) - Код сервера SQL (процессор) - Время переключения между управляемым и неуправляемым кодом (cpu)

Во-первых,

select * where column = "junk" 

достаточно быстро для вас, если не единственное решение - сделать диск быстрее. (Вы можете получать данные с SQL Server быстрее, чем читать)

Возможно, вы сможете определить функцию Sql Server в С#, а затем запустить функцию над столбцом; извините, я не знаю, как это сделать. Это может быть быстрее, чем устройство чтения данных.

Если у вас несколько процессоров, и вы знаете значение в середине таблицы, вы можете попробовать использовать несколько потоков.

Возможно, вы сможете написать несколько TSQL, которые объединяют все строки в одну строку, используя разделитель, который, как вы знаете, безопасен. Затем снова разделите строку на С#. Это уменьшит количество переходов между управляемым и неуправляемым кодом.

Ответ 10

Некоторые вещи на уровне поверхности, которые следует учитывать, которые могут повлиять на скорость (помимо считывателя):

  • Оптимизация запросов к базе данных
    • OrderBy стоит дорого
    • Отличный дорогой
    • RowCount стоит дорого
    • GroupBy стоит дорого
    • и т.д.. Иногда вы не можете жить без этих вещей, но если вы можете обрабатывать некоторые из этих вещей в своем коде С#, это может быть быстрее.
  • Индексирование таблицы базы данных (для начальных, являются ли индексы в индексе WHERE)?
  • Таблицы данных таблицы базы данных (используете ли вы минимально возможные данные?)
  • Почему вы преобразовываете datareader в массив?
    • например, будет ли он также служить для создания адаптера /datatable, который вам тогда не нужно будет преобразовывать в массив?
  • Вы заглянули в Entity Framework? (может быть медленнее... но если у вас нет опций, возможно, стоит посмотреть, чтобы убедиться в этом)

Просто случайные мысли. Не уверен, что может помочь в вашей ситуации.

Ответ 11

Если отзывчивость - это проблема загрузки большого количества данных, посмотрите на использование асинхронных методов - BeginReader.

Я использую это все время для заполнения больших элементов GUI в фоновом режиме, в то время как приложение продолжает реагировать.

Вы точно не указали, насколько велики эти данные или почему вы загружаете все это в массив.

Часто для больших объемов данных вы можете оставить его в базе данных или позволить базе данных делать тяжелую работу. Но нам нужно знать, какую обработку вы делаете, которая требует всего этого в массиве за один раз.