অস্থায়ী স্মৃতি সারণীটি আর কতক্ষণ অব্যাহত থাকবে যদি আমি এটিকে না ফেলে (মাইএসকিউএল)


13

আমি অস্থায়ী টেবিল তৈরি করতে মাইএসকিউএলে একটি পুনরাবৃত্ত হওয়া সঞ্চিত পদ্ধতি ব্যবহার করছি id_list, তবে আমাকে অবশ্যই সেই পদ্ধতির ফলাফলগুলি একটি ফলোআপ সিলেক্ট ক্যোয়ারিতে ব্যবহার করতে হবে, তাই আমি DROPপ্রক্রিয়াটির মধ্যে অস্থায়ী টেবিলটি পারি না ...

BEGIN;

/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);

/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r 
INNER JOIN usr_accts a ON a.User_ID = r.User_ID 
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) 
GROUP BY r.User_ID;

COMMIT;

প্রক্রিয়াটি কল করার সময়, প্রথম মানটি আমি যে শাখায় চাই তার শীর্ষ আইডি এবং দ্বিতীয়টি tierপদ্ধতিটি পুনরাবৃত্তির সময় ব্যবহার করে। পুনরাবৃত্ত লুপের আগে এটি পরীক্ষা tier = 0করে যে এটি চালিত হয় কি না:

DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;

সুতরাং আমার প্রশ্ন হ'ল: যদি আমি প্রক্রিয়া শেষে বা আমার লেনদেনের মধ্যে DROPঅস্থায়ী MEMORYটেবিলটি না করি, তবে কতক্ষণ সেই টেবিলটি স্মরণে থাকবে? সেশনটি শেষ হয়ে গেলে এটি কী স্বয়ংক্রিয়ভাবে বাদ পড়েছে, বা সংযোগটি খোলা থাকার সাথে সাথে এটি স্মৃতিতে থাকবে?

** এনবি এর সুস্পষ্ট উত্তর হতে পারে প্রতিশ্রুতিবদ্ধ বিবৃতি দেওয়ার আগে টেম্প টেবিলটি ফেলে দেওয়া, তবে একটি মুহুর্তের জন্য ধরে নেওয়া যাক যে আমি এটি করতে পারি না * *


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


আপডেট : মন্তব্যকারীদের পরামর্শের ভিত্তিতে, আমি আমার সঞ্চিত পদ্ধতিটি সামঞ্জস্য করার একটি উপায় খুঁজে পেয়েছি যাতে আমি টেমপ মেমোরি টেবিলটি ব্যবহার করতে পারি, তবে DROPশেষে এটি স্পষ্টভাবে বলতে সক্ষম হব ...

প্রকৃত ক্যোয়ারিতে ফলাফল সংগ্রহের জন্য কেবল সঞ্চিত পদ্ধতিটিতে কল করা এবং অবশিষ্ট টিএমপি টেবিল ব্যবহার না করে, CALLতৃতীয় OUTভেরিয়েবলটি ব্যবহারের জন্য আমি ফর্ম্যাটটি পরিবর্তন করেছি :

CALL fetch_inheritance_groups('abc123','0',@IDS);

... তারপরে সঞ্চিত পদ্ধতির মধ্যে আমি IF tier = 0নিম্নলিখিতটি দিয়ে একেবারে শেষে একটি দ্বিতীয় যুক্ত করেছি :

IF tier = 0
    THEN
    SELECT GROUP_CONCAT(DISTINCT iid SEPARATOR ',') FROM id_list INTO inherited_set;
    DROP TEMPORARY TABLE IF EXISTS id_list;
END IF;

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

WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)

... এখন ...

WHERE r.Group_ID = 'abc123' OR FIND_IN_SET(r.Group_ID,@IDS)

ভাল খবর! আপনার ইনপুট জন্য মন্তব্যকারীদের ধন্যবাদ, এবং আমাকে আরও কঠিন চেষ্টা করার প্রয়োজন কারণটি দেওয়ার জন্য :)

উত্তর:


17

সঞ্চিত পদ্ধতিতে অস্থায়ী টেবিলগুলি সম্পর্কে মজার বিষয়টি টেবিলের ক্ষণস্থায়ী অস্তিত্ব (যা ডিবি সংযোগের সমাপ্তির পরে নেমে আসে) নয়, তবে সঞ্চিত পদ্ধতির সুযোগ।

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

বই অনুসারে

kdsjx

অধ্যায় 5 এর আরও একটি সঞ্চিত পদ্ধতিতে একটি সাব হেডিং রিটার্নিং ফলাফল সেট রয়েছে

এটি পৃষ্ঠা 117 এর 2 অনুচ্ছেদে বলেছেন:

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

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

আমি আশা করি এটি আপনার প্রশ্নের উত্তর দেয়।

আপডেট 2014-01-31 11:26 ইস্ট

আপনার শেষ মন্তব্যে, আপনি বলেছেন

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

