C # Получение размера данных, возвращаемых из SQL-запроса - PullRequest
2 голосов
/ 02 марта 2010

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

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

База данных Oracle 10g.

Ответы [ 4 ]

3 голосов
/ 06 марта 2010

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

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

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

2 голосов
/ 07 марта 2010

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

0 голосов
/ 09 марта 2010

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

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

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

0 голосов
/ 02 марта 2010

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

...