我有一張名字和姓氏很大的表格。人們通過Web界面搜索這個數據庫。 PHP代碼用LOWER(@name) = LOWER(name)
查詢表格。爲了加快搜索速度,我希望在表名爲lower_name
的表中生成一個派生列,並且在存儲之前始終使用LOWER()
的名稱。但是當將結果發送到Web界面時,我想要顯示原始的結果。但是,我不想更改表結構。是否有某種索引自動執行這個技巧或者在SQL Server中創建一個「無形列」的選項?在數據庫中存儲預處理的varchar列以及原始數據庫
1
A
回答
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
列,並把索引在該列:
0
PHP代碼查詢與 LOWER(@name)= LOWER(名稱)
感謝痛苦的世界表。 LOWER(名稱)觸發表掃描。這不會讓它變得更快,它 - 殘酷地說 - 是一個初學者的錯誤,會導致性能下降。除非您預先計算好的索引的結果(例如,您可以在SQL Server 2008中執行此操作),否則不應該與表格字段的計算進行比較。
什麼
WHERE名稱LIKE @name
應該忽略大小寫......再加上名稱字段上的索引。
1
你有多種選擇:
聲明列名稱使用COLLATE子句
使用COLLATE子句比較名稱和@Name不區分大小寫
創建一個計算列LowerName AS LOWER(Name)PERSISTED並將此計算列索引
+0
對於第二種選擇:您認爲它確實帶來了性能優勢,強制將區分大小寫的列作爲不區分大小寫進行比較?我沒有看到這與使用LOWER()之間的區別。我錯了嗎? – ercan
相關問題
- 1. 如何處理數據庫原始數據中的空白?
- 2. 如何將清理後的原始數據存儲在數據庫中?
- 3. 原始庫存數據
- 4. 數據庫 - 將數值存儲在VARCHAR數據類型中
- 5. 存儲有效利用原始數據和處理數據matplotlib
- 6. 數據存儲在android數據庫中以及如何查看所有數據?
- 7. PayPal的原始交易ID不存儲在數據庫中
- 8. 數據清理和數據庫存儲
- 9. 將XML存儲在關係數據庫中的基本原理
- 10. MySQL數據庫的預處理表
- 11. 將數據存儲在數據庫中
- 12. 在android數據庫中存儲數據
- 13. 不在數據庫中存儲數據
- 14. 處理CakePHP中存儲在數據庫中的PHP代碼
- 15. 好的OOP處理數據庫數據的設計原理
- 16. 如何在數據庫中將數據存儲到數據庫
- 17. 在數據庫中存儲scrapy隊列
- 18. 在數據庫列中存儲對象
- 19. 在數據庫中存儲隊列
- 20. 在數據庫中存儲MSMQ隊列
- 21. 將數值存儲在數據庫中的數據庫
- 22. 使用sqlalchemy在數據庫中存儲處理過的對象
- 23. 按id在數據庫中存儲爲varchar的html表格
- 24. 存儲數據庫中的數據
- 25. 原始數據庫中的數據庫更改是否爲
- 26. 如何處理存儲在數據庫中的數據的翻譯?
- 27. 數據倉庫中的列存儲
- 28. 將大量文本存儲在一個列的值爲varchar的數據庫中(數據庫)
- 29. 如何在數據倉庫中存儲貸款處理的詳細數據?
- 30. 數據庫存儲
'SELECT CASE WHEN「ABCD 'LIKE'abcd'THEN 1 ELSE 0 END'給我0.我認爲這取決於默認排序規則,這在我的情況下是*區分大小寫*。我想你誤解了我。我不認爲這種情況會使查詢更快。我想擺脫它。 – ercan
2005 - 在第二個字段中輸入較低(名稱)字段,通過觸發器填充。索引它,使用LIKE就可以了。 備用2008年,索引放在LOWER(名稱)上,查詢運行速度更快。 我不喜歡區分大小寫的集合的一個原因。 – TomTom
正是我在這篇文章的第一部分所表達的意思。但問題是,如果我可以在不更改表結構本身的情況下做到這一點。 – ercan