লম্বা কীটির জন্য ওরাকল কোনও অনন্য সূচক ব্যবহার করছে না


16

আমার পরীক্ষার ডাটাবেসে আমার 250K সারি সহ একটি টেবিল রয়েছে। (উত্পাদন কয়েকশ মিলিয়ন আছে, আমরা সেখানে একই সমস্যাটি পর্যবেক্ষণ করতে পারি।) টেবিলটির একটি এনভারচার 2 (50) স্ট্রিং আইডেন্টিফায়ার রয়েছে, নাল নয়, এতে অনন্য সূচক রয়েছে (এটি পিকে নয়)।

সনাক্তকারীরা প্রথম অংশ নিয়ে গঠিত যা আমার পরীক্ষার ডাটাবেসে 8 টি আলাদা মান রয়েছে (এবং প্রায় এক হাজার উত্পাদনে), তারপরে একটি @ চিহ্ন এবং শেষ পর্যন্ত একটি সংখ্যা, 1 থেকে 6 ডিজিট দীর্ঘ। উদাহরণস্বরূপ, 50,000 সারি হতে পারে যা 'ABCD_BGX1741F_2006_13_20110808.xML @' দিয়ে শুরু হয় এবং এর পরে 50 হাজার বিভিন্ন সংখ্যা রয়েছে।

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

পরীক্ষা হিসাবে, আমি একই ডিডিএল এবং সঠিক একই সামগ্রী সহ টেবিলটি একই ধরণের (একই স্কিমা + টেবিলস্পেসে) নকল করেছিলাম। আমি ভাল পরিমাপের জন্য প্রথম টেবিলটিতে অনন্য সূচকটি পুনরায় তৈরি করেছি এবং ক্লোন টেবিলের উপর ঠিক একই সূচকটি তৈরি করেছি। আমি ক DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);। এমনকি আপনি দেখতে পারেন যে সূচকের নামগুলি পরপর রয়েছে। সুতরাং এখন দুটি টেবিলের মধ্যে একমাত্র পার্থক্যটি হ'ল প্রথমটি দীর্ঘ সময় ধরে এলোমেলোভাবে ক্রমযুক্ত লোড করা হয়েছিল, ডিস্কে ছড়িয়ে ছিটিয়ে থাকা ব্লকগুলি (একাধিক বড় টেবিলের সাথে একটি টেবিল স্পেসে) দ্বিতীয়টি একটি ব্যাচড হিসাবে লোড করা হয়েছিল ঢোকান-নির্বাচন করুন। তা ছাড়া আমি কোনও পার্থক্য কল্পনা করতে পারি না। (সর্বশেষ বড় মোছার পরে মূল টেবিলটি সঙ্কুচিত করা হয়েছে, এবং এর পরে একটিও মুছে ফেলা হয়নি))

এখানে অসুস্থ এবং ক্লোন টেবিলের জন্য ক্যোয়ারী পরিকল্পনা রয়েছে (কালো ব্রাশের নীচে স্ট্রিংগুলি পুরো ছবিতে একই এবং তারা ধূসর ব্রাশের নীচেও রয়েছে)):

ক্যোয়ারী পরিকল্পনা

(এই উদাহরণে, 1867 সারি রয়েছে যা সনাক্তকারী দিয়ে শুরু করা হয় যা কালো রঙের ব্রাশযুক্ত 2 কাকতালীয় ঘটনা, ওরাকল শনাক্তকারীদের শেষের বিষয়ে চিন্তা করে না বলে মনে হয়))

এই আচরণের কারণ কী হতে পারে? স্পষ্টতই উত্পাদনে টেবিলটি পুনরায় তৈরি করা বেশ ব্যয়বহুল হবে।

USER_TABLES: http://i.stack.imgur.com/nDWze.jpg USER_INDEXES: http://i.stack.imgur.com/DG9um.jpg আমি কেবল স্কিমা এবং টেবিলস্পেসের নাম পরিবর্তন করেছি। আপনি দেখতে পাচ্ছেন যে টেবিল এবং সূচীর নামগুলি ক্যোয়ারী প্ল্যানের স্ক্রিনশটের মতো।

উত্তর:


7

