এসকিউএল পুনরাবৃত্তি আসলে কীভাবে কাজ করে?


19

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

নিম্নলিখিত সহজ উদাহরণ বিবেচনা করুন:

CREATE TABLE #NUMS
(N BIGINT);

INSERT INTO #NUMS
VALUES (3), (5), (7);

WITH R AS
(
    SELECT N FROM #NUMS
    UNION ALL
    SELECT N*N AS N FROM R WHERE N*N < 10000000
)
SELECT N FROM R ORDER BY N;

এর মাধ্যমে চলুন।

প্রথমত, অ্যাঙ্কর সদস্য কার্যকর করে এবং ফলাফল সেটটি আরয়ে দেওয়া হয় R সুতরাং আর আরম্ভ করা হয় is 3, 5, 7}}

তারপরে, মৃত্যুদণ্ডটি ইউনিয়ন সমস্তের নীচে নেমে আসে এবং পুনরাবৃত্তকারী সদস্যকে প্রথমবারের জন্য মৃত্যুদন্ড কার্যকর করা হয়। এটি আর এর উপর নির্বাহ করে (এটি বর্তমানে আমাদের হাতে যে আর রয়েছে: {3, 5, 7।)। এটির ফলাফল {9, 25, 49}}

এটি এই নতুন ফলাফলটি দিয়ে কী করে? এটি বিদ্যমান {3, 5, 7} এর সাথে 9, 25, 49 {যুক্ত করে, ফলাফল ইউনিয়ন আর লেবেল করে এবং সেখান থেকে পুনরাবৃত্তি চালিয়ে যায়? বা এটি কি এই নতুন ফলাফলটিকে 9 25, 25, 49 only হিসাবে পুনরায় সংজ্ঞায়িত করে এবং পরে সমস্ত ইউনিয়ন-ইঙ্গিত করবে?

কোনটিই পছন্দ করে না।

আর যদি এখন {3, 5, 7, 9, 25, 49} হয় এবং আমরা পুনরাবৃত্তির পরবর্তী পুনরাবৃত্তিটি সম্পাদন করি তবে আমরা 9 ​​25, 25, 49, 81, 625, 2401 with দিয়ে শেষ করব এবং আমাদের আছে lost 3, 5, 7 lost হারিয়েছে}

আর যদি এখন কেবল {9, 25, 49। হয় তবে আমাদের একটি বিভ্রান্তিকর সমস্যা রয়েছে। আর অ্যাঙ্কর সদস্য রেজাল্ট সেট এবং পরবর্তী সমস্ত পুনরাবৃত্ত সদস্য ফলাফল সেটগুলির ইউনিয়ন বলে বোঝা যায়। যদিও 25 9, 25, 49} শুধুমাত্র আর এর একটি উপাদান It এটি এখন পর্যন্ত আমরা যে পরিমাণ অর্থ সংগ্রহ করেছি এটি সম্পূর্ণ আর নয়। অতএব, আর থেকে নির্বাচন হিসাবে পুনরাবৃত্ত সদস্য লিখতে কোন মানে হয় না।


আমি অবশ্যই @ ম্যাক্স ভার্নন এবং @ মিশেল এস এর নীচে বিস্তারিত কী বলেছি তা প্রশংসা করি। যথা, যে (1) সমস্ত উপাদানগুলি পুনরাবৃত্তি সীমা বা নাল সেট পর্যন্ত তৈরি হয় এবং তারপরে (2) সমস্ত উপাদান একত্রিত হয়। এইভাবে আমি বুঝতে পারি যে এসকিউএল পুনরাবৃত্তি আসলে কাজ করে।

যদি আমরা এসকিউএলটিকে নতুনভাবে ডিজাইন করছিলাম তবে সম্ভবত আমরা আরও পরিষ্কার এবং স্পষ্টত বাক্য গঠন প্রয়োগ করব, এরকম কিছু:

WITH R AS
(
    SELECT   N
    INTO     R[0]
    FROM     #NUMS
    UNION ALL
    SELECT   N*N AS N
    INTO     R[K+1]
    FROM     R[K]
    WHERE    N*N < 10000000
)
SELECT N FROM R ORDER BY N;

