请教高手如何优化sql语句
sql语句有点长,当数据很多的时候查询很影响速度,请问这个语句可以怎么优化呢?
SELECT T_ITEM.F_DESC, T_ITEM.F_UNIT, SMP_APDTL.F_ID, SMP_APDTL.F_ITEMID, SMP_APDTL.F_DOCQTY, SMP_APDTL.F_TRANSID,
CONVERT(numeric(18,4), SMP_APDTL.F_NEWUNITAMT) AS F_NEWUNITAMT, CONVERT(numeric(18, 6),
SMP_APDTL.F_AMT / SMP_APDTL.F_DOCQTY) AS F_UNITAMT, CONVERT(numeric(18, 2), SMP_APDTL.F_AMT) AS F_AMT,
CONVERT(numeric(18, 2), SMP_APDTL.F_AMT / (1+T_SALESORDHDR.F_TAXRATE) * T_SALESORDHDR.F_TAXRATE) AS F_TAXAMT,
CONVERT(numeric(18, 2), SMP_APDTL.F_UNITAMT) AS F_FUNITAMT, CONVERT(numeric(18, 2),
SMP_APDTL.F_UNITAMT * SMP_APDTL.F_DOCQTY) AS F_FAMT, CONVERT(numeric(18, 2), SMP_APDTL.F_AMT)
- CONVERT(numeric(18, 2), SMP_APDTL.F_UNITAMT * SMP_APDTL.F_DOCQTY) AS F_SUBAMT,
T_ITEMTRANSHDR.F_TRANSDATE, T_SALESORDDTL.F_ITEMCUSTDESC, T_SALESORDHDR.F_CUSTORDID,
T_ITEMADJTYPE.F_DESC AS ADJDESC,T_ITEMADJTYPE.F_TRANSTYPE, T_ARDTL.F_ARID,
SMP_PMPC_PMPCAP_Resource.F_Target_AP_CreateResult as F_APResult,
SMP_PMPC_BPAR_Resource.F_Source_AR_CreateResult as F_ARResult
FROM T_SALESORDHDR
INNER JOIN T_SALESORDDTL ON T_SALESORDHDR.F_ID = T_SALESORDDTL.F_SALESID
INNER JOIN T_ITEM INNER JOIN SMP_APDTL ON T_ITEM.F_ID = SMP_APDTL.F_ITEMID
INNER JOIN T_ITEMTRANSHDR ON SMP_APDTL.F_TRANSID = T_ITEMTRANSHDR.F_ID
INNER JOIN T_ITEMTRANSDTL ON SMP_APDTL.F_TRANSDTLID = T_ITEMTRANSDTL.F_ID
INNER JOIN T_ITEMADJTYPE ON T_ITEMTRANSDTL.F_ADJTYPE = T_ITEMADJTYPE.F_ID
ON T_SALESORDDTL.F_ITEMID = T_ITEMTRANSDTL.F_ITEMID AND T_SALESORDDTL.F_SALESID = T_ITEMTRANSDTL.F_SALESID
INNER JOIN T_ITEMTRANSTYPE ON T_ITEMTRANSHDR.F_TRANSTYPE = T_ITEMTRANSTYPE.F_ID
LEFT OUTER JOIN
(
T_ARDTL INNER JOIN T_ARHDR ON T_ARHDR.F_ID=T_ARDTL.F_ARID INNER JOIN T_INVOTYPE ON T_INVOTYPE.F_ID=T_ARHDR.F_INVOTYPE
AND T_INVOTYPE.F_ID = T_INVOTYPE.f_hedgeid) ON SMP_APDTL.F_ID = T_ARDTL.F_SMPID
left join SMP_PMPC_PMPCAP_Resource on SMP_PMPC_PMPCAP_Resource.F_BillDtlID = SMP_APDTL.F_ID
left join SMP_PMPC_BPAR_Resource on SMP_PMPC_BPAR_Resource.F_BillDtlID = SMP_APDTL.F_ID
WHERE (SMP_APDTL.F_APID = 3116) AND (T_ITEMTRANSTYPE.F_ISINNERBOARD = 0)
UNION ALL
SELECT T_ITEM.F_DESC, T_ITEM.F_UNIT, SMP_APDTL.F_ID, SMP_APDTL.F_ITEMID, SMP_APDTL.F_DOCQTY, SMP_APDTL.F_TRANSID,
CONVERT(numeric(18,4), SMP_APDTL.F_NEWUNITAMT) AS F_NEWUNITAMT,
CONVERT(numeric(18, 6), SMP_APDTL.F_AMT / SMP_APDTL.F_DOCQTY) AS F_UNITAMT, CONVERT(numeric(18, 2), SMP_APDTL.F_AMT) AS F_AMT,
CONVERT(numeric(18, 2), SMP_APDTL.F_AMT / 1.17 * 0.17) AS F_TAXAMT, CONVERT(numeric(18, 2), SMP_APDTL.F_UNITAMT) AS F_FUNITAMT,
CONVERT(numeric(18, 2), SMP_APDTL.F_UNITAMT * SMP_APDTL.F_DOCQTY) AS F_FAMT,
CONVERT(numeric(18, 2), SMP_APDTL.F_AMT) - CONVERT(numeric(18, 2), SMP_APDTL.F_UNITAMT * SMP_APDTL.F_DOCQTY) AS F_SUBAMT,
T_ITEMTRANSHDR.F_TRANSDATE, T_ITEM.F_DESC AS F_ITEMCUSTDESC, '' AS F_CUSTORDID, T_ITEMADJTYPE.F_DESC AS ADJDESC,
T_ITEMADJTYPE.F_TRANSTYPE, T_ARDTL.F_ARID , SMP_PMPC_PMPCAP_Resource.F_Target_AP_CreateResult as F_APResult,
SMP_PMPC_BPAR_Resource.F_Source_AR_CreateResult as F_ARResult FROM T_ITEMTRANSTYPE
INNER JOIN T_ITEM INNER JOIN SMP_APDTL ON T_ITEM.F_ID = SMP_APDTL.F_ITEMID
INNER JOIN T_ITEMTRANSHDR ON SMP_APDTL.F_TRANSID = T_ITEMTRANSHDR.F_ID
INNER JOIN T_ITEMTRANSDTL ON SMP_APDTL.F_TRANSDTLID = T_ITEMTRANSDTL.F_ID
INNER JOIN T_ITEMADJTYPE ON T_ITEMTRANSDTL.F_ADJTYPE = T_ITEMADJTYPE.F_ID ON
T_ITEMTRANSTYPE.F_ID = T_ITEMTRANSHDR.F_TRANSTYPE LEFT OUTER JOIN (T_ARDTL
INNER JOIN T_ARHDR ON T_ARHDR.F_ID=T_ARDTL.F_ARID INNER JOIN T_INVOTYPE ON T_INVOTYPE.F_ID=T_ARHDR.F_INVOTYPE
AND T_INVOTYPE.F_ID = T_INVOTYPE.f_hedgeid) ON SMP_APDTL.F_ID = T_ARDTL.F_SMPID
left join SMP_PMPC_PMPCAP_Resource on SMP_PMPC_PMPCAP_Resource.F_BillDtlID = SMP_APDTL.F_ID
left join SMP_PMPC_BPAR_Resource on SMP_PMPC_BPAR_Resource.F_BillDtlID = SMP_APDTL.F_ID
and SMP_PMPC_BPAR_Resource.F_ICID = dbo.getbpid()
WHERE (SMP_APDTL.F_APID = 3116) AND (T_ITEMTRANSTYPE.F_ISINNERBOARD = 1)
[解决办法]
太长了,分布来搞吧, 用用临时表 建建索引
[解决办法]
光看你代码太累,请:
建议你提供详细的资料:例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
[解决办法]