"পছন্দ করুন বা পছন্দ করুন, বা পছন্দ করুন, বা পছন্দ করুন, বা পছন্দ করুন" এর জন্য আরও ভাল পদ্ধতির


10

এই প্রশ্নের মধ্যে তিনি আমার মতো একই সমস্যা করছেন। আমার মতো কিছু দরকার:

select * from blablabla 
where product 
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%' 

এটি কুরুচিপূর্ণ এবং এটি সূচকগুলি ব্যবহার করছে না .. এই ক্ষেত্রে, এটি করার একমাত্র উপায় এটি (স্ট্রিংয়ের মধ্যে একাধিক শব্দ নির্বাচন করার জন্য), অথবা আমার ফুলটেক্স ব্যবহার করা উচিত?

আমি যেমন বুঝতে পেরেছি, পুরো টেক্সট সহ আমি স্ট্রিংয়ের ভিতরে একাধিক শব্দ নির্বাচন করতে পারি।

এই প্রশ্নটি সম্পূর্ণ পাঠ্য সম্পর্কেও কথা বলে


3
পণ্যের কলামের ডেটা ধরণ কী? গড় কতগুলি অক্ষর?
জো ওবিশ

উত্তর:


17

পূর্ণ পাঠ্য সূচীগুলি সাধারণত একটি যাদু বুলেট নয় এবং অতিরিক্ত রক্ষণাবেক্ষণ, ডিস্কের স্থান এবং ক্যোয়ারী নিদর্শনগুলির জন্য মোটামুটি অনিচ্ছাকৃত পরিবর্তনগুলির প্রয়োজন।

যদি না আপনি সত্যিই বড় ডকুমেন্টগুলি সূচকের প্রয়োজন হয় (ভাবেন ইমেল বডি, পিডিএফ, ওয়ার্ড ডক্স ইত্যাদি), তারা ওভারকিল করে (এবং যদি আমরা সত্যবাদী হয়ে থাকি তবে, আমি এই প্রক্রিয়াটি পুরোপুরি এসকিউএল সার্ভারের বাইরে নিয়ে যাব এবং ইলাস্টিকসার্ক বা অনুরূপ কিছু ব্যবহার করুন)।

ছোট ব্যবহারের ক্ষেত্রে, গণিত কলামগুলি সাধারণত আরও ভাল পদ্ধতির হয়।

এখানে একটি দ্রুত ডেমো সেটআপ রয়েছে:

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

পাগল


-3

sp_BlitzErik এর উত্তর অনেক ভাল পয়েন্টগুলিতে আঘাত করে, তবে আমি মনে করি না যে কেন আপনার সম্পূর্ণ পাঠ্য অনুসন্ধানটি ব্যবহার করা উচিত নয়। আপনি যা ভাবেন তা করার জন্য সম্পূর্ণ পাঠ্য অনুসন্ধানের ব্যবস্থা নেই। একাধিক ক্ষেত্র অনুসন্ধান করার জন্য এটি সেখানে নেই। এটি শব্দের সামগ্রীকে ভেক্টরাইজ করার জন্য এবং অভিধান, স্টাবিং, লেসারস, গেজেটরিজ, স্টপ-ওয়ার্ড নির্মূলকরণ এবং অন্যান্য কৌশলগুলির অনেকগুলি প্রয়োগ করে যার মধ্যে কোনটিই প্রযোজ্য নয়। অথবা, এখনও প্রয়োগ করার জন্য দেখানো হয়নি।

আমি সমাধানের সাথেও একমত নই, যদিও এসকিউএল সার্ভারে আরও কীভাবে এটি করা যায় তা সম্পর্কে আমি নিশ্চিত নই। আসুন পোস্টগ্রিজ এসকিউএল এর জন্য তার ডেটাটি পুনরায় তৈরি করুন - পোস্টগ্র্রেএসকিউএল এও এটি তৈরি করা অনেক পরিষ্কার।

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;

এখন আপনি যা চান তা একটি এনাম টাইপ,

CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');

ALTER TABLE fulltextindexesarestupid
  ALTER StopAbusingFeatures
  SET DATA TYPE foo
  USING StopAbusingFeatures::foo;

এখন আপনি পূর্ণসংখ্যা উপস্থাপনার স্ট্রিংগুলি ভেঙে ফেলেছেন। তবে আরও ভাল আপনি আগের মত তাদের জিজ্ঞাসা করতে পারেন।

SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';

এর প্রভাব আছে।

  1. আপনার বিভাগগুলি একটি গণনা করা প্রকারের বিষয়টি গোপন করে। সেই জটিলতাটি টাইপের মধ্যে আবদ্ধ থাকে এবং ব্যবহারকারীর কাছ থেকে লুকানো থাকে।
  2. এটি সেই ধরণের উপরের বিভাগগুলিতে রক্ষণাবেক্ষণও করে।
  3. এটি মানসম্মত।
  4. এটি সারি আকার বাড়ায় না।

এই সুবিধাগুলি ব্যতীত, আপনি মূলত স্ট্রিং তুলনাটি অপ্টিমাইজ করার চেষ্টা করছেন। তবে হায়, আমি স্পষ্টভাবে নিশ্চিত নই যে পরামর্শের কোড অনুসারে sp_BlitzEric কীভাবে উত্তর পেয়েছে,

like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'

আপনি এনাম ব্যবহার করে পূর্ণসংখ্যায় টোকেনগুলি ভেঙে ফেলতে পারেন, বা স্প_ব্লিটজ এরিকের প্রস্তাবিত হ্যান্ড-রোলিং পদ্ধতিটি যদি আপনি ভাঙতে পারেন তবে কেন আপনি অযাচিত-পছন্দ মতো করছেন? উদাহরণস্বরূপ, যদি আপনি জানেন '% পাস্তা%' হ'ল টোকেন 'পাস্তা' কেন %এটির উভয় পাশেই আপনার রয়েছে। '%' ব্যতীত এটি একটি সাম্যতা যাচাই করে এবং এটি পাঠ্যের মতোও দ্রুত হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.