C # Получение размера данных, возвращаемых из SQL-запроса

2

Как я могу получить размер в байтах данных, возвращаемых из базы данных при выполнении запроса? Причиной этого является сравнение нагрузки на сервере базы данных с использованием двух разных методов. Мы запускали отчеты, созданные из одного набора данных, который загружал весь набор данных для каждого отчета. Теперь мы кэшируем набор данных и запускаем отчеты из кеша. Мы запускаем отчеты на одного клиента, некоторые наборы данных значительно больше, чем другие, и мне нужно каким-то образом дать измеримую метрику для снижения нагрузки на сервер базы данных.

Я пробовал просматривать DbConnection, DbDataReader и DbCommand для любых существующих функций, но не смог его найти. Было бы здорово измерить пропускную способность данных данного соединения или считывателя, если это возможно, но любые решения приемлемы. Возможно, есть прокси-сервер базы данных, который я могу использовать для его измерения?

База данных - это Oracle 10g.

  • 0
    Я не знаю, может ли это помочь вам в вашей конкретной ситуации, но вы пробовали SQL Server Profiler?
  • 0
    Я должен был быть более конкретным, это база данных Oracle 10g.
Теги:
database
metrics
oracle10g

4 ответа

3
Лучший ответ

Одной из возможностей было бы просто использовать сетевой снифер. Wireshark удивительно хорошо. Было бы сложно измерить соединение (при использовании нескольких соединений на данной машине), но вы можете использовать его для измерения всего трафика на клиентскую машину и с нее. Одним из преимуществ этого является то, что он также будет измерять исходящие запросы, которые должны быть небольшими в вашей ситуации (генерация отчетов), но все еще являются частью общей нагрузки.

Другим преимуществом измерения этого способа является то, что он найдет различия (если они есть) в размере запрашиваемых запросов. Например, если один метод заставлял отдельные записи считываться с сервера в отдельных запросах, а другой метод вызывал "пакетную" запись записей в одном запросе, вы могли бы увидеть эти различия. Оба метода в этом случае могут показать, что общие данные на уровне DbDataReader одинаковы, но первый метод приведет к значительному увеличению сетевого трафика.

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

  • 0
    Это работало довольно хорошо для моих целей. Я использовал настольное приложение, но я видел, что оно с открытым исходным кодом, поэтому возможно, что я смогу найти способ получить эту информацию из кода. На данный момент это позаботилось о моих потребностях, спасибо.
  • 0
    @NickLarsen: Я рад, что это сработало. Я разработчик клиент-серверного продукта и иногда использую сетевой анализатор именно для этой цели. Мне нравится это, потому что это рисует очень четкую картину того, что происходит.
2

Вы пытались измерить его на стороне базы данных? Oracle 10g появляется целый пакет инструментов настройки производительности и мониторинга.

  • 0
    То, что я прочитал об этой книге до сих пор, было хорошо прочитано, но в основном это инструменты мониторинга производительности, как и то, сколько работы база данных делает для получения наборов данных. Изменение в нашем приложении не изменило фактические запросы, которые выполняются, а только количество выполнений этих запросов.
0

Я не думаю, что есть простой способ сделать это. Чтобы получить метаданные, вам действительно нужны данные, которые будут представлены как DataSet или DataTable, а не через DbDataReader или DataRow, чтобы все ключи, столбцы и метаданные представлялись в целом.

Я сделаю это создание бинарного форматирования и запоминающего потока и сериализация DataSet/DataTable в memystream как двоичные данные. Затем вы можете запросить длину из потока. Это должно довольно точно рассказать вам о размере данных, опубликованных по вашему вопросу.

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

0

вы не можете получить размер результирующего набора, за исключением того, что он цикличен. если вы не можете позволить себе это с точки зрения преформы, вы можете вернуть размер набора результатов с сервера в первой строке набора результатов. или вернуть два набора результатов.

  • 0
    Мы намерены перебрать все это. Меня интересует какой-то способ определения объема данных, отправляемых клиенту с сервера базы данных, включая все метаданные, а не только длины строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню