우리는 10 개 이상의 하위 항목 (상속 된)을 가진 기본 항목으로 응용 프로그램을 개발하고 있습니다.Linq Entity Inheritance가 BIG SQL 문장을 만듭니다.
Linq로 기본 엔터티에 요청할 때 각 자식에 대해 "UNION ALL"이있는 SQL 문을 가져옵니다. 기본 엔티티에 대해 Count()를 만들려면 1 초 가까이 걸리고 한 행만 가져 오는 데 2 초가 걸릴 수 있습니다. 이 코드에 대한
:public bool Exists(int appId, string loginName, DateTime userRegDate, long ahsayId)
{
var backupsets = from backupset in _entities.AhsayBackupSets
where
backupset.User.Appliance.Id == appId &&
backupset.User.LoginName == loginName &&
backupset.User.RegistrationDate == userRegDate &&
backupset.AhsayId == ahsayId
select backupset;
return backupsets.Count() > 0;
}
, 우리는이 SQL 문장 수 :
당신이 상상할 수 있듯이exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
COUNT(1) AS [A1]
FROM [dbo].[AhsayBackupSets] AS [Extent1]
LEFT OUTER JOIN (SELECT
[UnionAll9].[C1] AS [C1]
FROM (SELECT
[UnionAll8].[C1] AS [C1]
FROM (SELECT
[UnionAll7].[C1] AS [C1]
FROM (SELECT
[UnionAll6].[C1] AS [C1]
FROM (SELECT
[UnionAll5].[C1] AS [C1]
FROM (SELECT
[UnionAll4].[C1] AS [C1]
FROM (SELECT
[UnionAll3].[C1] AS [C1]
FROM (SELECT
[UnionAll2].[C1] AS [C1]
FROM (SELECT
[UnionAll1].[Id] AS [C1]
FROM (SELECT
[Extent2].[Id] AS [Id]
FROM [dbo].[AhsayOracleBackupSets] AS [Extent2]
UNION ALL
SELECT
[Extent3].[Id] AS [Id]
FROM [dbo].[AhsaySystemStateBackupSets] AS [Extent3]) AS [UnionAll1]
UNION ALL
SELECT
[Extent4].[Id] AS [Id]
FROM [dbo].[AhsayMysqlBackupSets] AS [Extent4]) AS [UnionAll2]
UNION ALL
SELECT
[Extent5].[Id] AS [Id]
FROM [dbo].[AhsayMssqlBackupSets] AS [Extent5]) AS [UnionAll3]
UNION ALL
SELECT
[Extent6].[Id] AS [Id]
FROM [dbo].[AhsayFileBackupSets] AS [Extent6]) AS [UnionAll4]
UNION ALL
SELECT
[Extent7].[Id] AS [Id]
FROM [dbo].[AhsayExchangeServerBackupSets] AS [Extent7]) AS [UnionAll5]
UNION ALL
SELECT
[Extent8].[Id] AS [Id]
FROM [dbo].[AhsayDominoBackupSets] AS [Extent8]) AS [UnionAll6]
UNION ALL
SELECT
[Extent9].[Id] AS [Id]
FROM [dbo].[AhsayNotesBackupSets] AS [Extent9]) AS [UnionAll7]
UNION ALL
SELECT
[Extent10].[Id] AS [Id]
FROM [dbo].[AhsayShadowProtectBackupSets] AS [Extent10]) AS [UnionAll8]
UNION ALL
SELECT
[Extent11].[Id] AS [Id]
FROM [dbo].[AhsayWindowsSystemBackupSets] AS [Extent11]) AS [UnionAll9]
UNION ALL
SELECT
[Extent12].[Id] AS [Id]
FROM [dbo].[AhsayExchangeMailBackupSets] AS [Extent12]) AS [UnionAll10] ON [Extent1].[Id] = [UnionAll10].[C1]
LEFT OUTER JOIN [dbo].[AhsayUsers] AS [Extent13] ON [Extent1].[AhsayUserId] = [Extent13].[Id]
INNER JOIN [dbo].[AhsayUsers] AS [Extent14] ON [Extent1].[AhsayUserId] = [Extent14].[Id]
WHERE ([Extent13].[ApplianceId] = @p__linq__0) AND ([Extent13].[LoginName] = @p__linq__1) AND ([Extent14].[RegistrationDate] = @p__linq__2) AND ([Extent1].[AhsayId] = @p__linq__3)
) AS [GroupBy1]',N'@p__linq__0 int,@p__linq__1 nvarchar(4000),@p__linq__2 datetime,@p__linq__3 bigint',@p__linq__0=2,@p__linq__1=N'antonio',@p__linq__2='2009-10-22 18:07:17',@p__linq__3=1256305376226
, 그것은이 경우, 1 초 (시간이 많이 걸립니다,하지만이 4 초가 걸리는 또 다른 문장입니다.)이 쿼리는 여러 번 만들어집니다.
SQL 오버 헤드를 줄일 수있는 방법이 있습니까? 우리는 무거운 문장에 대해 저장 프로 시저를 사용할 수 있지만 Linq의 유연성을 잃고 싶지는 않습니다.
미리 감사드립니다.
yikes! 그 프레임 워크를 사용하지 않아서 다행입니다. – Hogan
참고 사항 : LINQ-to-SQL은 동일한 SQL 생성 엔진을 사용하지만 LINQ-to-SQL은 상속을 지원하지 않습니다. –