একটি পরিশোধিত অনুসন্ধান কার্যকর করার সেরা পদ্ধতি


17

ফিল্টার্ড অনুসন্ধান ফর্মটি প্রয়োগ করার ক্ষেত্রে আমি আপনাকে, আপনার মতামতটি জানতে চাই। আসুন নিম্নলিখিত বিষয়টি কল্পনা করুন:

  • প্রচুর কলাম সহ 1 টি বড় টেবিল
  • এই এসকিউএল সার্ভারটি বলা গুরুত্বপূর্ণ হতে পারে

এই টেবিলটিতে ডেটা অনুসন্ধান করার জন্য আপনাকে একটি ফর্ম প্রয়োগ করতে হবে এবং এই ফর্মটিতে আপনার কাছে বেশ কয়েকটি চেক বাক্স রয়েছে যা আপনাকে এই অনুসন্ধানটি কস্টমাইজ করার অনুমতি দেয়।

এখন আমার এখানে প্রশ্নটি হল নিম্নলিখিতগুলির মধ্যে কোনটির সন্ধানটি কার্যকর করার সবচেয়ে ভাল উপায় হওয়া উচিত?

  1. ভিতরে একটি কোয়েরি সহ একটি সঞ্চিত পদ্ধতি তৈরি করুন। এই সঞ্চিত পদ্ধতিটি অ্যাপ্লিকেশন দ্বারা পরামিতিগুলি দেওয়া হয়েছে কিনা তা যাচাই করবে এবং যদি তাদের কোনও ওয়াইল্ডকার্ড দেওয়া না হয় তবে ক্যোয়ারিতে রাখা হবে।

  2. একটি গতিশীল ক্যোয়ারী তৈরি করুন, যা অ্যাপ্লিকেশন দ্বারা প্রদত্ত যা অনুযায়ী তৈরি করা হয়।

আমি এটি জিজ্ঞাসা করছি কারণ আমি জানি যে এসকিউএল সার্ভার তার কার্যকারিতা অনুকূলকরণের জন্য, সঞ্চিত পদ্ধতিটি তৈরি হওয়ার সময় একটি কার্যকর পরিকল্পনা তৈরি করে, তবে আমরা কীভাবে সম্পাদন পরিকল্পনার দ্বারা অর্জিত অপ্টিমাইজেশনটিকে ত্যাগ করব?

আপনার বিরোধিতা সেরা পদ্ধতির কি হবে দয়া করে আমাকে বলুন।


আপনি নীচে লিখেছেন যে আপনি গতিশীল সমাধানের দিকে ঝুঁকছেন। এটি দুর্দান্ত, কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি সম্ভাব্য ফিল্টারগুলি গণনা করেছেন এবং সূচকগুলি তাদের সমর্থন করছেন। প্রশ্নগুলি যতক্ষণ না ধারাবাহিকভাবে নির্মিত হয় ততক্ষণ তাদের দক্ষ হওয়া উচিত।
ম্যাথু ফ্লিন

উত্তর:


10

আপনি এই জাতীয় প্রশ্নের উত্তরটি এখানে দেখতে চাইতে পারেন: /programming/11329823/add-where-clauses-to-sql-dynamically-programically

আমরা খুঁজে পেয়েছি যে একটি স্প্রোক যা aচ্ছিক পরামিতিগুলির একগুচ্ছ গ্রহণ করে এবং ফিল্টারটিকে এভাবে প্রয়োগ করে:

CREATE PROC MyProc (@optionalParam1 NVARCHAR(50)=NULL, @optionalParam2 INT=NULL)
AS 
...
SELECT field1, field2, ... FROM [Table]
WHERE 
  (@optionalParam1 IS NULL OR MyColumn1 = @optionalParam1)
  AND (@optionalParam2 IS NULL OR MyColumn2 = @optionalParam2)

এটি প্রথম প্রয়োগকারী পরিকল্পনাকে ক্যাশে করবে (উদাহরণস্বরূপ @optionalParam1 = 'Hello World', @optionalParam2 = NULL) এটি দিয়ে চালানো হয় তবে আমরা যদি এটি iseচ্ছিক প্যারামিটারগুলির একটি পৃথক সেট (উদাহরণস্বরূপ @optionalParam1 = NULL, @optionalParam2 = 42) পাস করি তবে খারাপভাবে সঞ্চালন করুন । (এবং স্পষ্টতই আমরা ক্যাশেড পরিকল্পনার পারফরম্যান্স চাই, তাই WITH RECOMPILEবাইরে)