গণিতে একটি সূক্ষ্ম প্রমাণের মতো বাছাই করুন।

এসকিউএল পুনরাবৃত্তি হিসাবে এটি বর্তমানে দাঁড়িয়ে সমস্যাটি হ'ল এটি একটি বিভ্রান্তিকর উপায়ে লেখা। এটি যেভাবে লেখা হয়েছে তাতে বলা হয়েছে যে প্রতিটি উপাদান আর থেকে নির্বাচন করে গঠিত হয়েছে, তবে এর অর্থ এই নয় যে এখনও পর্যন্ত সম্পূর্ণ আর তৈরি করা হয়েছে (বা প্রদর্শিত হয়েছে)। এটি কেবল পূর্ববর্তী উপাদানটি বোঝায়।


"যদি আর এখন {3, 5, 7, 9, 25, 49} হয় এবং আমরা পুনরাবৃত্তির পরবর্তী পুনরুক্তিটি সম্পাদন করি তবে আমরা 9 ​​{, 25, 49, 81, 625, 2401} দিয়ে শেষ করব এবং আমরা ' {3, 5, 7 lost হারিয়েছে "" এটি যদি কাজ করে তবে আপনি কীভাবে {3,5,7 lose হারাবেন তা আমি দেখতে পাচ্ছি না।
ypercubeᵀᴹ

