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

问题描述 投票:0回答:3

我有一张大桌子,上面有名字和姓氏。人们通过网络界面搜索该数据库。 PHP 代码使用

LOWER(@name) = LOWER(name)
查询表。为了使搜索更快,我想在表中创建一个名为
lower_name
的派生列,并在存储之前始终
LOWER()
名称。但是当涉及到将结果发送到网络界面时,我想显示原始结果。但是,我不想更改表结构。是否有某种索引可以自动执行此操作,或者有一个选项可以在 SQL Server 中创建“不可见列”或类似的东西?

sql sql-server-2005
3个回答
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
投票

您有多种选择:

  • 使用 COLLATE 子句声明列 Name 不区分大小写

  • 使用 COLLATE 子句比较 Name 和 @Name

  • 创建计算列 LowerName AS LOWER(Name) PERSISTED 并为此计算列建立索引


-1
投票

PHP 代码查询表 下(@名字)=下(名字)

LOWER(name) 触发表扫描。这并没有让它变得更快,而是残酷地降低了性能的初学者错误。您永远不应该与表字段的计算进行比较,除非您将结果保存在预先计算的索引中(例如,您可以在 SQL Server 2008 中执行此操作)。

那又如何

名称类似于@name

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

© www.soinside.com 2019 - 2024. All rights reserved.