选择Query With提示以添加性能

时间:2012-05-28 04:50:28

标签: sql sql-server sql-server-2008 sql-server-2005

我的选择查询是:

Select A.DocumentID,
       A.CodingID,
       A.DebitPrice,
       A.CreditPrice,
       A.DocumentDetailDescriptionID,
       A.HKSID,
       A.OldInc,
       A.EffectiveDate,
       A.DetailedAccount1ID,
       A.DetailedAccount2ID,
       A.DetailedAccount3ID,
       C.FinancialPeriodID,
       C.SalesCompanyID,
       B.[Date]
 From  acc.DocumentDetail A
 INNER JOIN ACC.Document B ON B.DocumentID = A.DocumentID
 INNER JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID

acc.DocumentDetail有大约12917388条记录

acc.documet有大约131767条记录

org.SalesCompanyFinancialPeriod有大约93条记录

我的查询很慢,我想让它更快。我必须使用什么提示?

2 个答案:

答案 0 :(得分:1)

关于这种情况有两个重要问题:

  1. 您是要获得整体最佳性能,还是希望更快地返回第一行(更适合UI应用程序)?
  2. 表org.SalesCompanyFinancialPeriod的作用是过滤器还是词典
  3. 如果您正在寻找更好的总体时间并且SalesCompanyFinancialPeriod就像字典一样,那么可以通过在Document和DocumentDetail之间使用MERGE连接,然后使用HASH连接到SalesCompanyFinancialPeriod来实现最佳性能。

    SELECT (...)
    FROM acc.Document doc
    INNER MERGE JOIN acc.DocumentDetail det ON (...)
    INNER HASH JOIN org.SalesCompanyFinancialPeriod fnp ON (...)
    OPTION(FORCE ORDER);
    

    如果SalesCompanyFinancialPeriod的作用类似于过滤器,或者此查询将用于UI应用程序,则可以通过从此表开始然后使用LOOP / HASH加入Document然后再次使用另一个LOOP /来更快地返回第一行HASH加入DocumentDetail。 LOOP或HASH连接之间的选择取决于许多环境变量,所以我宁愿指定JOIN的顺序并让引擎选择连接:

    SELECT (...)
    FROM org.SalesCompanyFinancialPeriod fnp
    INNER JOIN acc.Document doc ON (...)
    INNER JOIN acc.DocumentDetail det ON (...)
    OPTION(FORCE ORDER);
    
    但是,比查询性能的提示更重要的是这些表的索引结构。对于这个查询很重要,我建议使用以下索引(对两种用例都有效):

    CREATE UNIQUE CLUSTERED INDEX idxc_det
      ON acc.DocumentDetail(DocumentID, CodingID);
    
    CREATE UNIQUE CLUSTERED INDEX idxc_doc
      ON acc.Document(DocumentID);
    
    CREATE INDEX idx_fnper
      ON acc.Document(SalesCompanyFinancialPeriodID);
    
    CREATE UNIQUE CLUSTERED INDEX idxc_doc
      ON org.SalesCompanyFinancialPeriod(SalesCompanyFinancialPeriodID);
    

答案 1 :(得分:0)

谢谢大家。

我调查我的查询并在SalesCompanyFinancialPeriod上添加索引在SalesCompanyFinancialPeriodID和Include SalesCompanyID& FinancialID 并将我的查询更改为以下(此查询更快约1:10)

Select  A.DocumentID,
    A.CodingID,
    A.DebitPrice,        
    A.CreditPrice,        
    A.DocumentDetailDescriptionID,        
    A.HKSID,        
    A.OldInc,        
    A.EffectiveDate,        
    A.DetailedAccount1ID,        
    A.DetailedAccount2ID,        
    A.DetailedAccount3ID,        
    C.FinancialPeriodID,        
    C.SalesCompanyID,        
    B.[Date]  
From  acc.DocumentDetail A  
INNER HASH JOIN ACC.Document B ON B.DocumentID = A.DocumentID  
INNER LOOP JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID