0

我的选择查询是:

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 条记录

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

4

2 回答 2

1

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

  1. 您是要获得整体最佳性能还是要更快地返回第一行(更适合 UI 应用程序)?
  2. org.SalesCompanyFinancialPeriod 表是否像过滤器字典一样起作用?

如果您正在寻找更好的总体时间并且 SalesCompanyFinancialPeriod 就像字典一样,则可以通过在 Document 和 DocumentDetail 之间使用 MERGE 连接,然后使用与 SalesCompanyFinancialPeriod 的 HASH 连接来实现最佳性能。

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 连接,从而更快地返回第一行文档详细信息。选择 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);
于 2012-05-28T10:23:19.733 回答
0

谢谢大家。

我调查我的查询并在 SalesCompanyFinancialPeriodID 上的 SalesCompanyFinancialPeriod 中添加索引并包括 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 
于 2012-05-28T06:40:38.450 回答