এখানে ব্যতিক্রমটি হ'ল ifচ্ছিক প্যারামিটারগুলি ছাড়াও যদি কোয়েরিতে ALSO কমপক্ষে একটি পৃথক ফিল্টার থাকে যা উচ্চতর নির্বাচনী এবং সঠিকভাবে সূচকযুক্ত হয়, তবে উপরোক্ত PROC জরিমানা সম্পাদন করবে।

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

নীচের মতো গতিশীল এসকিউএল কোয়েরি প্যারামিটারগুলির প্রতিটি অনুক্রমের জন্য একটি পৃথক পরিকল্পনা তৈরি এবং ক্যাশে করবে, তবে কমপক্ষে প্রতিটি পরিকল্পনা নির্দিষ্ট ক্যোয়ারির জন্য 'উপযুক্ত' হবে (এটি কোনও প্রোসি বা অ্যাডহক এসকিউএল কিনা তা বিবেচনা করে না) - যতক্ষণ তারা প্যারামিটারাইজড কোয়েরি হয় ততক্ষণ তাদের ক্যাশে রাখা হবে)

সুতরাং এর জন্য আমার পছন্দ:

DECLARE @SQL NVARCHAR(MAX)        

-- Mandatory / Static part of the Query here
SET @SQL = N'SELECT * FROM [table] WHERE 1 = 1'

IF @OptionalParam1 IS NOT NULL        
    BEGIN        
        SET @SQL = @SQL + N' AND MyColumn1 = @optionalParam1'    
    END        

IF @OptionalParam2 IS NOT NULL        
    BEGIN        
        SET @SQL = @SQL + N' AND MyColumn2 = @optionalParam2'    
    END        

EXEC sp_executesql @SQL,        
    N'@optionalParam1 NVARCHAR(50), 
      @optionalParam2 INT'
    ,@optionalParam1 = @optionalParam1
    ,@optionalParam2 = @optionalParam2

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


1
হ্যাঁ আমি তাই ভেবেছিলাম, এই বিকল্পটি আমি বেছে নিই। এটি নিশ্চিত করতে চেয়েছিলেন যে এটি একটি ভাল। প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ.
j0N45

"যদি কোনও এসকিউএল স্টেটমেন্ট প্যারামিটার ছাড়াই কার্যকর করা হয়, এসকিউএল সার্ভার একটি বিদ্যমান এক্সিকিউশন পরিকল্পনার সাথে এটির মিলের সম্ভাবনা বাড়াতে অভ্যন্তরীণভাবে বিবৃতিটিকে পরামিত করে This এই প্রক্রিয়াটিকে সাধারণ পরামিতি বলা হয়" " সুতরাং মূলত প্রোগ্রামটি "যেখানে ফাইলের নাম্বার =" + ফাইলের নাম হিসাবে কিছু ব্যবহার করতে পারে। অবশ্যই, এটি কৃমির একটি ক্যান খোলে তবে এটি একটি ভিন্ন বিষয় ;-)
কোডিজম

5

আপনি যেটি প্রয়োগ করা সহজ বলে মনে করেন তা দিয়ে শুরু করুন (আমার ধারণা বিকল্প 2)। তারপরে বাস্তব বিশ্বের ডেটাগুলির জন্য কর্মক্ষমতা পরিমাপ করুন। আগে যখন প্রয়োজন হবে কেবল তখনই অনুকূলকরণ শুরু করুন।

যাইহোক, আপনার অনুসন্ধান ফিল্টারগুলি কতটা জটিল তা নির্ভর করে আপনার কাজটি ডায়নামিক এসকিউএল ছাড়া সহজেই সমাধান করা যায় না। সুতরাং আপনি যখন কোনও সঞ্চিত পদ্ধতি ব্যবহার করেন তখনও সম্ভবত এটি আপনার কর্মক্ষমতা বৃদ্ধি করবে না, যেমনটি আপনি ইতিমধ্যে সন্দেহ করছেন। অন্যদিকে, যদি এটি সাহায্য করে তবে বিভিন্ন ধরণের ইঙ্গিত রয়েছে ( http://www.simple-talk.com/sql/performance/controlling-execution-plans-with-hints/ ) আপনি একটি এসকিউএল যুক্ত করতে পারেন এসকিউএল সার্ভারকে কার্যকর করার পরিকল্পনার অনুকূলকরণ করতে সহায়তা করার জন্য ক্যোয়ারী, গতিশীল বা না।


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

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