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)