Sql-Server-2005

為什麼我在查詢單個表時遇到基數問題

  • October 30, 2014

我有以下查詢:

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')

引用自:https://dba.stackexchange.com/questions/81462