মাইএসকিউএল কাছাকাছি থাকা "টেবিলটি আবার খুলতে পারে না" ত্রুটি


91

আমি বর্তমানে বিভিন্ন ধরণের ফিল্টার বাস্তবায়নে ব্যস্ত রয়েছি যার জন্য প্রতি "ট্যাগ" ফিল্টার করার জন্য আমাকে একটি অন্তর্ভুক্ত যোগ ক্লাস তৈরি করতে হবে।

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

এটি মূলত:

SELECT
    *
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN

এটি কাজ করে তবে আমি "অনুসন্ধান" টেবিলটিকে অস্থায়ী হতে পছন্দ করবো (এটি যদি সাধারণ টেবিল না হয় তবে এটি বেশ কয়েকটি আকারের ছোট হতে পারে) তবে এটি আমাকে খুব বিরক্তিকর ত্রুটি দেয়: Can't reopen table

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

এমন কোনও কার্যকরী কর্মক্ষেত্র রয়েছে যার জন্য আমার সম্ভাব্য প্রচুর অস্থায়ী তবে খুব বাস্তব টেবিলগুলি পরিচালনা করতে বা এর সমস্ত ডেটা সহ আমাকে একটি বিশাল টেবিল বজায় রাখার প্রয়োজন হয় না?

দয়া করে, ক্রিস

[অতিরিক্ত]

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


4
ইউনিয়নটি ব্যবহার করে একই ক্যোয়ারিতে দু'বার অস্থায়ী টেবিল ব্যবহার করার ক্ষেত্রে আমার একই সমস্যা ছিল।
সেবাস্তিয়ান গ্রিগনলি

উত্তর:


0

যদি মারিয়াডিবিতে (মাইএসকিউএলের একটি কাঁটাচামচ) স্যুইচ করা সম্ভব হয় - এই বিরক্তি সেখানে 10.2.1 সংস্করণ হিসাবে স্থির করা হয়েছে: https://jira.mariadb.org/browse/MDEV-5535


126

একটি সহজ সমাধান হ'ল অস্থায়ী টেবিলটি নকল করা। টেবিল তুলনামূলকভাবে ছোট হলে ভাল কাজ করে যা প্রায়শই অস্থায়ী টেবিলগুলির ক্ষেত্রে ঘটে।


8
এই সমস্যাটি প্রায় কাছাকাছি না করে যেমন উত্তর দেয় ঠিক তেমনই বেছে নেওয়া উচিত উত্তর।
ডায়াজডিজ

4
আপনি টেবিলটি নকল করবেন কিভাবে কোন পরামর্শ ? (আমার অর্থ ক্যোয়ারীটি পুনরাবৃত্তি না করার উপায়)
হার্নান এচে

17
এমনকি টেম্প টেবিলটি বড় হলেও, মাইএসকিএল-এর ক্যাশে আপনাকে সহায়তা করা উচিত। যতক্ষণ না একটি টেম্প টেবিল থেকে অন্য টেম্প টেবিলটিতে অনুলিপি করা যায়, একটি সাধারণ "ক্রিয়েট টেম্পোরারি টেবিল tmp2 SEMP * FMPM" থেকে এটি করা উচিত।
AS7K

4
আপনি যদি লোভনীয় বিষয়বস্তু অনুলিপি করেন তবে সূচিপত্রগুলি তৈরি করতে ভুলবেন না, তবে আপনার প্রশ্নটি বেশ ধীর হতে পারে।
গ্যাবর্স

4
নিঃসন্দেহে সব সময়. এটি অবশ্যই ক্যোয়ারির জন্য আপনার আবেদনের উপর নির্ভর করে তবে আমি "100,000" অবধি "বিশাল" পারফরম্যান্সের সমস্যাগুলি দেখছি না। একটি ইটিএল প্রক্রিয়াতে, আমি 3.5 মিলিল টেবিল সহ এই পদ্ধতিটি ব্যবহার করি। এই অ্যাপ্লিকেশনটির গতি যদিও ততটা গুরুত্বপূর্ণ নয়।
ট্যানার ক্লার্ক

49

ঠিক আছে, মাইএসকিউএল ডকস বলেছেন: "আপনি TEMPORARYএকই ক্যোয়ারিতে একাধিকবার কোনও টেবিলটি উল্লেখ করতে পারবেন না ।"

এখানে একটি বিকল্প ক্যোয়ারী যা একই সারিগুলি খুঁজে পাওয়া উচিত, যদিও সারিগুলির সারণির সমস্ত শর্ত পৃথক কলামে থাকবে না, তারা কমা-বিচ্ছিন্ন তালিকায় থাকবে।