হ্যাঁ এবং না, আমি হ্যাঁ বলি কারণ এটি করা এক উপায়। আমি বলি না কারণ এটি করার আরেকটি উপায় হ'ল:

CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;
TRUNCATE TABLE id_list;

আপনি যে কোনও উপায়েই নির্বাচন করুন, ট্র্যাঙ্কেট টেবিলটি ড্রপ করে টেবিলটি পুনরায় তৈরি করার পরে অপারেশনটি এখনও একই। এটি অন্য ডিবি সংযোগগুলিকে ক্ষতি করবে না যেহেতু প্রতিটি সংযোগের নিজস্ব id_list টেবিল রয়েছে।


রোল্যান্ডোর অনেক প্রশংসা! আমি একই প্রশ্নটি এসওতে পোস্ট করেছি ( স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 21483448/… ) যদি এটির দিকে আরও নজর পড়ে, এবং আমি কম তথ্যবহুল হলেও উত্তর পেয়েছি similar আমি একটি ফলো-আপ যাকে জাহির: যদি আমরা স্থায়ী সংযোগ চাকরী, মেমরি টেবিল বহুবিধ অনুরোধ মাধ্যমে জিদ হবে, এবং মনে হয় এটা করবে যাতে কর্মক্ষমতা অনুরোধে জন্য, আমি অভিমানী করছি যে এই পদ্ধতি ব্যবহার করে হবে * দরকার আমাদের স্পষ্টভাবে করার DROPঅস্থায়ী স্মৃতি টেবিল। আমি কি সঠিকভাবে ধরে নিই?
'20

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

" দুর্ভাগ্যক্রমে, একটি সঞ্চিত পদ্ধতি থেকে অন্যটিতে ফলাফল সেট করার একমাত্র উপায় হ'ল ফলস অস্থায়ী টেবিলের মাধ্যমে পাস করা " । এর অর্থ কি এই যে আমরা ফলস্বর সেটটি (কলার থেকে) কেবল তখনই অ্যাক্সেস করতে পারি যখন আমরা অস্থায়ী টেবিলের নামটি জানি যা নামক পদ্ধতিতে তৈরি হয়েছিল? SELECTসঞ্চিত পদ্ধতিতে ( DECLARE aCursor CURSOR FOR SELECT ...) বিবৃতিতে ফলাফলের সেটটি পড়ার জন্য আমরা যেভাবে ব্যবহার করতে পারি তার মতো ফলাফল সেট পড়ার উপায় নয় ? E. g। DECLARE theCursor CURSOR FOR CALL aProcedure()?
মীর-ইসমাইলি

2

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

গুগলে একটি দ্রুত স্ক্যান মনে হচ্ছে এটি মাইএসকিউএল পরিচালিত করে।
( http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm "ডিফল্টরূপে উল্লেখ করে, আপনার ডাটাবেস সংযোগটি বন্ধ হয়ে গেলে সমস্ত অস্থায়ী টেবিলগুলি মাইএসকিউএল দ্বারা মুছে ফেলা হয়")

যদিও এই আচরণগুলি পরিবর্তন করার প্রায়শই উপায় রয়েছে। উদাহরণস্বরূপ, এম এস এসকিউএল সার্ভারে আপনি একটি অস্থায়ী টেবিল তৈরি করতে পারেন যা কেবলমাত্র বর্তমান সংস্থার পরিবর্তে সমস্ত সংযোগের জন্য দৃশ্যমান এটি নাম রেখে ## শুরু করে giving

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


আমি সম্মত হলাম যে স্পষ্টভাবে টেবিলটি ফেলে দেওয়ার জন্য আমার কোনও উপায় খুঁজে পাওয়া উচিত, তবে DROPপ্রাথমিক স্তরের আইএফ এর মধ্যে পুনরায় পুনরুদ্ধার করার পূর্বে আপনি যে সমস্যাটি শেষ করেছেন তা আমি পেয়েছি । আপনার ইনপুট জন্য ধন্যবাদ!
ডিসেম্বর

-2
CREATE TEMPORARY TABLE  IF NOT EXISTS temp (Months VARCHAR(50),Sequence INT)
AS (
SELECT 
CONCAT(MONTHNAME(m1),' ',YEAR(m1)) AS Months,CONVERT(m1,DATE) AS Sequence
FROM
(
SELECT 
('2014-01-01' - INTERVAL DAYOFMONTH('2014-01-01')-1 DAY) 
+INTERVAL m MONTH AS m1
FROM
(
SELECT @rownum:=@rownum+1 AS m FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4,
(SELECT @rownum:=-1) t0
) d1
) d2 
WHERE m1<= '2015-07-30'
ORDER BY m1
) ;

