Как я могу получить размер в байтах данных, возвращаемых из базы данных при выполнении запроса? Причиной этого является сравнение нагрузки на сервере базы данных с использованием двух разных методов. Мы запускали отчеты, созданные из одного набора данных, который загружал весь набор данных для каждого отчета. Теперь мы кэшируем набор данных и запускаем отчеты из кеша. Мы запускаем отчеты на одного клиента, некоторые наборы данных значительно больше, чем другие, и мне нужно каким-то образом дать измеримую метрику для снижения нагрузки на сервер базы данных.
Я пробовал просматривать DbConnection, DbDataReader и DbCommand для любых существующих функций, но не смог его найти. Было бы здорово измерить пропускную способность данных данного соединения или считывателя, если это возможно, но любые решения приемлемы. Возможно, есть прокси-сервер базы данных, который я могу использовать для его измерения?
База данных - это Oracle 10g.
Одной из возможностей было бы просто использовать сетевой снифер. Wireshark удивительно хорошо. Было бы сложно измерить соединение (при использовании нескольких соединений на данной машине), но вы можете использовать его для измерения всего трафика на клиентскую машину и с нее. Одним из преимуществ этого является то, что он также будет измерять исходящие запросы, которые должны быть небольшими в вашей ситуации (генерация отчетов), но все еще являются частью общей нагрузки.
Другим преимуществом измерения этого способа является то, что он найдет различия (если они есть) в размере запрашиваемых запросов. Например, если один метод заставлял отдельные записи считываться с сервера в отдельных запросах, а другой метод вызывал "пакетную" запись записей в одном запросе, вы могли бы увидеть эти различия. Оба метода в этом случае могут показать, что общие данные на уровне DbDataReader одинаковы, но первый метод приведет к значительному увеличению сетевого трафика.
Wireshark показывает много статистики, которые могут быть полезны для этого. Он может содержать общее количество пакетов, средний размер пакетов, общий размер, средний байт в секунду и т.д.
Вы пытались измерить его на стороне базы данных? Oracle 10g появляется целый пакет инструментов настройки производительности и мониторинга.
Я не думаю, что есть простой способ сделать это. Чтобы получить метаданные, вам действительно нужны данные, которые будут представлены как DataSet или DataTable, а не через DbDataReader или DataRow, чтобы все ключи, столбцы и метаданные представлялись в целом.
Я сделаю это создание бинарного форматирования и запоминающего потока и сериализация DataSet/DataTable в memystream как двоичные данные. Затем вы можете запросить длину из потока. Это должно довольно точно рассказать вам о размере данных, опубликованных по вашему вопросу.
Вероятно, это убийца производительности, поэтому вы можете использовать его только в среде отладки, чтобы понимать размер ваших данных.
вы не можете получить размер результирующего набора, за исключением того, что он цикличен. если вы не можете позволить себе это с точки зрения преформы, вы можете вернуть размер набора результатов с сервера в первой строке набора результатов. или вернуть два набора результатов.