কার্যাদি বনাম সঞ্চিত প্রক্রিয়া Pro


88

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

সংক্ষেপে, আমি যা জানতে চাই তা হ'ল:

ফাংশন এবং সঞ্চিত পদ্ধতির মধ্যে প্রধান পার্থক্যগুলি কোনটি? এক বা অন্যটি ব্যবহারের জন্য আমাকে কী বিবেচনায় নিতে হবে?


4
এই নিখুঁত উত্তর হবে বলে মনে হয় stackoverflow.com/a/1179778/365188
Ozair Kafray

উত্তর:


51

আপনি যদি এই টুকরা কোডের ফলাফলটি অন্য টেবিলের সাথে একত্রিত করতে চান তবে অবশ্যই একটি টেবিল-মূল্যবান ফাংশন আপনাকে একক নির্বাচনী বিবৃতিতে ফলাফল রচনা করতে দেয়।

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

সুতরাং যে কোনও একটি নমনীয়ভাবে আপনাকে আপনার কাঙ্ক্ষিত ফলাফলটি প্রকাশ করতে দেয় use


50

ফাংশনগুলি অবশ্যই ডিটারমিনিস্টিক হতে হবে এবং এটি ডাটাবেসে পরিবর্তন আনতে ব্যবহার করা যাবে না, যেখানে সঞ্চিত পদ্ধতি আপনাকে সন্নিবেশ এবং আপডেট ইত্যাদি করতে দেয় etc.

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

তবে তারা খুব নির্দিষ্ট ক্ষেত্রে সারণী-মূল্যবান রিটার্নের জন্য অবশ্যই কার্যকর।

যদি আপনাকে কোনও পদ্ধতিতে অ্যারে পাস করার অনুকরণের জন্য কমা-বিস্মৃত তালিকাটি পার্স করতে হয় তবে একটি ফাংশন তালিকাটি আপনার জন্য একটি টেবিলের মধ্যে পরিণত করতে পারে। এটি এসকিএল সার্ভার ২০০ with এর সাথে প্রচলিত অনুশীলন, যেহেতু আমরা এখনও সঞ্চিত পদ্ধতিতে টেবিলে পাস করতে পারি না (আমরা ২০০৮ এর সাথে পারি)।


4
কিন্তু আপনি যদি একটি সঞ্চিত পদ্ধতির এক্সএমএল পাঠাতে পারেন stackoverflow.com/questions/144550/...
cllpse

4
ভুল, বেশিরভাগ এসকিউএল সার্ভারের ফাংশনগুলি হ'ল এমএস-এসকিউএল সার্ভারে গেটডেটের মতো অ-সংজ্ঞাবিরোধী। কেবল ওডিবিসি ফাংশন হ'ল ক্যানোনিকাল ফাংশন (= আরও দ্রুত + ইনডেক্সযোগ্য) ... তবে আপনি খুব সঠিক, কারও পারফরম্যান্সের কারণে প্রশ্নগুলিতে ফাংশনগুলির ব্যবহার যতটা সম্ভব সীমাবদ্ধ করা উচিত।
স্টিফান স্টেইগার

45

ডক্স থেকে :

যদি কোনও সঞ্চিত পদ্ধতি নীচের মানদণ্ডগুলি পূরণ করে তবে এটি একটি সারণী-মূল্যবান ফাংশন হিসাবে আবারও লেখার জন্য ভাল প্রার্থী:

  • যুক্তিটি একটি একক নির্বাচিত বিবৃতিতে প্রকাশযোগ্য তবে কেবলমাত্র পরামিতিগুলির প্রয়োজনের কারণে ভিউয়ের পরিবর্তে সঞ্চিত পদ্ধতি।

  • সঞ্চিত পদ্ধতিটি টেবিল ভেরিয়েবলগুলি ব্যতীত আপডেট ক্রিয়াকলাপ সম্পাদন করে না।

  • ডায়নামিক এক্সিকিউটি স্টেটমেন্টের দরকার নেই।

  • সঞ্চিত পদ্ধতিতে একটি ফলাফল সেট ফেরত দেয়।

  • সঞ্চিত পদ্ধতির প্রাথমিক উদ্দেশ্য হ'ল মধ্যবর্তী ফলাফলগুলি তৈরি করা যা অস্থায়ী টেবিলের মধ্যে লোড করা হয়, যা পরে একটি নির্বাচনী বিবৃতিতে অনুসন্ধান করা হয়।


