代码之家  ›  专栏  ›  技术社区  ›  Mike Flynn

与左外部联接查询中的表变量不同,临时表导致对表进行完全扫描

  •  0
  • Mike Flynn  · 技术社区  · 3 年前

    如果我关掉电源 @GameIds table variable #GameIds temp table 在底部的查询中,我对一些表进行了完整的表扫描,从而延长了执行时间,并发出了大量内存授予警告。我认为临时表会给出更好的执行计划,因为与表变量相比,它有统计信息。table变量通过聚集索引查找在表之间进行良好的连接。我是不是在临时表上遗漏了什么?

    存储过程

    ALTER PROCEDURE [Test].[GetGameParticipants]
        @GameIds [Test].[BulkIdType] READONLY
    AS
    BEGIN
            SET NOCOUNT ON;
            
            CREATE TABLE #GameIds
            (
              Id INT
            )
            CREATE NONCLUSTERED INDEX IX_GameIds_Temp ON #GameIds (Id);
            INSERT INTO #GameIds
            SELECT Id FROM @GameIds
    

    SELECT
                    ...
                FROM 
                        Test.DivisionGameTeamResult divisionGameTeamResult LEFT OUTER JOIN
                        
                        Test.DivisionBracketParticipant divisionBracketParticipant ON divisionBracketParticipant.DivisionGameTeamResultId = divisionGameTeamResult.Id LEFT OUTER JOIN
                        Test.DivisionBracketParticipantPart divisionBracketParticipantPart ON divisionBracketParticipantPart.Id = divisionBracketParticipant.DivisionBracketParticipantPartId LEFT OUTER JOIN
                        Test.DivisionBracketPart divisionBracketPart ON divisionBracketPart.Id = divisionBracketParticipantPart.Id LEFT OUTER JOIN
                        Test.DivisionBracket divisionBracket ON divisionBracket.Id = divisionBracketPart.DivisionBracketId LEFT OUTER JOIN
    
                        Test.DivisionBracketParticipantTeam divisionBracketParticipantTeam ON divisionBracketParticipantTeam.Id = divisionBracketParticipant.Id LEFT OUTER JOIN
                        Test.DivisionTeam divisionTeamBracket ON divisionTeamBracket.Id = divisionBracketParticipantTeam.DivisionTeamId LEFT OUTER JOIN
                        Test.Team teamBracket ON teamBracket.Id = divisionTeamBracket.Id LEFT OUTER JOIN
                        
                        Test.DivisionBracketParticipantBracket divisionBracketParticipantBracket ON divisionBracketParticipantBracket.Id = divisionBracketParticipant.Id LEFT OUTER JOIN
    
                        Test.DivisionBracketParticipantPool divisionBracketParticipantPool ON divisionBracketParticipantPool.Id = divisionBracketParticipant.Id LEFT OUTER JOIN
                        Test.DivisionPool divisionPoolBracket ON divisionPoolBracket.Id = divisionBracketParticipantPool.DivisionPoolId LEFT OUTER JOIN
                        Test.Division poolDivision ON divisionPoolBracket.DivisionId = poolDivision.Id LEFT OUTER JOIN
                        
                        Test.DivisionBracketParticipantTeamPool divisionBracketParticipantTeamPool ON divisionBracketParticipantTeamPool.Id = divisionBracketParticipant.Id LEFT OUTER JOIN
                        Test.DivisionTeamPool divisionTeamPoolBracket ON divisionTeamPoolBracket.Id = divisionBracketParticipantTeamPool.DivisionTeamPoolId LEFT OUTER JOIN
                        Test.DivisionPool divisionTeamPoolPoolBracket ON divisionTeamPoolPoolBracket.Id = divisionTeamPoolBracket.DivisionPoolId LEFT OUTER JOIN
                        Test.DivisionTeam divisionTeamPoolTeamBracket ON divisionTeamPoolTeamBracket.Id = divisionTeamPoolBracket.DivisionTeamId LEFT OUTER JOIN
                        Test.Team teamPoolTeamBracket ON teamPoolTeamBracket.Id = divisionTeamPoolTeamBracket.Id
                WHERE 
                    EXISTS (SELECT * FROM @GameIds WHERE Id = divisionGameTeamResult.GameId)
    

    enter image description here

    0 回复  |  直到 3 年前
    推荐文章