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

Храню файл в 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
22.11.2018, 20:28
    #39737138
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
Shocker.Pro,
Пробуй без async для теста.
...
Рейтинг: 0 / 0
22.11.2018, 20:29
    #39737139
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
Petro123Shocker.Pro,
Пробуй без async для теста.то же самое
...
Рейтинг: 0 / 0
22.11.2018, 20:44
    #39737146
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
Shocker.ProPetro123Shocker.Pro,
Пробуй без async для теста.то же самоетолько менять все частями. Может с настройками сети что? Размер пакетов....
Проще запустить на другой машине, сменить дрова, базу.
У меня сиквела нету. Оракл и постгри.
...
Рейтинг: 0 / 0
22.11.2018, 20:54
    #39737151
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
Тупой вопрос: индекс по id есть?

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

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

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

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

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

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

>Что-то не смог нагуглить подобную проблему…
<Посмотри здесь .
...
Рейтинг: 0 / 0
23.11.2018, 11:13
    #39737393
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
stenfordа какой конкретно запрос показывается в профайлере, и с каким планом выполнения?Так план-то тупейший, тут планировать нечего - кластерный индекс.
КМК, проблема где-то с выделением памяти на стороне сервера приложений что ли...
...
Рейтинг: 0 / 0
23.11.2018, 11:18
    #39737397
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
ВМоисеев>Что-то не смог нагуглить подобную проблему…
<Посмотри здесь .
Еще раз. Базу пока никто не эксплуатирует, пользователей нет. Единственная таблица с двумя полями. Выборка одной записи по кластерному индексу, тут в принципе нечему тупить. Выборка контента небольшого размера осуществляется в разумное время. Тут, как мне кажется, проблема не на стороне СУБД вообще.
...
Рейтинг: 0 / 0
23.11.2018, 11:31
    #39737400
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
Shocker.Pro,
Пробуй не ридером получить, а DataAdapter
...
Рейтинг: 0 / 0
23.11.2018, 11:42
    #39737411
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
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
23.11.2018, 11:59
    #39737424
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скачивание большого BLOB через ADO.NET
buserShocker.Pro, может вы чего то не договариваете? Или что-то не то сравниваете? в профайлере часом не sp_executesql?если выполняю с параметрами, то sp_executesql, если с простой подстановкой - то прямой запрос (см. закомментированные строки в моем первом посте). Оба варианта выполняются 100 секунд.

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

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

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


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