12

আমি সঞ্চিত পদ্ধতি এবং ফাংশনগুলির মধ্যে কয়েকটি আকর্ষণীয় পার্থক্য লিখতে চলেছি।

  • আমরা নির্বাচিত প্রশ্নগুলিতে ফাংশন ব্যবহার করতে পারি তবে আমরা নির্বাচিত প্রশ্নগুলিতে সঞ্চিত পদ্ধতি ব্যবহার করতে পারি না।
  • আমরা ফাংশনগুলিতে অ ডিটারমিনিটিক ফাংশন ব্যবহার করতে পারি না তবে আমরা সঞ্চিত পদ্ধতিতে অ-ডেন্টিস্টেমিক ফাংশন ব্যবহার করতে পারি। এখন প্রশ্ন আসে, অ-নিরস্তক কর্ম কী .. উত্তরটি হল: -

    নন ডিস্ট্রিমেন্টিক ফাংশনটি হ'ল ফাংশন যা বিভিন্ন সময়ে একই ইনপুট মানগুলির জন্য আলাদা আউটপুট দেয় যেমন গেটডিট ()। এটি যখনই চালানো হয় তখন সর্বদা বিভিন্ন মান দেয়।

    ব্যতিক্রম: -

    এসকিএল 2000 এর পূর্বে এসকিএল সার্ভারের পূর্ববর্তী সংস্করণগুলি ব্যবহারকারী সংজ্ঞায়িত ফাংশনগুলিতে গেটডেট () ফাংশন ব্যবহার করার অনুমতি দেয় না, তবে সংস্করণ 2005 এবং এর পরে আমাদের ব্যবহারকারীর সংজ্ঞায়িত ফাংশনের মধ্যে গেটডেট () ফাংশন ব্যবহার করতে দেয়।

    নিউড () হ'ল ডিটারমিনিস্টিক ফাংশনের আরেকটি উদাহরণ তবে এটি ব্যবহারকারী সংজ্ঞায়িত ফাংশনে ব্যবহার করা যায় না তবে আমরা এটি সঞ্চিত পদ্ধতিতে ব্যবহার করতে পারি।

  • আমরা একটি সঞ্চিত পদ্ধতিতে ডিএমএল (সন্নিবেশ, আপডেট, মুছুন) বিবৃতি ব্যবহার করতে পারি তবে আমরা শারীরিক টেবিল বা স্থায়ী টেবিলের ফাংশনে ডিএমএল স্টেটমেন্ট ব্যবহার করতে পারি না। যদি আমরা ফাংশনে ডিএমএল অপারেশন করতে চাই তবে আমরা এটি টেবিল ভেরিয়েবলের মাধ্যমে স্থায়ী টেবিলগুলিতে না করে করতে পারি।

  • আমরা ফাংশনটির মধ্যে ত্রুটি পরিচালনার ব্যবহার করতে পারি না তবে আমরা সঞ্চিত পদ্ধতিতে ত্রুটি পরিচালনা করতে পারি।


কীভাবে মাইএসকিউএল ফাংশনগুলিতে ডিএমএল অপারেশনগুলি সমর্থনযোগ্য?
জোয়ে পিন্টো

@ জোয়েপিন্টো কারণ মাইএনএনএসকিএল এসকিউএল অভিযোগ নয়। অবশ্যই, এটিতে অতিরিক্ত রয়েছে তবে বেসিকগুলি নেই।
পারফরম্যান্সডিবিএ

