将预处理的varchar列与原始列一起存储在数据库中

时间:2010-03-09 09:44:43

标签: sql sql-server-2005

我有一张名字和姓氏的大桌子。人们通过Web界面搜索此数据库。 PHP代码使用LOWER(@name) = LOWER(name)查询表。为了使搜索更快,我想在名为lower_name的表中创建派生列,并在存储之前始终LOWER()。但是当把结果发送到网络界面时,我想展示原始的。但是,我不想更改表结构。是否有某种类型的索引可以自动执行该操作,或者在SQL Server中创建“隐藏列”或类似的选项?

3 个答案:

答案 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列并在该列上放置索引:

http://msdn.microsoft.com/en-us/library/cc917715.aspx

答案 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

应忽略大小写......加上名称字段上的索引。