Sql-Server
“喜歡或喜歡,或喜歡,或喜歡,或喜歡”的更好方法
在這個問題上,他和我有同樣的問題。我需要類似的東西:
select * from blablabla where product like '%rock%' or like '%paper%' or like '%scisor%' or like '%car%' or like '%pasta%'
這很難看,它沒有使用索引。在這種情況下,這確實是唯一的方法(在字元串中選擇多個單詞),或者我應該使用 FULLTEXT?
據我了解,使用全文,我可以在字元串中選擇多個單詞。
全文索引通常不是靈丹妙藥,需要額外的維護、磁碟空間以及對查詢模式進行相當侵入性的更改。
除非您真的需要索引大型文件(想想電子郵件正文、PDF、Word 文件等),否則它們是多餘的(如果我們說實話,我會將這個過程完全從 SQL Server 中移除,並且使用 Elasticsearch 或類似的東西)。
對於較小的案例,計算列通常是更好的方法。
這是一個快速展示設置:
use tempdb CREATE TABLE #fulltextindexesarestupid (Id INT PRIMARY KEY CLUSTERED, StopAbusingFeatures VARCHAR(100)) INSERT #fulltextindexesarestupid (Id) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (@@ROWCOUNT)) FROM sys.messages AS m CROSS JOIN sys.messages AS m2 UPDATE #fulltextindexesarestupid SET StopAbusingFeatures = CASE WHEN Id % 15 = 0 THEN 'Bad' WHEN Id % 3 = 0 THEN 'Idea' WHEN Id % 5 = 0 THEN 'Jeans' END ALTER TABLE #fulltextindexesarestupid ADD LessBad AS CONVERT(BIT, CASE WHEN StopAbusingFeatures LIKE '%Bad%' THEN 1 WHEN StopAbusingFeatures LIKE '%Idea%' THEN 1 ELSE 0 END) CREATE UNIQUE NONCLUSTERED INDEX ix_whatever ON #fulltextindexesarestupid (LessBad, Id)
甚至基於非持久列的查詢為我們提供了一個“使用索引”和所有內容的計劃:)
SELECT COUNT(*) FROM #fulltextindexesarestupid AS f WHERE LessBad = 1