我的应用程序上有一个搜索屏幕,用户可以在其中使用多达4个参数进行搜索。我已经编写了一个存储过程以方便搜索。
Select
ID,
FirstName,
LastName,
CountryCd,
State,
Zip,
Data1,
Data2,
Data3
From
Customer
Where
((FirstName like @paramfname) OR (@paramfname IS NULL) )
AND ((LastName like @paramlname) OR (@paramlname IS NULL))
AND CountryCd = @paramcountry
AND ((Zip = @paramzip) OR (@paramzip IS NULL))
我添加了一个包含所有4列FirstName,LastName,CountryCd
和的二级索引Zip
。
CREATE NONCLUSTERED INDEX [idx_Cust_FN_Ctry]
ON [dbo].[Customer]([FirstName] ASC, [LastName] ASC, [CountryCd] ASC, [Zip] ASC)
我的问题:这个索引足以进行有效搜索吗?如果用户运行搜索,仅使用FirstName
和Country
,SQL Server是否知道如何有效使用索引?
还是我需要在这些字段中的每个字段上添加4个单独的二级索引?
谢谢
对于此查询,我将CountryCd
用来引导索引,因为这是保证可以搜索的唯一列。当然,这假定的CountryCd
选择性对您的数据具有选择性。
如果您真的想花哨的话,可以添加一个包含SOUNDEXFirstName
和的SOUNDEX的计算列,并为其LastName
编制索引。如果这样做,则可以这样表示过滤器
((FirstNameSound = SOUNDEX(@paramfname)) OR (@paramfname IS NULL) )
AND ((LastNameSound = SOUNDEX(@paramlname) OR (@paramlname IS NULL))
AND CountryCd = @paramcountry
AND ((Zip = @paramzip) OR (@paramzip IS NULL))
这仅适用于英语发音的名称-在执行此操作之前,您应该了解SOUNDEX函数的含义。
关于1-4个索引的问题:这实际上取决于通常一起搜索的内容。如果有任何可能的组合,则可能需要全部四个索引(或者至少需要有选择的列上的索引)。如果通常一起搜索FirstName
加号,LastName
则应该在这两列上都有一个索引。
但是,让我挑战您的设计。看起来您似乎真的想用传统索引解决全文索引问题。我建议在完成设计之前先看一下SQL Server中的全文索引引擎。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句