sql - ফাংশন বনাম এসকিউএল সার্ভারে সংরক্ষিত প্রসেসর




sql-server tsql (12)

আমি বুঝতে পারছি এটি একটি পুরানো প্রশ্ন, কিন্তু আমি কোনও উত্তরটিতে উল্লেখযোগ্য একটি গুরুত্বপূর্ণ দিক দেখছি না: প্রশ্নবিদ্ধ পরিকল্পনাটিতে সূচিত করা হয়েছে।

কাজ হতে পারে ...

  1. স্কালে:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. বহু বিবৃতি টেবিল মূল্যবান:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. ইনলাইন টেবিল মূল্যবান:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

তৃতীয় ধরনের (ইনলাইন টেবিল-মূল্যবান) কোয়েরি অপ্টিমাইজারটি মূলত (প্যারামেট্রিজড) মতামতগুলির দ্বারা চিকিত্সা করা হয়, যার অর্থ আপনার প্রশ্নের থেকে ফাংশনটির উল্লেখ করাটি ফাংশনের এসকিউএল শরীরের অনুলিপি করা (আসলে কপি-পেস্টিং ব্যতীত) নিম্নলিখিত সুবিধা থেকে:

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

উপরে সম্ভাব্য উল্লেখযোগ্য কর্মক্ষমতা সঞ্চয় হতে পারে, বিশেষ করে যখন ফাংশন একাধিক স্তর মিশ্রন।

দ্রষ্টব্য: এসকিউএল সার্ভার 2019 মনে করে স্কলার ফাংশন কিছু ফর্ম পরিচয় করিয়ে দেবে।

আমি বেশ কিছুক্ষণের জন্য ফাংশন এবং সংরক্ষিত পদ্ধতি শিখছি কিন্তু আমি কখন এবং কখন কোনও ফাংশন বা সংরক্ষিত পদ্ধতি ব্যবহার করতে পারি তা আমি জানি না। তারা আমাকে একইরকম মনে করে, কারণ আমি তার সম্পর্কে নবাগত নই।

কেউ আমাকে বলতে পারেন কেন?


একটি একক মান ফেরত যে ফাংশন দিয়ে শুরু করুন। চমৎকার জিনিস আপনি ফাংশনটিতে ঘন ঘন ব্যবহৃত কোডটি রাখতে এবং ফলাফল সেটে কলাম হিসাবে তাদের ফিরিয়ে আনতে পারেন।

তারপরে, আপনি শহরগুলির প্যারামিটারযুক্ত তালিকাগুলির জন্য একটি ফাংশন ব্যবহার করতে পারেন। dbo.GetCitiesIn ("NY") একটি টেবিল প্রদান করে যা একটি যোগদান হিসাবে ব্যবহার করা যেতে পারে।

এটি কোড সংগঠনের একটি উপায়। কিছু পুনঃব্যবহারযোগ্য এবং যখন এটি সময় অপচয় হয় তা জানা কিছু শুধুমাত্র ট্রায়াল এবং ত্রুটি এবং অভিজ্ঞতা মাধ্যমে অর্জিত হয়।

এছাড়াও, ফাংশন SQL সার্ভারে একটি ভাল ধারণা। তারা দ্রুত এবং বেশ শক্তিশালী হতে পারে। ইনলাইন এবং সরাসরি নির্বাচন। অতিরিক্ত ব্যবহার না সতর্ক।


এখানে সংরক্ষিত পদ্ধতির উপর ফাংশন পছন্দ করতে একটি বাস্তব কারণ। যদি আপনার একটি সংরক্ষিত পদ্ধতি রয়েছে যা অন্য কোন সংরক্ষিত পদ্ধতির ফলাফলের প্রয়োজন হয় তবে আপনাকে একটি সন্নিবেশ-কার্যকর বিবৃতি ব্যবহার করতে হবে। এর অর্থ হল আপনি টেম্প টেবিল তৈরি করতে এবং টেম্প টেবিলে সংরক্ষিত পদ্ধতির ফলাফল সন্নিবেশ করার জন্য একটি কার্যকর বিবৃতি ব্যবহার করতে হবে। এটা নোংরা। এর সাথে একটি সমস্যা হল যে insert-execs নিস্তেজ করা যাবে না

যদি আপনি সংরক্ষণ করা পদ্ধতিগুলির সাথে আটকে থাকেন যেগুলি অন্য সঞ্চিত পদ্ধতিগুলিকে কল করে তবে আপনি এটিকে চালাতে পারেন। ন্যস্ত স্টোরেড পদ্ধতিটি কেবলমাত্র একটি ডেটাসেট ফেরত পাঠায়, এটি একটি টেবিল-মূল্যযুক্ত ফাংশন দিয়ে প্রতিস্থাপিত হতে পারে এবং আপনি আর এই ত্রুটিটি পাবেন না।

( এই আরেকটি কারণ আমরা ডাটাবেসের বাইরে ব্যবসা যুক্তি রাখা উচিত )


এসকিউএল সার্ভারে, ফাংশন এবং সংরক্ষিত পদ্ধতি দুটি ভিন্ন ধরণের সংস্থা।

ফাংশন: এসকিউএল সার্ভার ডাটাবেস, ফাংশন কিছু কর্ম সঞ্চালনের জন্য ব্যবহার করা হয় এবং কর্ম অবিলম্বে একটি ফলাফল প্রদান করে। ফাংশন দুটি ধরনের হয়:

  1. সিস্টেম সংজ্ঞায়িত

  2. ব্যবহারকারী সংজ্ঞায়িত

সংরক্ষিত পদ্ধতি: SQL সার্ভারে, সঞ্চিত পদ্ধতিগুলি সার্ভারে সংরক্ষণ করা হয় এবং এটি শূন্য, একক এবং একাধিক মানগুলি ফিরে যেতে পারে। সংরক্ষিত পদ্ধতি দুটি ধরনের:

  1. সিস্টেম সংরক্ষিত প্রসেসর
  2. ব্যবহারকারী নির্ধারিত পদ্ধতি

কার্যাবলী গণনা করা হয় এবং SQL সার্ভারে স্থায়ী পরিবেশগত পরিবর্তনগুলি সম্পাদন করতে পারে না (অর্থাত কোন ইনসার্ট বা আপডেট বিবৃতি অনুমোদিত নয়)।

এটি একটি স্কলার মান প্রদান করে যদি একটি ফাংশন এসকিউএল বিবৃতিগুলিতে ইনলাইন ব্যবহার করা যেতে পারে, অথবা এটি একটি ফলাফল সেট প্রদান করলে যোগদান করা যেতে পারে।

মন্তব্য থেকে নোট মূল্য একটি বিন্দু, উত্তর সংক্ষিপ্তসার যা। @ সেনান কে অ্যান্ডারসনের ধন্যবাদ:

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


কার্সারগুলির মতো SQL সার্ভার ফাংশনগুলি আপনার শেষ অস্ত্র হিসাবে ব্যবহার করা হয়! তারা কর্মক্ষমতা সমস্যা আছে এবং তাই একটি টেবিল মূল্যবান ফাংশন ব্যবহার যতটা সম্ভব এড়াতে হবে। কর্মক্ষমতা সম্পর্কে কথা বলা হচ্ছে একটি টেবিল সম্পর্কে কথা বলা যা 1000,000 এর বেশি রেকর্ড মধ্যম-শ্রেণীর হার্ডওয়্যারে সার্ভারে হোস্ট করা হয়; অন্যথায় আপনি ফাংশন দ্বারা সৃষ্ট কর্মক্ষমতা আঘাত সম্পর্কে চিন্তা করতে হবে না।

  1. কোনও ফাংশন ব্যবহার করবেন না ফলাফল-একটি বাহ্যিক কোডে সেট করুন (যেমন ADO.Net)
  2. যতটা সম্ভব মতামত / সংরক্ষিত procs সংমিশ্রণ ব্যবহার করুন। আপনি DTA (ডেটাবেস টিউনিং অ্যাডভাইজার) এর পরামর্শগুলি ব্যবহার করে ভবিষ্যতে বর্ধিত কর্মক্ষমতা সংক্রান্ত সমস্যাগুলি থেকে পুনরুদ্ধার করতে পারেন (যেমন সূচিবদ্ধ মতামত এবং পরিসংখ্যান) - কখনও কখনও!

আরও রেফারেন্সের জন্য দেখুন: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


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

ফাংশন সাধারণত একটি আউটপুট এবং বিকল্পভাবে ইনপুট আছে। আউটপুটটি তখন অন্য ফাংশনে ইনপুট হিসাবে ব্যবহার করা যেতে পারে (একটি SQL সার্ভার যা ডেটাডাইফ, লেন, ইত্যাদি অন্তর্নির্মিত) বা SQL সার্ভারের পূর্বরূপ হিসাবে - উদাহরণস্বরূপ, SELECT a, b, dbo.MyFunction(c) FROM table বা SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)

সঞ্চিত প্রসেসগুলি একটি লেনদেনের মধ্যে একত্রে এসকিউএল প্রশ্নগুলি এবং বাইরের বিশ্বের সাথে ইন্টারফেস সংযুক্ত করতে ব্যবহার করা হয়। যেমন ADO.NET, ফ্রেমওয়ার্কগুলি সরাসরি একটি ফাংশন কল করতে পারে না, তবে তারা সরাসরি সংরক্ষিত প্রসেস কল করতে পারে।

কারনগুলির মধ্যে একটি লুকানো বিপদ রয়েছে যদিও: তাদের অপব্যবহার করা যেতে পারে এবং খারাপ কর্মক্ষমতা সম্পর্কিত সমস্যাগুলির কারণ হতে পারে: এই প্রশ্নটি বিবেচনা করুন:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

যেখানে MyFunction হিসাবে ঘোষণা করা হয়:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

এখানে কী ঘটেছে যে ফাংশন MyFunction টেবিল MyTable প্রতিটি সারির জন্য বলা হয়। যদি MyTable এর 1000 সারি থাকে তবে এটি ডাটাবেসের বিরুদ্ধে 1000 টি অতিরিক্ত তথ্য। একইভাবে, যদি কলাম স্পিকে নির্দিষ্ট করা থাকে তবে ফাংশনটি বলা হয়, তবে ফাংশনটিকে SELECT দ্বারা ফেরত প্রতিটি সারির জন্য বলা হবে।

তাই আপনি সতর্কতা লেখার ফাংশন হতে হবে না। যদি আপনি একটি ফাংশনে কোনও টেবিলে থেকে নির্বাচন করেন তবে আপনাকে নিজেকে জিজ্ঞাসা করতে হবে যে এটি কীভাবে অভিভাবক সংরক্ষিত প্রসেস বা অন্য কোনও SQL নির্মাণে (যেমন CASE ... JOEN ... ELSE ... শেষ).


যখন আপনি গণনা করতে চান এবং অন্য এসকিউএল বিবৃতিগুলিতে ব্যবহারের জন্য একটি মান ফেরত চান তখন একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন লিখুন; পরিবর্তে একটি SQL সার্ভারের সম্ভবত জটিল সেট গ্রুপ করতে চান যখন একটি সংরক্ষিত পদ্ধতি লিখুন। এই সব পরে, দুটি চমত্কার ব্যবহার ক্ষেত্রে হয়!


