我有很奇怪的問題。爲什麼我的查詢不是sargable
我有這樣的查詢,我在SQL Server 2008 R2中運行:
SELECT TOP (20) *
FROM MyTable
WHERE a = 0
AND b = 0
AND c = 0
使用我的索引上MyTable的
但是這一次沒有:
SELECT TOP (20) *
FROM MyTable
WHERE a = 0
OR b = 0
OR c = 0
和我想在我的程序中執行第二個查詢。如何修改第二個查詢以使用索引?
索引:
CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
[a] ASC,
[b] ASC,
[c] 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]
它不會。它必須搜索整個索引才能找到與'LicenseDelete = 0'條件匹配的行(因爲「IRDelete」和「ColorDelete」的值可能是任何東西) –
出於同樣的原因,您可以輕鬆使用手機本書尋找名字是「Martin」和姓氏「Smith」的人,但是找到名字爲「Martin」*或*姓氏「Smith」的人是更多的工作。電話簿不是按名字排序的,所以找到馬丁斯涉及閱讀整個事情。 –
你是不是認爲'或'操作符總是會毀掉索引?是不是有任何方法來修復MyIndex來覆蓋where子句? – vakarami