SELECT f1.baseID, GROUP_CONCAT(f1.condition)
FROM search f1
WHERE f1.condition IN (<condition1>, <condition2>, ... <conditionN>)
GROUP BY f1.baseID
HAVING COUNT(*) = <N>;

4
এটি আসলে আমার সমস্যাটি সমাধান করে নি, তবে সমস্যাটি সহজতর করতে এটি আমাকে সক্ষম করেছিল, ফলে লোভনীয়ের প্রয়োজনকে উপেক্ষা করে। ধন্যবাদ!
ক্রিস

6

আমি একটি স্থায়ী "অস্থায়ী" সারণী তৈরি করে এবং একটি অনন্য টেবিলের নাম তৈরি করার জন্য টেবিলের নামটিতে এসপিআইডি (দুঃখিত, আমি এসকিউএল সার্ভারের ভূমি থেকে) সংযুক্ত করে এটি পেয়েছি। তারপরে কোয়েরিগুলি তৈরি করতে গতিশীল এসকিউএল স্টেটমেন্ট তৈরি করুন। খারাপ কিছু ঘটলে, টেবিলটি বাদ দিয়ে পুনরায় তৈরি করা হবে।

আমি আরও ভাল বিকল্পের জন্য আশা করছি কেমন, মাইএসকিউএল ডেভস। 'বাগ' / 'বৈশিষ্ট্য অনুরোধ' ২০০৮ সাল থেকে উন্মুক্ত! দেখে মনে হচ্ছে সমস্ত 'বাগ' একই মুখের নৌকায় রয়েছে।

select concat('ReviewLatency', CONNECTION_ID()) into @tablename;

#Drop "temporary" table if it exists
set @dsql=concat('drop table if exists ', @tablename, ';');
PREPARE QUERY1 FROM @dsql;
EXECUTE QUERY1;
DEALLOCATE PREPARE QUERY1;