সংরক্ষিত পদ্ধতি এবং ব্যবহারকারী-সংজ্ঞায়িত ফাংশন মধ্যে পার্থক্য:

  • সংরক্ষিত বিবৃতি নির্বাচন বিবৃতি ব্যবহার করা যাবে না।
  • সংরক্ষিত পদ্ধতি ডিফার্ড নাম রেজল্যুশন সমর্থন করে।
  • সংরক্ষিত পদ্ধতি সাধারণত ব্যবসা যুক্তি সম্পাদনের জন্য ব্যবহার করা হয়।
  • সংরক্ষিত পদ্ধতি কোনো ডাটাটাইপ ফেরত দিতে পারেন।
  • সংরক্ষিত পদ্ধতি ব্যবহারকারী সংজ্ঞায়িত ফাংশন চেয়ে ইনপুট প্যারামিটার বেশি সংখ্যক গ্রহণ করতে পারে। সংরক্ষিত পদ্ধতি পর্যন্ত 21,000 ইনপুট পরামিতি থাকতে পারে।
  • সংরক্ষিত পদ্ধতি ডাইনামিক এসকিউএল চালানো যাবে।
  • সংরক্ষিত পদ্ধতি ত্রুটি হ্যান্ডলিং সমর্থন।
  • অ-নির্ধারণমূলক ফাংশন সংরক্ষিত পদ্ধতিতে ব্যবহার করা যেতে পারে।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন নির্বাচন বিবৃতি ব্যবহার করা যেতে পারে।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন Deferred নাম রেজল্যুশন সমর্থন করে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন সাধারণত computations জন্য ব্যবহার করা হয়।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন একটি মান ফিরে করা উচিত।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন চিত্র ফেরত দিতে পারে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন সঞ্চিত পদ্ধতির চেয়ে ইনপুট পরামিতিগুলির ছোট সংখ্যা গ্রহণ করে। UDFs পর্যন্ত 1,023 টি ইনপুট প্যারামিটার থাকতে পারে।
  • অস্থায়ী টেবিল ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ব্যবহার করা যাবে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন গতিশীল এসকিউএল চালানো যাবে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ত্রুটি হ্যান্ডলিং সমর্থন করে না। RAISEERROR অথবা @@ERROR অনুমোদিত নয়।
  • অ-নির্ধারণমূলক ফাংশন UDF তে ব্যবহার করা যাবে না। উদাহরণস্বরূপ, GETDATE() ব্যবহার করা যাবে না।

মৌলিক পার্থক্য

ফাংশনটি একটি মান প্রদান করতে হবে তবে সংরক্ষণ করা পদ্ধতিতে এটি ঐচ্ছিক (প্রক্রিয়াটি শূন্য বা এন মানগুলি ফেরত দিতে পারে)।

কার্যকারিতাগুলির জন্য কেবলমাত্র ইনপুট প্যারামিটার থাকতে পারে তবে প্রক্রিয়াগুলিতে ইনপুট / আউটপুট পরামিতি থাকতে পারে।

ফাংশনটি একটি ইনপুট প্যারামিটার এটি বাধ্যতামূলক করে তবে সঞ্চয় করা পদ্ধতিতে এন ইনপুট প্যারামিটারগুলি নিতে পারে ..

কার্যকারিতা থেকে ফাংশনগুলি বলা যেতে পারে তবে প্রক্রিয়াগুলি ফাংশন থেকে কল করা যাবে না।

অগ্রিম পার্থক্য

পদ্ধতিটি নির্বাচন করে ডিএমএল (ইনসার্ট / আপডেট / ডেলিটি) বিবৃতিটি নির্বাচন করে এবং ফাংশনটি কেবলমাত্র SELECT বিবৃতিটিকে অনুমোদন করে।

পদ্ধতিগুলি একটি নির্বাচন বিবৃতিতে ব্যবহার করা যাবে না তবে ফাংশনটি একটি নির্বাচন বিবৃতিতে এম্বেড করা যেতে পারে।

স্টোরেড প্রসেসগুলি এসকিউএল স্টেটমেন্টে যেখানে কোথাও / হাইভিং / সিলেক্ট সেকশনে ব্যবহার করা যাবে না ফাংশন হতে পারে।

টেবিল ফিরে যে ফাংশন অন্য rowset হিসাবে গণ্য করা যেতে পারে। এই অন্যান্য টেবিল সঙ্গে যোগদান ব্যবহার করা যেতে পারে।

ইনলাইন ফাংশন যদিও প্যারামিটার নিতে পারে এবং JOINs এবং অন্যান্য Rowset ক্রিয়াকলাপগুলিতে এটি ব্যবহার করা যেতে পারে।

অ্যাক্সেসেশনটি ট্র্যাক-ক্যাচ ব্লক দ্বারা একটি পদ্ধতিতে পরিচালনা করা যেতে পারে, তবে ট্রাই-ক্যাচ ব্লকটি ফাংশনে ব্যবহার করা যাবে না।

আমরা পদ্ধতিতে ট্রানজেকশন পরিচালনার জন্য যেতে পারি, তবে আমরা ফাংশনে যেতে পারছি না।

source


              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
   temporary tables                    |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                           statements.

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




sql-function