【发布时间】:2014-01-23 11:25:31
【问题描述】:
我正在尝试调整以下查询,该查询针对 INVENTTABLE 获得了 500k IO,我认为这是一个不错的起点。虽然所有连接的复杂性都让我失望,但我无法总结出一个好的开始?
提前感谢您的任何提示。
SET STATISTICS IO ON
DECLARE
@paramCompany varchar(3),
@paramCreatedBy varchar(8000),
@paramCustomer varchar(100),
@paramBlanketId varchar(20)
SET @paramCompany = 'adf'
SET @paramCreatedBy = 'All'
SET @paramCustomer = NULL
SET @paramBlanketId = NULL
SELECT
un.MAINSALESID,
un.DATAAREAID,
Sum(un.Quantity) as 'Quantity',
Sum(un.SalesValue) as 'SalesValue'
INTO #desprel
FROM
(SELECT
stl.MAINSALESID,
st.DATAAREAID,
sl.SALESQTY as 'Quantity',
sl.SALESQTY * sl.SALESPRICE as 'SalesValue'
FROM
DynamicsV5Realtime.dbo.SALESTABLE st
INNER JOIN
DynamicsV5Realtime.dbo.SALESLINE sl
ON
sl.SALESID = st.SALESID
and sl.DATAAREAID = st.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.INVENTTABLE it
ON
it.ITEMID = sl.ITEMID
and it.DATAAREAID = sl.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.SALESTABLELINKS stl
ON
stl.SUBSALESID = st.SALESID
and stl.DATAAREAID = st.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.SALESTABLE st1
ON
st1.SALESID = stl.MAINSALESID
and st1.SALESTYPE = 5
--to get Order created by
inner JOIN
--TR
vw_R000_EmployeeList pm
ON
--st1.SALESTAKER = pm.emplid
CASE WHEN st1.SALESTAKER = 'balla' THEN 'gende' ELSE st1.SALESTAKER END = pm.emplid
and (pm.[NAME] in (SELECT * FROM udf_MultiValueParameterHandlingString(@paramCreatedBy)) or @paramCreatedBy = 'All')
WHERE
st.DATAAREAID = 'adf'
and st.SALESTYPE = 3 -- Release Order
and st.SALESSTATUS in (2,3)
and sl.SALESSTATUS <> 4
and it.ITEMGROUPID <> 'G0022A'
and sl.SALESQTY > 0
and st1.CUSTACCOUNT = IsNull(@paramCustomer,st1.CUSTACCOUNT)
and st1.SALESID = IsNull(@paramBlanketId,st1.SALESID)
UNION ALL
SELECT
stl.MAINSALESID,
st.DATAAREAID,
sl.SALESQTY as 'Quantity',
sl.SALESQTY * sl.SALESPRICE as 'SalesValue'
FROM
DynamicsV5Realtime.dbo.SALESTABLE st
INNER JOIN
DynamicsV5Realtime.dbo.SALESLINE sl
ON
sl.SALESID = st.SALESID
and sl.DATAAREAID = st.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.INVENTTABLE it
ON
it.ITEMID = sl.ITEMID
and it.DATAAREAID = sl.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.SALESTABLELINKS stl
ON
stl.SUBSALESID = st.MARIMSSALESID
and stl.DATAAREAID = st.DATAAREAID
INNER JOIN
DynamicsV5Realtime.dbo.SALESTABLE st1
ON
st1.SALESID = stl.MAINSALESID
and st1.SALESTYPE = 5
--to get Order created by
inner JOIN
--TR
vw_R000_EmployeeList pm
ON
--st1.SALESTAKER = pm.emplid
CASE WHEN st1.SALESTAKER = 'balla' THEN 'gende' ELSE st1.SALESTAKER END = pm.emplid
and (pm.[NAME] in (SELECT * FROM udf_MultiValueParameterHandlingString(@paramCreatedBy)) or @paramCreatedBy = 'All')
WHERE
st.DATAAREAID = 'adf'
and st.SALESTYPE = 3 -- Release Order
and st.SALESSTATUS in (2,3)
and sl.SALESSTATUS <> 4
and it.ITEMGROUPID <> 'G0022A'
and sl.SALESQTY < 0
and st1.CUSTACCOUNT = IsNull(@paramCustomer,st1.CUSTACCOUNT)
and st1.SALESID = IsNull(@paramBlanketId,st1.SALESID)
) un
GROUP BY
un.MAINSALESID,
un.DATAAREAID
【问题讨论】:
-
您可能希望标记为 SQL Server,因为调整可能是 RDBMS 特定的。
-
是的。假设这是 Sql Server,在 SSMS 中运行查询并告诉它生成查询计划。然后我会寻找具有最高百分比的操作并尝试对其进行优化。此外,SSMS 有时会建议新的索引,这会有所帮助:应用它们通常是一件好事!
-
是的,我正在查看执行计划,最大的索引搜索之一是针对 DIRPARTYCOMMUNICATIONRELA 表 - 它必须是某种内部工作表,因此不确定如何索引它。我希望在如何重写查询以降低总 IO 方面获得一些帮助,这样我就可以在其他地方应用该技术。
标签: sql sql-server performance sql-tuning