У меня EF с LINQ с SQL Server в моем проекте долгое время.
И я искал способ улучшить производительность моих запросов к БД.И я много читал о Dapper и процедурах, которые работают быстрее, чем EF.Я добавил Dapper в проект, я добавил процедуру .... но мои тесты показали странные результаты.EF, Dapper и хранимые процедуры дают почти одинаковые результаты - никаких преимуществ.
Прежде всего, я проверил запрос с большим количеством Join.Я получил почти такие же результаты между Dapper и Процедурой и EF.Тогда я решил сделать тест с одной простой таблицей без отношений.
У меня есть таблица ZipCodes.Есть 43200 записей.
Таблица ZipCode
Я провел тестирование на 1 000 записей, 10 000 записей и 43200 записей, используя EF, Dapper, хранимую процедуру и запросв SQL Server.
Dapper
string query =
"SELECT TOP (43200) [Zip]\r\n ,[City]\r\n ,[State]\r\n ,[Latitude]\r\n ,[Longitude]\r\n ,[TimeZone]\r\n ,[DST]\r\n FROM [dbo].[ZipCodes]";
using (IDbConnection connection = new SqlConnection(_connectionString))
{
var result = connection.QueryAsync<ZipCodes>(query).Result.ToList();
return result;
}
EF
var zip = db.ZipCodes.AsNoTracking().Take(43200).ToList();
Хранимая процедура
ALTER PROCEDURE [dbo].[ZIPTest]
AS
BEGIN
SELECT TOP (43200)
[Zip], [City], [State], [Latitude], [Longitude], [TimeZone], [DST]
FROM
[dbo].[ZipCodes]
END
Запрос в SQL Server со временем
SELECT GETDATE();
SELECT TOP (43200)
[Zip], [City], [State], [Latitude], [Longitude], [TimeZone], [DST]
FROM
[dbo].[ZipCodes]
SELECT GETDATE();
В коде я использую Секундомер
string first = "", second = "", third="";
System.Diagnostics.Stopwatch swatch = new System.Diagnostics.Stopwatch();
swatch = new Stopwatch();
swatch.Start(); Dapper request;
Затем
swatch.Stop();
first = swatch.Elapsed.ToString(@"m\:ss\.fff");
swatch = new Stopwatch();
swatch.Start();
И так далее
Результаты: (вмиллисекунды)
1000 10000 43200
-------------------------------------------------
EF 107 1085 4527
Dapper 139 1084 4036
Stored procedure 129 1089 4519
SQL query 8 17 60
Разница между EF, Dapper и хранимой процедурой очень мала.Почему это так?
И почему запрос в SQL Server так быстр, а запросы из кода в 15-70 раз медленнее?
Это нормально или нет?