এসকিউএল সার্ভারে বনাম কন্টেন্টগুলি পছন্দ করুন


210

নিম্নলিখিত প্রশ্নের মধ্যে কোনটি দ্রুত (LIKE বনাম কন্টেইনস) দ্রুত?

SELECT * FROM table WHERE Column LIKE '%test%';

অথবা

SELECT * FROM table WHERE Contains(Column, "test");

12
একটি উত্তর গ্রহণ করুন, আপনি হবে?
এজেন্টফায়ার

7
তিনি বছরের পর বছর ধরে নেই।
ক্রিস

উত্তর:


174

দ্বিতীয়টি (আপনার মানে ধরে নিচ্ছেন CONTAINSএবং প্রকৃতপক্ষে এটি একটি বৈধ ক্যোয়ারিতে রেখেছেন) দ্রুত হওয়া উচিত, কারণ এটি সূচকের কিছু ফর্ম ব্যবহার করতে পারে (এই ক্ষেত্রে, একটি সম্পূর্ণ পাঠ্য সূচক)। অবশ্যই, ক্যোয়ারী এই ফর্মটি শুধুমাত্র উপলব্ধ হলে কলামটি একটি সম্পূর্ণ টেক্সট সূচক হয়। যদি তা না হয় তবে কেবলমাত্র প্রথম ফর্মটি উপলব্ধ।

প্রথম ক্যোয়ারী, LIKE ব্যবহার করে একটি সূচক ব্যবহার করতে অক্ষম হবে, যেহেতু এটি একটি ওয়াইল্ডকার্ড দিয়ে শুরু হয়, তাই সর্বদা একটি পূর্ণ টেবিল স্ক্যানের প্রয়োজন হবে।


CONTAINSক্যোয়ারী হওয়া উচিত:

SELECT * FROM table WHERE CONTAINS(Column, 'test');

@ এডজে - আপনার মানে, একই পৃষ্ঠাটি যা ইতিমধ্যে আমার প্রথম উল্লেখের সাথে লিঙ্কযুক্ত CONTAINS? এটা কি? প্রশ্নের মূল ফর্মটি Column CONTAIN("%test%",Column)>0যা বৈধের কাছাকাছি ছিল না। এটি এখনও পুরোপুরি ঠিক নয়।
ড্যামিয়েন_এ_বিশ্বাসীরা

এটি আমাদের শেয়ারপয়েন্টে একটি প্রশ্নের সমাধান করতে সহায়তা করেছে। আরেকটি দুর্দান্ত উত্তর ব্যাজ রয়েছে।
16 এএম

14

একটি এসকিউএল সার্ভার 2012 উদাহরণে উভয় প্রশ্ন চালানো, আমি নিশ্চিত করতে পারি যে প্রথম ক্যোয়ারী আমার ক্ষেত্রে সবচেয়ে দ্রুত ছিল।

LIKEকীওয়ার্ড সহ ক্যোয়ারিতে একটি ক্লাস্টারড ইনডেক্স স্ক্যান দেখানো হয়েছিল।

CONTAINSএছাড়াও সম্পূর্ণ টেক্সট ম্যাচের জন্য অতিরিক্ত অপারেটরদের সঙ্গে ক্লাস্টার সূচক স্ক্যান ছিল এবং মার্জ যোগদান করুন।

পরিকল্পনা


8
ক্লাস্টার সূচক পাতার পৃষ্ঠাগুলি হয় টেবিল। একটি LIKEএকটি নেতৃস্থানীয় ওয়াইল্ডকার্ড সঙ্গে ক্যোয়ারী দক্ষতার সূচক অংশ ব্যবহার করতে পারবেন না। এটি কেবল পুরো জিনিসটি স্ক্যান করতে হবে। নিঃসন্দেহে এমন কিছু পরিস্থিতি থাকতে পারে যেখানে সম্পূর্ণ সিআই স্ক্যান পুরো পাঠ্য সূচকটি ব্যবহার করে কোয়েরির চেয়ে আরও ভাল পারফর্ম করে (সম্ভবত উদাহরণস্বরূপ সারিগুলির একটি খুব বেশি অনুপাত মেলে তবে) এটি ব্যতিক্রম কিছু সাধারণ নিয়ম নয় যা আপনি "নিশ্চিত করতে পারেন" "।
মার্টিন স্মিথ

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

