【问题标题】:INNER JOIN taking up too much timeINNER JOIN 占用太多时间
【发布时间】:2014-06-10 00:12:03
【问题描述】:

在我的数据库中,我有一个名为 FinanceProfile 的表。它有一个名为 FinanceProfileId 的列。

我有另一个名为 FinanceProfileState 的表。此表有一个名为 FinanceProfileId 的外键,它引用 FinanceProfile 表中的记录。

我已经存储了 proc,它执行以下操作:-

我有一个名为 @MatchingContactFinancialProfiles 的临时表。

DECLARE @MatchingContactFinancialProfiles TABLE
( 
   FinanceProfileId int,
   ContactId uniqueidentifier
);  

@MatchingContactFinancialProfiles 包含 FinanceProfile 表的子集。它包含大约 100 行。

FinanceProfileState 表有大约 4500 个与 @MatchingContactFinancialProfiles 匹配的行。

我正在做这样的连接:

INSERT INTO @FinanceProfileStates
       SELECT distinct fpState.FinanaceProfileId, fpState.StateId
          FROM @MatchingContactFinancialProfiles fp inner JOIN FinanaceProfileState fpState
          on fp.FinanceProfileId = fpState.FinanaceProfileId

我运行分析器,它从右到左显示:

Step 1: Table Scan @MatchingContactFinancialProfiles  - Cost 5%
Step 2:  A) Hash Match Aggregate- 19%
         B) Clustered Index Scan - Table - FinanaceProfileState  PK - FinanaceProfileStateId - 15%
Step 3: Hash Match - Inner Join - 38%
Step 4: Distinct Sort - 15%
Step 5: Insert @FinanceProfileStates - 8%

此查询在存储过程中占用了大部分时间。我该怎么做才能使这个查询运行得更快?

欢迎任何想法和建议!!!!

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    @MatchingContactFinancialProfiles 表变量上没有任何索引。

    尝试使用

    DECLARE @MatchingContactFinancialProfiles TABLE
    ( 
       FinanceProfileId int PRIMARY KEY,
       ContactId uniqueidentifier
    );  
    

    根据这个link,您还可以通过使用临时表而不是您当前使用的表变量来获得更好的性能。

    【讨论】:

    • 大大减少了时间。感谢您的输入。但是,我希望它少一点。一般来说,当我们对表进行连接时,是否有一个经验法则可以使其更快,例如在我们正在使用的列上使用索引。
    • 我总是尝试加入索引列。如果fpState.FinanaceProfileId 没有被索引,那么你应该添加一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2015-10-31
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多