我的选择查询是:
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条记录
我的查询很慢,我想让它更快。我必须使用什么提示?
答案 0 :(得分:1)
关于这种情况有两个重要问题:
如果您正在寻找更好的总体时间并且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