我写了一个需要很长时间才能执行的查询, 查询是
SELECT
PD.POLICY_SID,
CD.Coverage_SID,
AUD.Accounting_Unit_SID
FROM POLICY_DIM PD
INNER JOIN
Current_Period_Coverage_Unpadded_Reserve_Fact CPCURF
ON PD.POLICY_SID = CPCURF.POLICY_SID
INNER JOIN
Coverage_Dim CD
ON CPCURF.Coverage_SID = CD.Coverage_SID
INNER JOIN
Accounting_Unit_Dim AUD
ON CPCURF.Accounting_Unit_SID = AUD.Accounting_Unit_SID
where
CD.GL_Reinsurance_Class_Code = 1 AND
CONVERT(INT,PD.GL_Legal_ID_BK) = 1 AND
PD.US_SOE_Group_Code is not null AND
Convert(INT,AUD.Par_Code_BK) = 4 ;
现在我没有权限查看此查询的执行计划,我只是想知道是否有另一种方法来编写类似的查询可以花费更少的时间,请注意在数据库中创建所有必要的索引
答案 0 :(得分:0)
是的,你可以做一些调整。 您可以嵌套连接以加入已经受内部连接限制的内容。
语法是这样的:
from x
inner join y
inner join z
on z.id=y.id
on x.id =y.id
你也可以把
inner join ... on x.id = y.id and CD.GL_Reinsurance_Class_Code = 1
所以过滤将在连接期间执行,因此可能在较少量的数据上执行。
您也可以尝试摆脱转换并与" 1"为每一行结果删除解析字符串到int。
顺便说一下。记住索引。您需要索引才能快速加入。
答案 1 :(得分:0)
有时你需要帮助优化器出局 太糟糕了,你无法看到计划,因为我怀疑它正在进入循环连接
SELECT PD.POLICY_SID,
CD.Coverage_SID,
AUD.Accounting_Unit_SID
FROM POLICY_DIM PD
INNER JOIN Current_Period_Coverage_Unpadded_Reserve_Fact CPCURF
ON PD.POLICY_SID = CPCURF.POLICY_SID
AND PD.US_SOE_Group_Code is not null
AND CONVERT(INT, PD.GL_Legal_ID_BK) = 1
INNER JOIN Coverage_Dim CD
ON CD.Coverage_SID = CPCURF.Coverage_SID
AND CD.GL_Reinsurance_Class_Code = 1
INNER JOIN Accounting_Unit_Dim AUD
ON CPCURF.Accounting_Unit_SID = AUD.Accounting_Unit_SID
AND Convert(INT, AUD.Par_Code_BK) = 4
OPTION (HASH JOIN); -- try this but just guessing with a query plan