Simple.Data сгенерированные по умолчанию запросы и производительность
Я подумываю об использовании Simple.Data Micro-ORM для моего веб-сайта ASP.NET 4.5. Тем не менее, есть кое-что, что мне нужно знать, прежде чем решить, использовать это или нет.
Давайте возьмем следующий запрос на соединение, например:
var albums = db.Albums.FindAllByGenreId(1)
.Select(
db.Albums.Title,
db.Albums.Genre.Name);
Этот запрос будет переведен на:
select
[dbo].[Albums].[Title],
[dbo].[Genres].[Name]
from [dbo].[Albums]
LEFT JOIN [dbo].[Genres] ON ([dbo].[Genres].[GenreId] = [dbo].[Albums].[GenreId])
WHERE [dbo].[Albums].[GenreId] = @p1
@p1 (Int32) = 1
Давайте предположим, что таблица "Жанры" - это таблица с тысячами или даже миллионами строк. Я думаю, что может быть очень неэффективно фильтровать данные после того, как произошло СОЕДИНЕНИЕ, для чего этот запрос переведен в Simple.Date.
Было бы лучше отфильтровать данные в таблице Generes, что означает сначала создать команду make SELECT и выполнить JOIN с этой отфильтрованной таблицей?
Не лучше ли отфильтровать данные заранее?
Кроме того, есть возможность сделать этот тип сложного (JOIN на отфильтрованной таблице) запроса с использованием Simple.Data.
Нужен ваш ответ, чтобы узнать, следует ли продолжать с Simple.Data, или смягчить его в пользу другого микро-ORM.
3 ответа
Вы не понимаете, как SQL интерпретируется и выполняется ядром базы данных. Современные базы данных невероятно умны в отношении лучшего способа выполнения запросов, и порядок, в котором инструкции появляются в инструкциях SQL, не имеет ничего общего с порядком их выполнения.
Попробуйте выполнить некоторые запросы через SQL Management Studio и посмотреть на План выполнения, чтобы увидеть, как они на самом деле оптимизируются и выполняются. Или просто попробуйте SQL, который, по вашему мнению, будет работать лучше, и посмотрите, как он на самом деле работает по сравнению с тем, что генерируется Simple.Data.
SQL, который генерирует Simple.Data, - это идиоматический T-SQL, и, честно говоря, это то, что я написал бы, если бы писал сам SQL.
Этот sql позволяет Sql Server оптимизировать план выполнения, что должно означать наиболее эффективный поиск данных.
Прелесть Simple.Data в том, что если у вас есть какие-либо сомнения или проблемы с SQL, который он генерирует, вы можете просто вызвать хранимый процесс:
db.ProcedureWithParameters(1, 2);