我有以下查詢:理解包括對指數
USE [AxReports]
GO
DECLARE @paramCompany varchar(3)
SET @paramCompany = 'adf'
SELECT stl.MAINSALESID,
st.DATAAREAID,
Sum(sl.SALESQTY) as 'Quantity',
Sum(sl.SALESQTY * sl.SALESPRICE) as 'SalesValue'
INTO #openrel
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
WHERE
st.DATAAREAID = @paramCompany
and st.SALESTYPE = 3 -- Release Order
and st.SALESSTATUS = 1
and sl.SALESSTATUS <> 4
and it.ITEMGROUPID <> 'G0022A'
GROUP BY
stl.MAINSALESID,
st.DATAAREAID
我的執行計劃建議的指標:
USE [DynamicsV5Realtime]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[INVENTTABLE] ([DATAAREAID],[ITEMGROUPID])
INCLUDE ([ITEMID])
GO
但是我已經在該表的索引,它類似於其計劃正在使用,但對其執行表掃描。目前的指數低於:
CREATE NONCLUSTERED INDEX [I_ITEMGROUPIDX] ON [dbo].[INVENTTABLE]
(
[ITEMID] ASC,
[DATAAREAID] ASC
)
INCLUDE ( [ITEMGROUPID])
GO
我有一個瞭解,你應該只把東西作爲一個包含列時,你是不是困擾對他們在葉級進行排序(我認爲是正確的嗎?)。
在這種情況下,WHERE子句有它.ITEMGROUPID <>'G0022A'因此把它作爲一個關鍵列是有意義的,因爲它會更快地按順序尋找該列(我再次認爲我是對的那麼?)
然而,聯接怎麼樣,爲什麼它建議將ITEMID列作爲包含但不包含DATAAREAID列? ITEMID和DATAAREAID在這種情況下構成了PK,所以它是不需要對兩列進行排序,並且可能使用現有索引,但將ITEMGROUPID作爲關鍵柱是更好的解決方案,即添加新索引? (那件事情我可以測試我想)
感謝
很好的解釋我會盡力消化這一切,非常感謝 – Tom