编写TSQL查询的更好方法

时间:2016-06-02 15:06:34

标签: sql-server tsql

我写了一个需要很长时间才能执行的查询, 查询是

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 ;

现在我没有权限查看此查询的执行计划,我只是想知道是否有另一种方法来编写类似的查询可以花费更少的时间,请注意在数据库中创建所有必要的索引

2 个答案:

答案 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