#Due to MySQL bug not allowing multiple queries in DSQL, we have to break it up...
#Also due to MySQL bug, you cannot join a temporary table to itself,
#so we create a real table, but append the SPID to it for uniqueness.
set @dsql=concat('
create table ', @tablename, ' (
    `EventUID` int(11) not null,
    `EventTimestamp` datetime not null,
    `HasAudit` bit not null,
    `GroupName` varchar(255) not null,
    `UserID` int(11) not null,
    `EventAuditUID` int(11) null,
    `ReviewerName` varchar(255) null,
    index `tmp_', @tablename, '_EventUID` (`EventUID` asc),
    index `tmp_', @tablename, '_EventAuditUID` (`EventAuditUID` asc),
    index `tmp_', @tablename, '_EventUID_EventTimestamp` (`EventUID`, `EventTimestamp`)
) ENGINE=MEMORY;');
PREPARE QUERY2 FROM @dsql;
EXECUTE QUERY2;
DEALLOCATE PREPARE QUERY2;

#Insert into the "temporary" table
set @dsql=concat('
insert into ', @tablename, ' 
select e.EventUID, e.EventTimestamp, e.HasAudit, gn.GroupName, epi.UserID, eai.EventUID as `EventAuditUID`
    , concat(concat(concat(max(concat('' '', ui.UserPropertyValue)), '' (''), ut.UserName), '')'') as `ReviewerName`
from EventCore e
    inner join EventParticipantInformation epi on e.EventUID = epi.EventUID and epi.TypeClass=''FROM''
    inner join UserGroupRelation ugr on epi.UserID = ugr.UserID and e.EventTimestamp between ugr.EffectiveStartDate and ugr.EffectiveEndDate 
    inner join GroupNames gn on ugr.GroupID = gn.GroupID
    left outer join EventAuditInformation eai on e.EventUID = eai.EventUID
    left outer join UserTable ut on eai.UserID = ut.UserID
    left outer join UserInformation ui on eai.UserID = ui.UserID and ui.UserProperty=-10
    where e.EventTimestamp between @StartDate and @EndDate
        and e.SenderSID = @FirmID
    group by e.EventUID;');
PREPARE QUERY3 FROM @dsql;
EXECUTE QUERY3;
DEALLOCATE PREPARE QUERY3;

#Generate the actual query to return results. 
set @dsql=concat('
select rl1.GroupName as `Group`, coalesce(max(rl1.ReviewerName), '''') as `Reviewer(s)`, count(distinct rl1.EventUID) as `Total Events`
    , (count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) as `Unreviewed Events`
    , round(((count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) / count(distinct rl1.EventUID)) * 100, 1) as `% Unreviewed`
    , date_format(min(rl2.EventTimestamp), ''%W, %b %c %Y %r'') as `Oldest Unreviewed`
    , count(distinct rl3.EventUID) as `<=7 Days Unreviewed`
    , count(distinct rl4.EventUID) as `8-14 Days Unreviewed`
    , count(distinct rl5.EventUID) as `>14 Days Unreviewed`
from ', @tablename, ' rl1
left outer join ', @tablename, ' rl2 on rl1.EventUID = rl2.EventUID and rl2.EventAuditUID is null
left outer join ', @tablename, ' rl3 on rl1.EventUID = rl3.EventUID and rl3.EventAuditUID is null and rl1.EventTimestamp > DATE_SUB(NOW(), INTERVAL 7 DAY) 
left outer join ', @tablename, ' rl4 on rl1.EventUID = rl4.EventUID and rl4.EventAuditUID is null and rl1.EventTimestamp between DATE_SUB(NOW(), INTERVAL 7 DAY) and DATE_SUB(NOW(), INTERVAL 14 DAY)
left outer join ', @tablename, ' rl5 on rl1.EventUID = rl5.EventUID and rl5.EventAuditUID is null and rl1.EventTimestamp < DATE_SUB(NOW(), INTERVAL 14 DAY)
group by rl1.GroupName
order by ((count(distinct rl1.EventUID) - count(distinct rl1.EventAuditUID)) / count(distinct rl1.EventUID)) * 100 desc
;');
PREPARE QUERY4 FROM @dsql;
EXECUTE QUERY4;
DEALLOCATE PREPARE QUERY4;

#Drop "temporary" table
set @dsql = concat('drop table if exists ', @tablename, ';');
PREPARE QUERY5 FROM @dsql;
EXECUTE QUERY5;
DEALLOCATE PREPARE QUERY5;

আশা করি এখন আমাদের কাছে ওরাকল রাজত্বগুলি গ্রহণ করেছে, তিনি মাইএসকিউএলকে একটি ভাল ধাক্কা দিতে পারেন।
পেসারিয়ার

4
দীর্ঘশ্বাস ফেললাম আমি এতে সন্দেহ করি :(
মৌমাছিরা 14

4
একটি দীর্ঘশ্বাস । জুলাই 2016, এবং এই টেম্প টেবিল বাগটি এখনও ঠিক হয়নি। এই সমস্যাটি সমাধানের জন্য আমি সম্ভবত স্থায়ী টেবিলের নাম (আমি ওরাকল ভূমি থেকে এসেছি) দিয়ে একত্রিত কিছু ধরণের ক্রম সংখ্যা নিয়ে আসব up
TheWalkingData

হ্যাট্রিক দীর্ঘশ্বাস ফেলুন ... এটি ইতিমধ্যে এর 2019 হিসাবে দেখা হিসাবে এটি কখনও স্থির করা যায় না।
জিমানো

3

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

তারপরে আপনার মাঝে মাঝে পুরানোগুলি মুছে ফেলার জন্য একটি ক্লিনআপ জব দরকার হয় (মাইএসকিউএল সহজেই টেবিল তৈরি হওয়ার সময় মনে রাখে, যাতে আপনি যখন ক্লিন আপ প্রয়োজন হয় তখন এটি কার্যকর করতে পারেন)


9
অস্থায়ী টেবিলগুলির চূড়ান্ত সুবিধা রয়েছে যে আপনার একসাথে একাধিক প্রশ্ন চলতে পারে। স্থায়ী টেবিল দিয়ে এটি সম্ভব নয়।
পেসারিয়ার 4'15

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

0

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


0

আপনি স্থায়ী টেবিল তৈরি করে এটিকে ঘিরে ফেলতে পারেন, যা পরে আপনি সরিয়ে ফেলবেন, বা একই ডেটা দিয়ে কেবল দুটি পৃথক টেম্প টেবিল তৈরি করুন


-1

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

এই সমস্যাটি সম্পর্কে এখানে MYSQL ডক্স রয়েছে। আমি উপরের উত্তরগুলির মতো নকল অস্থায়ী টেবিলগুলি ব্যবহার করি, তবে, আপনার কোনও পরিস্থিতি থাকতে পারে যেখানে কোনও সিটিই উপযুক্ত!

https://dev.mysql.com/doc/refman/8.0/en/temporary-table-problems.html

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