SELECT t.Months,A.OpenCount,A.CloseCount FROM Temp T
 LEFT JOIN ( SELECT  CONCAT(MONTHNAME(e.dtcdate),' ',YEAR(e.dtcdate)) AS Months,
 ( SELECT  COUNT(csr.ddlcsstatus) FROM csrcrn_frmempengagreqs csr 
 JOIN master_detail md ON md.masterDetailId=csr.ddlcsstatus WHERE md.abbr='open' AND csr.dtcdate >='2014-01-01' AND csr.dtcdate <='2015-07-30' AND csr.ddlArea=e.ddlArea ) AS OpenCount
 ,
 ( SELECT  COUNT(csr.ddlcsstatus) FROM csrcrn_frmempengagreqs csr 
 JOIN master_detail md ON md.masterDetailId=csr.ddlcsstatus WHERE md.abbr='Close' AND csr.dtcdate >='2014-01-01' AND csr.dtcdate <='2015-07-30' AND csr.ddlArea=e.ddlArea ) AS CloseCount

 FROM csrcrn_frmempengagreqs e 
 INNER JOIN master_detail m ON e.ddlcsstatus=m.masterDetailId 
  WHERE  e.dtcdate >='2014-01-01' AND e.dtcdate <='2015-07-30' 
 GROUP BY MONTH(e.dtcdate) ORDER BY e.dtcdate 
 ) A ON CONVERT(A.Months,CHAR(20))=CONVERT(T.Months,CHAR(20)) 
       ORDER BY T.Sequence; 
       DROP TEMPORARY TABLE  IF EXISTS temp;

/ * প্রদত্ত কোয়েরি সফলভাবে ফলাফল দিন ... যখন এই কোয়েরিকে ইউএসপিতে রাখুন তখন ত্রুটিটি plz সহায়তা দেখায়..প্রক্রোক নীচে দেওয়া হয়েছে * /

DELIMITER $$

DROP PROCEDURE IF EXISTS `usp_GetEngMonthlyChart_Test`$$

CREATE DEFINER=`root`@`%` PROCEDURE `usp_GetEngMonthlyChart_Test`(IN DateFrom DATE,IN DateTo DATE)
BEGIN
      -- SET @strWhere= CONCAT(' AND CSR.dtcInductionDate BETWEEN ''',CONVERT(DateFrom,DATE),''' AND ','''',CONVERT(DateTo,DATE),''''); 


    SET @strSql=CONCAT(' 

    CREATE TEMPORARY TABLE  IF NOT EXISTS temp (Months VARCHAR(50),Sequence INT)
    AS (
    SELECT 
    CONCAT(MONTHNAME(m1),'' '',YEAR(m1)) AS Months,CONVERT(m1,DATE) AS Sequence
    FROM
    (
    SELECT 
    (''',DateFrom,''' - INTERVAL DAYOFMONTH(''',DateFrom,''')-1 DAY) 
    +INTERVAL m MONTH AS m1
    FROM
    (
    SELECT @rownum:=@rownum+1 AS m FROM
    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
    (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4,
    (SELECT @rownum:=-1) t0
    ) d1
    ) d2 
    WHERE m1<= ''',DateTo,'''
    ORDER BY m1
    )' );   

         SET @strSql=CONCAT(@strSql,'; GO SELECT t.Months,A.OpenCount,A.CloseCount FROM Temp T
     LEFT JOIN ( SELECT  CONCAT(MONTHNAME(e.dtcdate),'' '',YEAR(e.dtcdate)) AS Months,
     ( SELECT  COUNT(csr.ddlcsstatus) FROM csrcrn_frmempengagreqs csr 
     JOIN master_detail md ON md.masterDetailId=csr.ddlcsstatus WHERE md.abbr=''open'' AND csr.dtcdate >=''',DateFrom,
     ''' AND csr.dtcdate <=''',DateTo,''' AND csr.ddlArea=e.ddlArea ) AS OpenCount
     ,
     ( SELECT  COUNT(csr.ddlcsstatus) FROM csrcrn_frmempengagreqs csr 
     JOIN master_detail md ON md.masterDetailId=csr.ddlcsstatus WHERE md.abbr=''Close'' AND csr.dtcdate >=''',DateFrom,
     ''' AND csr.dtcdate <=''',DateTo,''' AND csr.ddlArea=e.ddlArea ) AS CloseCount

     FROM csrcrn_frmempengagreqs e 
     INNER JOIN master_detail m ON e.ddlcsstatus=m.masterDetailId 
      WHERE  e.dtcdate >=''',DateFrom,''' AND e.dtcdate <=''',DateTo,''' 
     GROUP BY MONTH(e.dtcdate) ORDER BY e.dtcdate 
     ) A ON CONVERT(A.Months,CHAR(20))=CONVERT(T.Months,CHAR(20)) 
           ORDER BY T.Sequence; 
           DROP TEMPORARY TABLE  IF EXISTS temp;'); 

    SELECT @strSql;
    PREPARE stmt FROM @strSql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END$$

DELIMITER ;

কল করুন usp_GetEngMonthlyChart_Test ('2014-01-01', '2015-07-30')


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