8
  1. পদ্ধতিটি শূন্য বা এন মানগুলি ফিরিয়ে দিতে পারে তবে ফাংশনটি এমন একটি মান প্রদান করতে পারে যা বাধ্যতামূলক।

  2. পদ্ধতিগুলির জন্য এটির জন্য ইনপুট / আউটপুট পরামিতি থাকতে পারে যখন ফাংশনগুলিতে কেবল ইনপুট পরামিতি থাকতে পারে।

  3. পদ্ধতি এটির মধ্যে ডিএমএল স্টেটমেন্টের পাশাপাশি নির্বাচনের অনুমতি দেয় যেখানে ফাংশন এতে কেবল নির্বাচিত বিবৃতি দেয়।

  4. প্রক্রিয়া থেকে কার্য কল করা যেতে পারে যেখানে কার্যক্রিয়া থেকে পদ্ধতিগুলি কল করা যায় না।

  5. কোনও পদ্ধতিতে ট্রাই-ক্যাচ ব্লক দ্বারা ব্যতিক্রম হ্যান্ডেল করা যায় তবে ফাংশনে ট্রাই-ক্যাচ ব্লক ব্যবহার করা যায় না।

  6. আমরা কার্যক্রমে লেনদেন পরিচালনার জন্য যেতে পারি যেখানে আমরা কার্যক্রমে যেতে পারি না।

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

  8. ইউডিএফ (ব্যবহারকারী সংজ্ঞায়িত ফাংশন) এসকিউএল স্টেটমেন্টগুলিতে WHERE/ HAVING/ SELECTবিভাগের যে কোনও জায়গায় ব্যবহার করা যেতে পারে যেখানে সঞ্চিত পদ্ধতি থাকতে পারে না।

  9. ইউডিএফগুলি যে টেবিলগুলি ফেরত দেয় তাদের অন্য সারি সেট হিসাবে বিবেচনা করা যেতে পারে। এটি JOINঅন্য টেবিলগুলির সাথে গুলি ব্যবহার করতে পারে ।

  10. ইনলাইন ইউডিএফগুলি প্যারামিটারগুলির মতামত হিসাবে হতে পারে এবং এটি JOINএবং অন্যান্য রোসেট ক্রিয়াকলাপে ব্যবহৃত হতে পারে ।


6

আপনার যদি কোনও ফাংশন থাকে তবে আপনি এটি আপনার এসকিউএল স্টেটমেন্টের অংশ হিসাবে ব্যবহার করতে পারেন, উদাহরণস্বরূপ

SELECT function_name(field1) FROM table

সঞ্চিত পদ্ধতিগুলির জন্য এটি এভাবে কাজ করে না।


4
আমি মনে করি তিনি ফাংশনগুলির বিষয়ে কথা বলছিলেন যা টেবিলের মানগুলি ফিরিয়ে দেয়।
ডাব্লুএমসি

4
ঠিক আছে, আমি সাধারণভাবে কথা বলছি। তবে আমার নির্দিষ্ট ক্ষেত্রে আমি বর্তমানে একটি সঞ্চিত পদ্ধতি বা টেবিল-মূল্যবান ফাংশনের মধ্যে আছি।
অরন

5

আমি একটি দীর্ঘ চলমান বিট যুক্তি দিয়ে কিছু পরীক্ষা চালিয়েছি, একই বিট কোডের সাথে (একটি দীর্ঘ নির্বাচনী বিবৃতি) একটি টেবিলের মূল্যবান ফাংশন এবং একটি সঞ্চিত পদ্ধতি এবং একটি সোজা এক্সইসি / নির্বাচন, এবং প্রত্যেকে একইভাবে সম্পাদিত হয়েছিল।

আমার মতে ফলাফলের সেটটি ফেরত দেওয়ার জন্য সর্বদা সঞ্চিত পদ্ধতির পরিবর্তে একটি সারণী মূল্যবান ফাংশন ব্যবহার করুন, কারণ এটি যুক্তিগুলিকে পরবর্তীকালে তাদের সাথে যুক্ত হওয়া প্রশ্নগুলিতে অনেক সহজ এবং পাঠযোগ্য করে তোলে এবং আপনাকে একই যুক্তি পুনরায় ব্যবহার করতে সক্ষম করে। খুব বেশি পারফরম্যান্সের হিট এড়াতে, প্রায়শই ফলটি সেটটি দ্রুত হতে ফাংশনটি ফিরিয়ে দিতে সক্ষম করতে আমি প্রায়শই "alচ্ছিক" প্যারামিটারগুলি (অর্থাত আপনি তাদের কাছে NULL পাস করতে পারেন) ব্যবহার করি:

CREATE FUNCTION dbo.getSitePermissions(@RegionID int, @optPersonID int, optSiteID int)
AS
RETURN 
    SELECT DISTINCT SiteID, PersonID
    FROM dbo.SiteViewPermissions
    WHERE (@optPersonID IS NULL OR @optPersonID = PersonID)
    AND (@optSiteID IS NULL OR @optSiteID = SiteID)
    AND @RegionID = RegionID

এই ফাংশনটি আপনি বিভিন্ন পরিস্থিতিতে ব্যবহার করতে পারেন এবং একটি দুর্দান্ত পারফরম্যান্স হিট করবেন না। আমি বিশ্বাস করি এটি পরে ফিল্টারিংয়ের চেয়ে আরও দক্ষ efficient

SELECT * FROM dbo.getSitePermissions(@RegionID) WHERE SiteID = 1

আমি এই কৌশলটি বেশ কয়েকটি ফাংশনে ব্যবহার করেছি, কখনও কখনও এই ধরণের "alচ্ছিক" পরামিতিগুলির দীর্ঘ তালিকা সহ।


4

আমি ব্যক্তিগতভাবে সারণী মূল্যবান ফাংশনগুলি ব্যবহার করি যখন আমি ফিরছি সমস্তই কোনও একক টেবিলের কোনও প্রভাব নেই। মূলত আমি তাদের প্যারামিটারাইজড ভিউগুলির মতোই আচরণ করি।

যদি আমার একাধিক রেকর্ডসেট ফেরত আসে বা যদি সারণিতে মানগুলি আপডেট হয় তবে আমি একটি সঞ্চিত পদ্ধতি ব্যবহার করি।

আমার 2 সেন্ট


4

উপরে উল্লিখিত হিসাবে, ফাংশনগুলি আরও পঠনযোগ্য / কমপোজযোগ্য / স্ব ডকুমেন্টিং, তবে সাধারণভাবে কম পারফরম্যান্ট হয় এবং আপনি যদি এর সাথে যোগ দেন তবে আপনি গুরুতরভাবে কম পারফরম্যান্ট হতে পারেন as

SELECT *
FROM dbo.tvfVeryLargeResultset1(@myVar1) tvf1
INNER JOIN dbo.tvfVeryLargeResultset1(@myVar2) tvf2
    ON (tvf1.JoinId = tvf2.JoinId)

প্রায়শই, আপনাকে কেবল কোডের অতিরিক্ত কাজটি গ্রহণ করতে হবে যা একটি টিভিফ মুছে ফেলতে পারে (অগ্রহণযোগ্য পারফরম্যান্স ব্যয়ে।)

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


1

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


1

এটি নির্ভর করে :) আপনি যদি অন্য পদ্ধতিতে টেবিলের মূল্যবান ফলাফলটি ব্যবহার করতে চান তবে আপনি টেবিলভ্যালুয়েড ফাংশনটি ব্যবহার করা আরও ভাল। ফলাফল যদি কোনও ক্লায়েন্টের জন্য হয় তবে সঞ্চিত সংগ্রহটি আরও ভাল উপায়।


-1

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


এটি একটি বিশাল সংখ্যক উত্তর সহ খুব পুরানো প্রশ্ন, এর মধ্যে অনেকগুলি (স্বীকৃত উত্তর সহ) অত্যন্ত উর্ধ্বমুখী। এই ধরনের থ্রেডের অন্য উত্তর যুক্ত করার আগে আপনার নিজের জিজ্ঞাসা করা উচিত, "এই সমস্ত বিদ্যমান উত্তরের কী এমন অভাব আছে যার জন্য আমাকে আরও একটি লেখার প্রয়োজন?"
এপিসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.