(এটি কেন হিস্টোগ্রামগুলি পৃথক সে সম্পর্কে অন্য প্রশ্নের উত্তর দেয় ))

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

পারফরম্যান্স টিউনিং গাইড অনুসারে :

আপনি যখন কোনও টেবিলটি ফেলে দেন, তখন স্বয়ংক্রিয়-হিস্টোগ্রাম সংগ্রহের বৈশিষ্ট্য এবং পুনরুদ্ধার _ * _ STATS পদ্ধতি দ্বারা ব্যবহৃত পরিসংখ্যানের ইতিহাস ব্যবহার করা কাজের চাপের তথ্য হারিয়ে যায় lost এই ডেটা ছাড়া এই বৈশিষ্ট্যগুলি সঠিকভাবে কাজ করে না।

উদাহরণস্বরূপ, এখানে স্কিউড ডেটা সহ একটি টেবিল রয়েছে তবে কোনও হিস্টোগ্রাম নেই:

drop table test1;
create table test1(a date);
insert into test1 select date '2000-01-01'+level from dual connect by level <= 10;
insert into test1 select date '2000-01-01' from dual connect by level <= 1000;
begin
    dbms_stats.gather_table_stats(user, 'TEST1');
end;
/
select histogram from user_tab_columns where table_name = 'TEST1';

HISTOGRAM
---------
NONE

একই জিনিসটি চালানো, তবে পরিসংখ্যান সংগ্রহ করার আগে একটি প্রশ্নের সাথে একটি হিস্টোগ্রাম তৈরি করবে।

drop table test1;
create table test1(a date);
insert into test1 select date '2000-01-01'+level from dual connect by level <= 10;
insert into test1 select date '2000-01-01' from dual connect by level <= 1000;
select count(*) from test1 where a = sysdate; --Only new line
begin
    dbms_stats.gather_table_stats(user, 'TEST1');
end;
/
select histogram from user_tab_columns where table_name = 'TEST1';

HISTOGRAM
---------
FREQUENCY

2
উজ্জ্বল সহজ উদাহরণ। আপনার কি ধারণা আছে যে সিবিও কেবল 1 ধরে না দিয়ে অনন্য স্ক্যানের কার্ডিনালিটির অনুমানের জন্য হিস্টোগ্রামগুলি ব্যবহার করছিল?
জ্যাক বলছেন topanswers.xyz

ধন্যবাদ! আমি আমার ব্লগে আমার ধরণের ডেটা এবং প্রশ্নের সাথে একটি সম্পূর্ণ তিরস্কার
ফেব্রুজোক

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

@fejesjoco আমি মনে করি জেএল এর ব্যাখ্যা আরও সম্ভবত, কারণ হিস্টোগ্রামগুলিও একক দৃষ্টিকোণ (ছাড়া in) সাধারণ পরিসংখ্যানকে তিরস্কার করেছিল , তাই না? আমি মনে করি সিবিও কার্ডিনালিটি 1 ধারণাটি তৈরি করে তবে কেবল খুব সাধারণ ক্ষেত্রে। আমি ধরে নিয়েছি আপনি একটি বড় ব্যবহার করে পুরো জিনিসটি UNION ALLনিয়ে কাজ করতে পারেন তবে এটি না করার অন্যান্য কারণও থাকতে পারে এবং জেএল লিঙ্কযুক্ত ব্লগ পোস্টে অন্যান্য সম্ভাব্য কাজের ক্ষেত্রের উল্লেখ করে।
জ্যাক বলছেন টপান্সওয়ার্স.অক্সিজ

1
অন্য একটি ছোট রহস্য বিবেচনা করতে হবে - এই হিস্টোগ্রামটি প্রথম স্থানে কীভাবে তৈরি হয়েছিল? ওরাকল কেবলমাত্র একটি কলামকেই ডুপ্লিকেট থাকলে স্কিউ বলে মনে করবে, যা সম্ভবত আপনার অনন্য কলামে থাকতে পারে না। কেউ ইচ্ছাকৃতভাবে এই হিস্টগ্রাম তৈরি করেছেন (অসম্ভব), বা কেউ প্রস্তাবিত নয় এমন সাথে স্ট্যাটাস সংগ্রহ করেছেন method_opt=>'for all indexed columns'?
জন হেলার

