sp_BlitzErik'in yanıtı birçok iyi noktaya ulaşıyor , ancak bu yüzden Tam Metin Arama'yı kullanmamanız gerektiğini düşünmüyorum. Tam metin araması, düşündüğünüzü yapmak için orada değildir. Birden fazla alanı aramak için orada değil. Kelime içeriğini vektörleştirmek ve sözlükleri, saplamaları, sözlükleri, gazeteleri, durma kelimelerini ortadan kaldırmayı ve hiçbiri geçerli olmayan diğer numaralardan yararlanmak için oradadır. Veya henüz başvurduğu gösterilmemiştir.
SQL Server'da bunu nasıl daha iyi yapacağımdan emin değilim de, çözümü de kabul etmiyorum. Verilerini PostgreSQL için yeniden oluşturalım - PostgreSQL'de oluşturmak çok daha temiz.
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
Şimdi istediğiniz bir numaralandırma türü,
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
Şimdi dizeleri tamsayı gösterimine daralttınız. Ama daha iyisi onları daha önce olduğu gibi sorgulayabilirsiniz.
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
Bunun etkisi var.
- kategorilerinizin numaralandırılmış bir tür olduğu gerçeğini gizler. Bu karmaşıklık tür içinde kapsüllenir ve kullanıcıdan gizlenir.
- ayrıca bu kategorilere bakım türüne yerleştirir.
- standartlaştırılmıştır.
- satır boyutunu büyütmez.
Bu avantajlar olmadan, temelde dize karşılaştırmasını optimize etmeye çalışıyorsunuz. Ama ne yazık ki, öneride kod verildiğinde sp_BlitzErik'in cevaba nasıl ulaştığından bile emin değilim,
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
Bir enum veya sp_BlitzErik tarafından önerilen el haddeleme yöntemini kullanarak belirteçleri tamsayılara daraltabilirsiniz, ancak daralmayı yapabiliyorsanız neden izinsiz benzeri yapıyorsunuz? Yani, '% makarna%' belirteç 'makarna' olduğunu biliyorsanız neden %
her iki tarafında var. '%' Olmadan bu bir eşitlik kontrolü ve metin olarak bile oldukça hızlı olmalıdır.