Прежде всего, получение всех данных из удаленной базы данных никогда не является хорошей идеей. Вы используете важную долю пропускной способности. Надеемся, что используемый вами запрос используется только для целей отладки и никогда не должен попадать в производство.
Вы не упомянули, прошло ли 5 минут, прежде чем вы начали что-то получать, или вы получали данные в течение этих 5 минут с постоянной скоростью.
В первой ситуации отсутствие приема строк может указывать на то, что блокировка действует для вашей таблицы из-за другой операции.
В последнем случае вы постоянно получаете строки, но с низкой скоростью. Пропускная способность и нагрузка на сервер играют большую роль в этом. Чтобы получить приблизительное представление о количестве загружаемых данных, запустите следующую хранимую процедуру:
EXEC sp_spaceused 'YourTableName';
Учтите, что сервер должен загрузить эти данные и что вы должны загрузить данные.
Двоичные и XML-поля (также называемые BLOB-полями) обычно занимают много данных, и вы, возможно, не сможете контролировать объем данных, хранящихся пользователем в этих полях.
Попробуйте проверить размер полей переменной длины (varchar, xml и varbinary), запустив DATALENGTH для вашего столбца:
SELECT DATALENGTH(MyField) FROM MyTable
Вы также можете получить среднее значение:
SELECT AVG(DATALENGTH(MyField)) FROM MyTable
Хорошая идея относительно поля BLOB - извлекать их только тогда, когда вам нужно, а не когда вы загружаете список данных.
Например, предположим, что поле XML хранится в таблице PurchaseOrder
. Если вы хотите отобразить список PO для вашего пользователя, вам обычно не нужно извлекать это поле, если только пользователь не открывает PO.
Многие недавние ORM, такие как nHibernate, предлагают ленивую загрузку для столбцов наряду с подкачкой страниц, так что вы можете извлечь небольшое количество строк.
Ayende опубликовал арендную плату о загрузке неограниченного набора результатов две недели назад.