8

আমি সমাধান খুঁজে পেয়েছি! এটি খুব সুন্দর এবং আমি ওরাকল সম্পর্কে আসলে অনেক কিছু শিখেছি।

এক কথায়: হিস্টোগ্রাম।

ওরাকলের সিবিও কীভাবে কাজ করে সে সম্পর্কে আমি প্রচুর পড়া শুরু করেছিলাম এবং আমি হিস্টোগ্রামগুলিতে হোঁচট খেয়েছি। আমি সম্পূর্ণরূপে বুঝতে পারি নি তাই আমি USER_HISTOGRAMS টেবিলটি দেখেছি এবং ভয়েলিও á অসুস্থ টেবিলের জন্য বেশ কয়েকটি সারি ছিল এবং ক্লোনযুক্ত টেবিলের জন্য ব্যবহারিকভাবে কিছুই ছিল না। অসুস্থ টেবিলের জন্য, 8 টি পৃথক সনাক্তকারী-শুরুর অংশগুলির প্রত্যেকের জন্য একটি সারি ছিল। এবং এটিই মূল কী: @ চিহ্নটির আগে এগুলি 32 টি অক্ষরে কেটে দেওয়া হয়েছিল। যেমনটি আমি বলেছি, কীগুলির প্রথম অংশটি অত্যন্ত পুনরাবৃত্তিযোগ্য, তারা @ চিহ্নের পরে আলাদা হয়ে যায়।

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

আমি পুরানো টেবিলের সেই কলামটির জন্য হিস্টোগ্রামগুলি মুছলাম এবং সমস্যাটি চলে গেল!

আরও পঠন: https://blogs.oracle.com/optimizer/entry/how_do_i_DP_an_existing_Histogram_on_a_column_and_stop_t__uto_stats_gathering_job_from_creating


2
আমি আমাদের চ্যাট রুমে উল্লেখ করেছি :) chat.stackex
بدل.

আমি দেখিনি :)। সুতরাং একমাত্র অদ্ভুত বিষয় হ'ল কেন প্রথম টেবিলে হিস্টোগ্রামগুলি ছিল এবং ক্লোনটিতে নয়, আমি ভেবেছিলাম জড়ো_সেমিমা_স্ট্যাটগুলি সমস্ত কিছু আপডেট করেছে, আপাতদৃষ্টিতে নয়।
ফেজেসোকো

6

আমি এই বিষয়ে জোনাথন লুইসকে ইমেল করেছি এবং একটি খুব সহায়ক উত্তর পেয়েছি:

গণনাটির বিজোড়তা চরিত্র-ভিত্তিক হিস্টোগ্রামের সীমাবদ্ধতার ফলাফল, বিশেষত দেখুন:

http://jonathanlewis.wordpress.com/2010/10/13/frequency-histogram-5/ http://jonathanlewis.wordpress.com/2010/10/19/fre वारंवार- histograms-6/

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

তিনি যে ব্লগ পোস্টগুলি লিঙ্ক করেছেন সেগুলি পড়ার জন্য আমি উচ্চ প্রস্তাব দিয়েছি, তারা হিস্টোগ্রামগুলির সীমাবদ্ধতার বিশদটি বর্ণনা করে, যেমন:

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


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

হিস্টোগ্রামগুলি ডিবিএগুলির মধ্যে বেশ সুপরিচিত;) আমি আপনাকে এই সত্যটি পছন্দ করি যে আপনি গভীর জিনিস শিখতে আগ্রহী বলে মনে করছেন এবং জেএল এর বইটি আপনার পড়া উচিত বলে মনে হয় এটি খুব ভাল। সিবিও সাধারণত একটি দুর্দান্ত কাজ করে: সর্বদা প্রান্তের মামলাগুলি হবে যাগুলির তদন্ত প্রয়োজন তবে এটি মনে রাখা উচিত যে কাট কাটা ছাড়াই, অনুমানগুলি সর্বদা কেবলমাত্র অনুমান হয়।
জ্যাক বলছেন টপান্সওয়ার্স.অক্সিজ

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

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

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