2010-03-09 51 views
1

我有一張名字和姓氏很大的表格。人們通過Web界面搜索這個數據庫。 PHP代碼用LOWER(@name) = LOWER(name)查詢表格。爲了加快搜索速度,我希望在表名爲lower_name的表中生成一個派生列,並且在存儲之前始終使用LOWER()的名稱。但是當將結果發送到Web界面時,我想要顯示原始的結果。但是,我不想更改表結構。是否有某種索引自動執行這個技巧或者在SQL Server中創建一個「無形列」的選項?在數據庫中存儲預處理的varchar列以及原始數據庫

回答

2

您可以創建與它索引的presisted計算列:

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

0

PHP代碼查詢與 LOWER(@name)= LOWER(名稱)

感謝痛苦的世界表。 LOWER(名稱)觸發表掃描。這不會讓它變得更快,它 - 殘酷地說 - 是一個初學者的錯誤,會導致性能下降。除非您預先計算好的索引的結果(例如,您可以在SQL Server 2008中執行此操作),否則不應該與表格字段的計算進行比較。

什麼

WHERE名稱LIKE @name

應該忽略大小寫......再加上名稱字段上的索引。

+0

'SELECT CASE WHEN「ABCD 'LIKE'abcd'THEN 1 ELSE 0 END'給我0.我認爲這取決於默認排序規則,這在我的情況下是*區分大小寫*。我想你誤解了我。我不認爲這種情況會使查詢更快。我想擺脫它。 – ercan

+0

2005 - 在第二個字段中輸入較低(名稱)字段,通過觸發器填充。索引它,使用LIKE就可以了。 備用2008年,索引放在LOWER(名稱)上,查詢運行速度更快。 我不喜歡區分大小寫的集合的一個原因。 – TomTom

+0

正是我在這篇文章的第一部分所表達的意思。但問題是,如果我可以在不更改表結構本身的情況下做到這一點。 – ercan

1

你有多種選擇:

  • 聲明列名稱使用COLLATE子句

  • 使用COLLATE子句比較名稱和@Name不區分大小寫

  • 創建一個計算列LowerName AS LOWER(Name)PERSISTED並將此計算列索引

+0

對於第二種選擇:您認爲它確實帶來了性能優勢,強制將區分大小寫的列作爲不區分大小寫進行比較?我沒有看到這與使用LOWER()之間的區別。我錯了嗎? – ercan