powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скачивание большого BLOB через ADO.NET
25 сообщений из 32, страница 1 из 2
Скачивание большого BLOB через ADO.NET
    #39737094
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не смог нагуглить подобную проблему.

Храню файл в MSSQL в varbinary(max)
Тупая таблица id+content
Загружаю и выгружаю с помощью ADO.NET

Сервер БД удаленный, канал широкий. Сохранение в БД файла происходит достаточно быстро 10Мб - 5 сек, 50Мб - 20сек.
Но вот скачивание разительно отличается. 10Мб - 5 сек, 50Мб - 100 сек.
Торможение происходит непосредственно на выполнении запроса - ExecuteScalarAsync или ExecuteReaderAsync
По профайлеру вижу, что почти все 100 сек тратятся на выполнение запроса. Если этот запрос выполнить из студии - всё ок, тормозов нет.
Код примерно такой

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
			var command = new SqlCommand();
			command.Connection = await GetConnection().ConfigureAwait(false);
			//command.CommandText = @"SELECT Cont FROM Cont WHERE Id=@Id";
			command.CommandText = $"SELECT Cont FROM Cont WHERE Id={id}";
			//command.Parameters.Add(new SqlParameter { ParameterName = "@Id", Value = id });
			//var res = await command.ExecuteScalarAsync().ConfigureAwait(false);
			//return (byte[])res;
			var reader = await command.ExecuteReaderAsync().ConfigureAwait(false);
			await reader.ReadAsync().ConfigureAwait(false);
			var res = reader.GetSqlBinary(0);
			reader.Close();
			return res.Value;



Можно, конечно, читать файл по частям и собирать на сервере приложений, но может есть способ проще?
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737138
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Пробуй без async для теста.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737139
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Shocker.Pro,
Пробуй без async для теста.то же самое
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737146
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro123Shocker.Pro,
Пробуй без async для теста.то же самоетолько менять все частями. Может с настройками сети что? Размер пакетов....
Проще запустить на другой машине, сменить дрова, базу.
У меня сиквела нету. Оракл и постгри.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737151
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тупой вопрос: индекс по id есть?

Если интенсивная вставка идет и записи не меняются то
Код: c#
1.
command.CommandText = $"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SELECT Cont FROM Cont WHERE Id={id}";
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737154
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При запуске сервера приложений на сервере (ближе к серверу БД и дальше от клиента) - то же самое.
Еще заметил, пока выполняется этот запрос, на сервере приложений сильно поднимается использование процессора.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737157
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТупой вопрос: индекс по id есть?

Если интенсивная вставка идет и записи не меняются то
Код: c#
1.
command.CommandText = $"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SELECT Cont FROM Cont WHERE Id={id}";

не, с этой базой ничего не происходит, кроме моих экспериментов.

id - кластерный
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proне, с этой базой ничего не происходит, кроме моих экспериментов.

id - кластерный
Претензию в MS напиши, явно же их косяк.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737175
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737178
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserShocker.Pro, це классика - ms sql быстро в студии медленно в приложении И какой момент из этого цикла статей мне мог бы быть полезен в моем случае?
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737226
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proна сервере приложений сильно поднимается использование процессора.там еще есть вкладка Передано байт по сети. И это же в значке сети - свойства сетевого подключения.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737272
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПо профайлеру вижу, что почти все 100 сек тратятся на выполнение запроса. Если этот запрос выполнить из студии - всё ок, тормозов нет.

а какой конкретно запрос показывается в профайлере, и с каким планом выполнения?
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737285
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,
+1
Надо сверять планы выполнения.
Скорее всего причина банальная. Окапечатка, невнимательность.
Проверь все на свежую голову.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737302
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Shocker.Pro, вчера, 19:04 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1305767&msg=21741945][21741945]

>Что-то не смог нагуглить подобную проблему…
<Посмотри здесь .
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737393
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordа какой конкретно запрос показывается в профайлере, и с каким планом выполнения?Так план-то тупейший, тут планировать нечего - кластерный индекс.
КМК, проблема где-то с выделением памяти на стороне сервера приложений что ли...
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737397
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Что-то не смог нагуглить подобную проблему…
<Посмотри здесь .
Еще раз. Базу пока никто не эксплуатирует, пользователей нет. Единственная таблица с двумя полями. Выборка одной записи по кластерному индексу, тут в принципе нечему тупить. Выборка контента небольшого размера осуществляется в разумное время. Тут, как мне кажется, проблема не на стороне СУБД вообще.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737400
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Пробуй не ридером получить, а DataAdapter
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737411
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, может вы чего то не договариваете? Или что-то не то сравниваете? в профайлере часом не sp_executesql?
простой тест в ssms:
Код: sql
1.
2.
3.
4.
set arithabort off
SELECT Cont FROM Cont WHERE Id=42
set arithabort on
SELECT Cont FROM Cont WHERE Id=42
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737424
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserShocker.Pro, может вы чего то не договариваете? Или что-то не то сравниваете? в профайлере часом не sp_executesql?если выполняю с параметрами, то sp_executesql, если с простой подстановкой - то прямой запрос (см. закомментированные строки в моем первом посте). Оба варианта выполняются 100 секунд.

buserпростой тест в ssms:одинаково. 6 секунд для 50Мб файла.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737426
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Пробуй не ридером получить, а DataAdapterСм. закомментированные строки - я даже вообще без любого ридера пытаюсь получить набор байт - результат тот же. Датаадаптер - всего лишь надстройка над ридером.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737438
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТак план-то тупейший, тут планировать нечего - кластерный индекс.
КМК, проблема где-то с выделением памяти на стороне сервера приложений что ли...
я имел ввиду sql profiler, если запрос отобажаемый в нем (именно в нем, а не напрямую в студии или еще как) показывает что запрос отрабатывает быстро, то база точно непричем. Тогда можно было-бы либо попробовать какой-нибудь другой метод доступа (другую либу, EF итд), либо разобраться с какого именно размера файлы начинают тормозить (раз написал что 10 метров скачивается быстро)
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737439
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProPetro123Пробуй не ридером получить, а DataAdapterСм. закомментированные строки - я даже вообще без любого ридера пытаюсь получить набор байт - результат тот же. Датаадаптер - всего лишь надстройка над ридером.
Это?
return (byte[])res;
Хммм. Не знал.
Ну тогда труба твое дело.
Меняй машину, жену, дом и компьютер)).
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737444
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordя имел ввиду sql profiler, если запрос отобажаемый в нем (именно в нем, а не напрямую в студии или еще как) показывает что запрос отрабатывает быстро, то база точно непричем.Shocker.ProПо профайлеру вижу, что почти все 100 сек тратятся на выполнение запросаНо база все равно может быть не причем, так как завершение запроса в профайлере будет показано только тогда, когда клиент заберет все данные.
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737450
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, тут несколько букв... не знаю, может похоже на ваш кейс Horrible performance when using SqlCommand Async methods
...
Рейтинг: 0 / 0
Скачивание большого BLOB через ADO.NET
    #39737455
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserShocker.Pro, тут несколько букв... не знаю, может похоже на ваш кейс Horrible performance when using SqlCommand Async methods Похоже, однако, спасибо!

Я для начала нафиг убрал вообще все асинхронные вызовы, включая коннекшен и обернул все в один общий Task.Run - все стало летать.
Ща поэкспериментирую, на чем именно затыкалось.

ЗЫ: А Петя был прав с самого начала. Я изначально пробовал без Async, но без ридера кажется.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скачивание большого BLOB через ADO.NET
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]