April 2015 Blog Posts

EF6 + async + varbinary(max)

05 April 2015 |

Неожиданных bug EntityFramework, есть 2 таблицы: AbstractObject ссылаетс на FileData, при этом в FileData есть столбец типа varbinary(max). Записей в таблице мало (по 2 строки в каждой), при этом в столбце varbinary(max) таблицы FileData содержится порядка 30Мб данных. Обычная ситуация – всё максимально просто и запрос который вызвал проблемы тоже очень простой.

var q = from cf in ctx.AbstractObject
        where cf.Id == id
        select cf.FileData;
return await q.FirstAsync();

Но он выполняется порядка 7 секунд! как такое возможно. Ответ: потому что EF6, потому что async, потому что varbinary(max), потому что запрос такой… Подробно ответ на почему, хорошо описан здесь: Entity Framework async operation takes ten times as long to complete

Печальней всего это “не баг”, сложно избежать такого поведения и рекомендация – не используйте async, если встречаются значения большого размера в столбцах.

var q = from cf in ctx.AbstractObject
        where cf.Id == id
        select cf.FileData;
return q.First();

Было неожиданностью такое серьезное влияние на производительность асинхронности в EF.