2009-11-25 2 views
0

우리는 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의 유연성을 잃고 싶지는 않습니다.

미리 감사드립니다.

+0

yikes! 그 프레임 워크를 사용하지 않아서 다행입니다. – Hogan

+0

참고 사항 : LINQ-to-SQL은 동일한 SQL 생성 엔진을 사용하지만 LINQ-to-SQL은 상속을 지원하지 않습니다. –

답변

1

와우 .. 긴 쿼리 문자열입니다. .NET 4.0에서이 문제를 확인해보십시오. 어쩌면 당신은 훨씬 짧은 SQL 문자열을 얻을 것이다. EF 팀이 많은 성과 향상을했습니다

관련 문제