我应该使用复合索引还是单列索引?

Ali*_*har 5 index sql-server-2008 sql-server

我的数据库表 ( Medicines) 中有以下列。

ID bigint, 
MedicineName nvarchar(50), 
BrandName nvarchar(50), 
MedicineCode nvarchar(20),
and price,quantity.
Run Code Online (Sandbox Code Playgroud)

我正在使用此查询创建存储过程:

create proc searchmedicine
@name nvarchar(50)=null,@brand nvarchar(50)=null, @code nvarchar(20)=null
as
select * from Medicines
where MedicineName= Case WHEN @name IS NOT NULL THEN @name ELSE MedicineName END
AND BrandName=Case WHEN @brand IS NOT NULL THEN @brand ELSE BrandName END
AND MedicineCode=Case WHEN @code IS NOT NULL THEN @code ELSE MedicineCode END
Run Code Online (Sandbox Code Playgroud)

现在我很困惑哪个非聚集索引更适合帮助优化查询:复合列还是单列?

小智 4

使用SELECT *是不好的做法,尤其是在存储过程中。即使您有一个WHERE子句来过滤返回的行,我也会明确说明这些列。

至于索引,您可能必须通过查看所应用的每种类型索引的执行计划来自行调整。不过,我会ID在 MedicineName、BrnadName、MedicineCode 上有一个聚集索引和 1 个非聚集索引,因为您要从中选择 3 列。

CREATE NONCLUSTERED INDEX IX_Medicines_MedicineBrands ON Medicines (MedicineName, BrandName, MedicineCode)
Run Code Online (Sandbox Code Playgroud)

然后,我将亲自包含执行计划,并查看与具有以下索引相比,您的存储过程的执行情况:

CREATE NONCLUSTERED INDEX IX_Medicines_MedicineCode ON Medicines (MedicineCode)

CREATE NONCLUSTERED INDEX IX_Medicines_MedicineName ON Medicines (MedicineName)

CREATE NONCLUSTERED INDEX IX_Medicines_BrandName ON Medicines (BrandName)
Run Code Online (Sandbox Code Playgroud)