@ ইপার-পাগলাহাট-কিউবিᵀᴹ - আমি প্রস্তাবিত প্রথম অনুমান থেকে অনুসরণ করে চলেছি, যথা, মধ্যবর্তী আর যদি সেই বিন্দু পর্যন্ত গণনা করা হয় এমন সমস্ত কিছুর সঞ্চার হয়? তারপরে, পুনরাবৃত্ত সদস্যের পরবর্তী পুনরাবৃত্তিতে, আর এর প্রতিটি উপাদান বর্গক্ষেত্র হয়। সুতরাং, {3, 5, 7 {9, 25, 49 {হয়ে যায় এবং আর আর কখনও আমাদের আর {3, 5, 7 have পাওয়া যায় না other অন্য কথায়, আর থেকে {3, 5, 7
lost

উত্তর:


26

রিকার্সিভ সিটিইগুলির বিওএল বর্ণনায় রিকার্সিভ এক্সিকিউশন এর শব্দার্থকে বর্ণনা করা হয়েছে:

  1. সিটিই এক্সপ্রেশনটি অ্যাঙ্কর এবং পুনরাবৃত্ত সদস্যদের মধ্যে বিভক্ত করুন।
  2. প্রথম আমন্ত্রণ বা বেস ফলাফল সেট (টি0) তৈরি করে অ্যাঙ্কর সদস্য (গুলি) চালান।
  3. ইনপুট হিসাবে টিআই এবং আউটপুট হিসাবে টি + 1 সহ পুনরাবৃত্তকারী সদস্য (গুলি) চালান।
  4. একটি খালি সেট ফিরে না আসা পর্যন্ত পদক্ষেপ 3 পুনরাবৃত্তি করুন।
  5. ফলাফল সেট ফিরে। এটি TN থেকে Tn এর সমস্ত ইউনিয়ন।

সুতরাং প্রতিটি স্তরের উপরের স্তরটি কেবল ইনপুট হিসাবে সম্পূর্ণ ফলাফল সেটটি এখনও পর্যন্ত জমে না has

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

আপনি যদি ORDER BYআপনার ক্যোয়ারী থেকে অপসারণ করেন তবে ফলাফলগুলি নিম্নরূপে অর্ডার করা হয়েছে

+---------+
|    N    |
+---------+
|       3 |
|       5 |
|       7 |
|      49 |
|    2401 |
| 5764801 |
|      25 |
|     625 |
|  390625 |
|       9 |
|      81 |
|    6561 |
+---------+

এটি কারণ কার্যকর করা পরিকল্পনা নীচের সাথে খুব একইভাবে কাজ করে very C#

using System;
using System.Collections.Generic;
using System.Diagnostics;

public class Program
{
    private static readonly Stack<dynamic> StackSpool = new Stack<dynamic>();

    private static void Main(string[] args)
    {
        //temp table #NUMS
        var nums = new[] { 3, 5, 7 };

        //Anchor member
        foreach (var number in nums)
            AddToStackSpoolAndEmit(number, 0);

        //Recursive part
        ProcessStackSpool();

        Console.WriteLine("Finished");
        Console.ReadLine();
    }

    private static void AddToStackSpoolAndEmit(long number, int recursionLevel)
    {
        StackSpool.Push(new { N = number, RecursionLevel = recursionLevel });
        Console.WriteLine(number);
    }

    private static void ProcessStackSpool()
    {
        //recursion base case
        if (StackSpool.Count == 0)
            return;

        var row = StackSpool.Pop();

        int thisLevel = row.RecursionLevel + 1;
        long thisN = row.N * row.N;

        Debug.Assert(thisLevel <= 100, "max recursion level exceeded");

        if (thisN < 10000000)
            AddToStackSpoolAndEmit(thisN, thisLevel);

        ProcessStackSpool();
    }
}

এনবি 1: উপরে হিসাবে অ্যাঙ্কর সদস্যের প্রথম সন্তানের সাথে 3তার ভাইবোনদের সমস্ত তথ্য প্রক্রিয়া করা হচ্ছে, 5এবং 7, এবং তাদের বংশধররা ইতিমধ্যে স্পুল থেকে ফেলে দেওয়া হয়েছে এবং এটি আর অ্যাক্সেসযোগ্য নয়।

এনবি 2: উপরের সি # তে এক্সিকিউশন প্ল্যানের সমান সামগ্রিক শব্দার্থক রয়েছে তবে এক্সিকিউশন প্ল্যানে প্রবাহটি অভিন্ন নয়, কারণ সেখানে অপারেটররা পাইপলাইনযুক্ত এক্সট্রেশন ফ্যাশনে কাজ করে। পদ্ধতির সংক্ষিপ্তসার প্রদর্শন করার জন্য এটি একটি সরল উদাহরণ। পরিকল্পনা নিজেই আরও বিশদ জন্য আগের লিঙ্কগুলি দেখুন।

এনবি 3: স্ট্যাক স্পুলটি স্পষ্টতই পুনরাবৃত্তির স্তরের মূল কলাম সহ অনন্য অবিচ্ছিন্ন ক্লাস্টারড সূচক হিসাবে প্রয়োগ করা হয়েছে এবং প্রয়োজনীয় হিসাবে ইউনিকফায়ার যুক্ত করা হয়েছে ( উত্স )


6
এসকিউএল সার্ভারে পুনরাবৃত্ত অনুসন্ধানগুলি পার্সিংয়ের সময় সর্বদা পুনরাবৃত্তি থেকে পুনরাবৃত্তিতে (স্ট্যাকিং সহ) রূপান্তরিত হয়। পুনরাবৃত্তির জন্য প্রয়োগের নিয়মটি হ'ল IterateToDepthFirst- Iterate(seed,rcsv)->PhysIterate(seed,rcsv)। শুধু এফওয়াইআই। দুর্দান্ত উত্তর।
পল হোয়াইট GoFundMonica বলেছেন

ঘটনাচক্রে, ইউনিয়নকে সমস্ত ইউনিয়নের পরিবর্তে অনুমোদিত হয় তবে এসকিউএল সার্ভার এটি করবে না।
জোশুয়া

5

এটি কেবলমাত্র একটি (আধা) শিক্ষিত অনুমান, এবং সম্ভবত সম্পূর্ণ ভুল। আকর্ষণীয় প্রশ্ন, যাইহোক।

টি-এসকিউএল একটি ঘোষিত ভাষা; সম্ভবত একটি পুনরাবৃত্ত সিটিই একটি কার্সর-স্টাইল অপারেশনে অনুবাদ করা হয়েছে যেখানে ইউনিয়ন সমস্তের বাম দিক থেকে প্রাপ্ত ফলাফলগুলি একটি অস্থায়ী টেবিলের সাথে যুক্ত হয়, তারপরে ইউনিয়ন সবের ডান দিকটি বাম পাশের মানগুলিতে প্রয়োগ করা হয়।

সুতরাং, আমরা প্রথমে ইউনিয়ন ALL এর বাম পাশের আউটপুটটি ফলাফল সেটে সন্নিবেশ করান, তারপরে আমরা ইউনিয়ন ALL এর ডান পাশের ফলাফলগুলি বাম দিকে প্রয়োগ করি এবং ফলাফল সেটটিতে সন্নিবেশ করি। এর পরে বাম দিকটি ডান দিক থেকে আউটপুট দিয়ে প্রতিস্থাপন করা হবে এবং ডান দিকটি আবার "নতুন" বাম দিকে প্রয়োগ করা হবে। এটার মতো কিছু:

  1. {3,5,7> -> ফলাফল সেট
  2. পুনরাবৃত্ত বিবৃতিগুলি {3,5,7 to এর উপরে প্রয়োগ হয়, যা {9,25,49}} Set 9,25,49 result ফলাফলের সেটটিতে যুক্ত করা হয়েছে, এবং ইউনিয়ন সমস্তের বাম দিকটি প্রতিস্থাপন করে।
  3. পুনরাবৃত্ত বিবৃতি {9,25,49} এ প্রয়োগ হয়, যা {81,625,2401}} Set 81,625,2401 result ফলাফল সেটে যুক্ত করা হয় এবং ইউনিয়ন সমস্তের বাম দিকটি প্রতিস্থাপন করে।
  4. পুনরাবৃত্ত বিবৃতি applied 81,625,2401 to এ প্রয়োগ হয়, যা 61 6561,390625,5764801}} Set 6561,390625,5764801 result ফলাফল সেটটিতে যুক্ত করা হয়েছে।
  5. কার্সার সম্পূর্ণ হয়েছে, যেহেতু পরবর্তী পুনরাবৃত্তির ফলাফল যেখানে পুরো দণ্ডটি মিথ্যা প্রত্যাবর্তন করবে।

পুনরাবৃত্ত সিটিইর জন্য কার্যকরকরণ পরিকল্পনায় আপনি এই আচরণটি দেখতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এটি উপরের 1 ধাপ, যেখানে ইউনিয়ন ALL এর বাম দিকটি আউটপুটে যুক্ত হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এটি ইউনিয়ন ALL এর ডান দিক যেখানে আউটপুট ফলাফলের ফলাফলকে সংযুক্ত করে:

এখানে চিত্র বর্ণনা লিখুন


4

SQL সার্ভার ডকুমেন্টেশন , যা উল্লেখ টি আমি এবং টি আমি +1 , তন্ন তন্ন খুব বোধগম্য, না প্রকৃত বাস্তবায়ন সঠিক বর্ণনা।

মূল ধারণাটি হ'ল ক্যোয়ারির পুনরাবৃত্তিমূলক অংশটি সমস্ত পূর্ববর্তী ফলাফলগুলিতে দেখে তবে কেবল একবার

অন্যান্য ডাটাবেসগুলি কীভাবে এটি বাস্তবায়িত করে ( একই ফলাফল পেতে ) তা দেখতে সহায়ক হতে পারে । Postgres ডকুমেন্টেশন বলেছেন:

পুনরাবৃত্তি অনুসন্ধান মূল্যায়ন

  1. পুনরাবৃত্তিযোগ্য শব্দটির মূল্যায়ন করুন। জন্য UNION(কিন্তু UNION ALL), ডুপ্লিকেট সারি বাতিল। পুনরাবৃত্তির ক্যোয়ারির ফলাফলের বাকী সমস্ত সারি অন্তর্ভুক্ত করুন এবং এগুলি একটি অস্থায়ী কার্যকরী টেবিলে রাখুন
  2. কাজের সারণী খালি না হওয়া পর্যন্ত এই পদক্ষেপগুলি পুনরাবৃত্তি করুন:
    1. পুনরাবৃত্তির স্ব-রেফারেন্সের জন্য ওয়ার্কিং টেবিলের বর্তমান বিষয়বস্তুকে প্রতিস্থাপন করে পুনরাবৃত্তির পদটি মূল্যায়ন করুন। জন্য UNION(কিন্তু UNION ALL), বাতিল ডুপ্লিকেট সারি এবং সারি যে কোনো পূর্ববর্তী ফলাফলের সারি প্রতিলিপি। পুনরাবৃত্তির ক্যোয়ারির ফলাফলের মধ্যে অবশিষ্ট সমস্ত সারি অন্তর্ভুক্ত করুন এবং এগুলি একটি অস্থায়ী মধ্যবর্তী টেবিলের মধ্যে রাখুন
    2. মধ্যবর্তী টেবিলের বিষয়বস্তু সহ ওয়ার্কিং টেবিলের সামগ্রীগুলি প্রতিস্থাপন করুন, তারপরে মধ্যবর্তী টেবিলটি খালি করুন।

দ্রষ্টব্য
দৃrict়ভাবে বলতে গেলে, এই প্রক্রিয়াটি পুনরাবৃত্তি নয়, তবে RECURSIVEএসকিউএল স্ট্যান্ডার্ড কমিটি দ্বারা নির্বাচিত পরিভাষা the

SQLite ডকুমেন্টেশন একটি কিছুটা ভিন্ন বাস্তবায়ন এ ইঙ্গিত, এবং এই এক সারি-এ-এ-সময় এলগরিদম সবচেয়ে সহজ পদ্ধিতি হল বুঝতে হতে পারে:

রিকার্সিভ টেবিলের সামগ্রী গণনা করার জন্য বেসিক অ্যালগরিদমটি নিম্নরূপ:

  1. চালান initial-selectএবং ফলাফলকে একটি কাতারে যুক্ত করুন।
  2. সারিটি খালি নেই:
    1. সারি থেকে একক সারি বের করুন।
    2. পুনরাবৃত্ত সারণীতে সেই একক সারি .োকান
    3. ভান করুন যে সন্ধান করা একক সারিটি কেবল পুনরাবৃত্তিযোগ্য সারণীর একমাত্র সারি এবং রানটি চালান recursive-select, সারিতে সমস্ত ফলাফল যুক্ত করে।

উপরের মূল পদ্ধতিটি নিম্নলিখিত অতিরিক্ত বিধি দ্বারা সংশোধন করা যেতে পারে:

  • যদি কোনও ইউনিয়ন অপারেটর এইটির initial-selectসাথে সংযোগ স্থাপন করে recursive-select, তবে সারিটিতে সারি যুক্ত করুন যদি কোনও সারি আগে সারি যুক্ত করা না হয়। পুনরাবৃত্তির পদক্ষেপের দ্বারা পুনরাবৃত্ত সারিগুলি ইতিমধ্যে সারিবদ্ধ থেকে নিষ্ক্রিয় করা হয়ে থাকলেও পুনরায় সারিগুলি সারিতে যুক্ত করার আগে বাতিল করা হয়। অপারেটরটি ইউনিয়ন সমস্ত হয়, তবে উভয় initial-selectএবং এর দ্বারা উত্পন্ন সমস্ত সারিগুলি recursive-selectপুনরাবৃত্তি করা সত্ত্বেও সর্বদা কাতারে যুক্ত হবে।
    [...]

0

আমার জ্ঞানটি বিশেষত DB2 এ রয়েছে তবে ব্যাখ্যা ডায়াগ্রামগুলি দেখে মনে হচ্ছে এসকিউএল সার্ভারের সাথে একই রকম রয়েছে।

পরিকল্পনাটি এখান থেকে আসে:

পরিকল্পনাটি আটকে দিন

এসকিউএল সার্ভার ব্যাখ্যা পরিকল্পনা

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

অপ্টিমাইজার কেবল প্রাক-সংজ্ঞায়িত ক্রিয়াকলাপটি করার পরামর্শ হিসাবে গ্রহণ করে।

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