Sql-Server-2005
為什麼我在查詢單個表時遇到基數問題
我有以下查詢:
SELECT [iri].[RateItemKey], [iri].[RateItemType] FROM [prism72].[dbo].[ispRateItem] AS [iri] WHERE [iri].[Status] = 1 AND ( [iri].[RateItemType] IN (3,2) )
ispRateItem 表具有以下索引:
CREATE NONCLUSTERED INDEX [COVIX_ispRateItem_RateItemType_Status] ON [dbo].[ispRateItem] ( [Status] ASC, [RateItemType] ASC ) INCLUDE ( [RateItemKey]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO CREATE UNIQUE CLUSTERED INDEX [CLIX_ispRateItem] ON [dbo].[ispRateItem] ( [RateItemKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO ALTER TABLE [dbo].[ispRateItem] ADD CONSTRAINT [RateItem_PK] PRIMARY KEY NONCLUSTERED ( [RateItemKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] GO
我已經使用以下方法更新了統計資訊:
UPDATE STATISTICS [ispRateItem] WITH FULLSCAN, ALL;
但是,我索引表我得到相同的基數問題:Est Rows 1565,Actual Rows 4315。我什至嘗試刪除所有索引(導致表掃描)。
這可能是什麼原因造成的?
請注意,我是查詢調整的初學者。
謝謝。
領域
我認為您的問題是您的
WHERE
子句在同一張表上有多個謂詞。Paul White 的這篇文章解釋了這個問題。可以通過
computed column
執行目前WHERE
子句的操作來解決此問題。然後,您可以單獨使用此列,但這需要進行一些測試以確保其正常工作。決議:
詹姆斯的建議讓我研究了多個謂詞問題。因此,我使用單個謂詞進行了測試,發現整數被儲存為 RateItemType 欄位的 varchar。
通過進行以下更改解決了該問題:
[iri].[RateItemType] IN (3,2)
到
[iri].[RateItemType] IN ('3','2')