যদি এটি মার্জ যোগদান চয়ন করে তবে এসকিউএল সার্ভার অনুমান করছে যে সারিগুলির x% এরও বেশি সীমাবদ্ধতার সাথে প্রেস্টিকটি মিলবে। (যেখানে এক্স = টিপিং পয়েন্ট )। সেক্ষেত্রে আমি ভাবতাম উভয়ই সমানভাবে মিলিত হতে পারে। এক্সিকিউশন প্ল্যানে দেখানো ব্যয়গুলি কেবলমাত্র অনুমান (এমনকি আসল পরিকল্পনায়)। এফটি পরিকল্পনায় অতিরিক্ত এক্সিকিউশন প্ল্যান অপারেটর রয়েছে তবে এর কিছু সুবিধা রয়েছে। মার্চ জয়েন্ট স্ক্যান শেষ হওয়ার আগে থামাতে পারে যখন এটি FT ফলাফলের বাইরে চলে যায় এবং এটির মূল্যায়নও করতে হয় না LIKE
মার্টিন স্মিথ

1
আমি স্কিএল ২০১২ এ কার্যকর করার পরিকল্পনাটি পরীক্ষা করতে অনুরূপ ক্যোয়ারী চালিয়েছি এবং এটি আমাকে একটি সূচি সন্ধান দিয়েছে। সম্ভবত এখানে উদাহরণে টেবিলটি প্রায় খালি ছিল। কিছু ক্ষেত্রে স্ক্যুএল খুব কম টেবিলের পরিবর্তে সূচকটি ব্যবহার করার জন্য একটি সূচক স্ক্যান ব্যবহার করে কারণ দ্রুত হয়।
জুয়ান

8

আমি মনে করি এটি CONTAINSবেশি সময় নিয়েছে এবং ব্যবহৃত হয়েছে Mergeকারণ আপনার ক্যোয়ারীতে আপনার একটি ড্যাশ ছিল ("-") adventure-works.com

ড্যাশ একটি বিরতি শব্দ তাই CONTAINSঅনুসন্ধানের জন্য পূর্ণ-পাঠ্য সূচকটি অনুসন্ধান করে adventureএবং এর চেয়ে এটি অনুসন্ধান করে works.comএবং ফলাফলগুলিকে মার্জ করে।


8

এ থেকে পরিবর্তন করার চেষ্টা করুন:

    SELECT * FROM table WHERE Contains(Column, "test") > 0;

এটি:

    SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;

প্রাক্তন " এটি একটি পরীক্ষা " এবং " একটি টেস্ট-কেস পরিকল্পনা হ'ল " এর মতো মান সহ রেকর্ডগুলি সন্ধান করবে ।

পরবর্তীকালে " আমি এটি পরীক্ষা করছি " এবং " এটি সর্বশ্রেষ্ঠ " এর মতো মান সহ রেকর্ডগুলিও সন্ধান করবে ।


4
অনুসন্ধানের শব্দটি কাজের আগে এবং তারপরে কি তারাটি স্থাপন করে? এর জন্য ডকুমেন্টেশনগুলি পড়ার ক্ষেত্রে CONTAINS, এটি কেবল 'টেস্ট *' এর মতো উপসর্গ শর্তাদি ব্যবহার করে, ' পরীক্ষার' মতো প্রত্যয় পদ ব্যবহার করে না এবং '* পরীক্ষা ' এর মতো পুরো সাবস্ট্রিং অনুসন্ধান করে না । যদিও আমি চেষ্টা করে দেখিনি।
ম্যাট ফোরসথে 21

5
আপনি যদি কন্টেইনসের জন্য ডকুমেন্টেশন ( ডকস.মাইক্রোসফটকম / en- us/ sql/ t- sql/ queries/… ) পড়েন তবে কেবল উপসর্গ অনুসন্ধানের জন্য এটি সমর্থনযোগ্য। আমি পরীক্ষামূলকভাবে বহুবার এটি চেষ্টা করেছি এবং "এটি সর্বশ্রেষ্ঠ" (এসকিউএল
সেভারে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.