我有一张大桌子,上面有名字和姓氏。人们通过网络界面搜索该数据库。 PHP 代码使用
LOWER(@name) = LOWER(name)
查询表。为了使搜索更快,我想在表中创建一个名为 lower_name
的派生列,并在存储之前始终 LOWER()
名称。但是当涉及到将结果发送到网络界面时,我想显示原始结果。但是,我不想更改表结构。是否有某种索引可以自动执行此操作,或者有一个选项可以在 SQL Server 中创建“不可见列”或类似的东西?
您可以创建一个带有索引的预存计算列:
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
列,并在该列上放置索引:
您有多种选择:
使用 COLLATE 子句声明列 Name 不区分大小写
使用 COLLATE 子句比较 Name 和 @Name
创建计算列 LowerName AS LOWER(Name) PERSISTED 并为此计算列建立索引
PHP 代码查询表 下(@名字)=下(名字)
LOWER(name) 触发表扫描。这并没有让它变得更快,而是残酷地降低了性能的初学者错误。您永远不应该与表字段的计算进行比较,除非您将结果保存在预先计算的索引中(例如,您可以在 SQL Server 2008 中执行此操作)。
那又如何
名称类似于@name
应该忽略大小写...在名称字段上加上索引。