我有一张名字和姓氏的大桌子。人们通过Web界面搜索此数据库。 PHP代码使用LOWER(@name) = LOWER(name)
查询表。为了使搜索更快,我想在名为lower_name
的表中创建派生列,并在存储之前始终LOWER()
。但是当把结果发送到网络界面时,我想展示原始的。但是,我不想更改表结构。是否有某种类型的索引可以自动执行该操作,或者在SQL Server中创建“隐藏列”或类似的选项?
答案 0 :(得分:2)
您可以创建一个带有索引的预先计算的列:
ALTER TABLE YourTable ADD lower_name AS LOWER(name) PERSISTED
go
CREATE NONCLUSTERED INDEX IX_YourTable_lower_name
ON YourTable (lower_name)
go
您不会插入或更新此列,数据库会为您执行此操作并始终与您的“名称”列保持同步。
如果您不想使用计算列,则可以创建一个视图,其中包含LOWER(name) AS lower_name
列并在该列上放置索引:
答案 1 :(得分:1)
您有多种选择:
使用COLLATE子句
使用COLLATE子句比较Name和@Name
创建计算列LowerName AS LOWER(Name)PERSISTED并索引此计算列
答案 2 :(得分:0)
PHP代码查询表 LOWER(@name)= LOWER(名称)
感谢痛苦的世界。 LOWER(名称)触发表扫描。这不是让它变得更快,而是 - 残酷地 - 一个杀死性能的初学者错误。您永远不应该与表字段的计算进行比较,除非您将结果存储在预先确定的索引中(例如,您可以在SQL Server 2008中执行此操作)。
怎么样?
WHERE name LIKE @name
应忽略大小写......加上名称字段上的索引。