পোস্টগ্রিসএসকিউএল সূচি ক্যাচিং


16

পোস্টগ্র্রেএসকিউএল-এ কীভাবে সূচীগুলি ক্যাশে করা হয় তার ব্যাখ্যা 'লেআর' খুঁজে পেতে আমার অসুবিধা হচ্ছে, সুতরাং আমি এই কোনও বা সমস্ত অনুমানের একটি বাস্তবতা যাচাই করতে চাই:

  1. সারিগুলির মতো পোস্টগ্র্রেএসকিউএল সূচকগুলি ডিস্কে লাইভ থাকে তবে ক্যাশে হতে পারে।
  2. একটি সূচক সম্পূর্ণরূপে ক্যাশে বা নাও হতে পারে।
  3. এটি ক্যাশে করা হয়েছে কিনা তা নির্ভর করে যে এটি প্রায়শই ব্যবহৃত হয় (ক্যোয়ার পরিকল্পনাকারীর দ্বারা নির্ধারিত হিসাবে)।
  4. এই কারণে বেশিরভাগ 'বোধগম্য' সূচকগুলি সর্বদা ক্যাশে থাকবে।
  5. সূচকগুলি buffer cacheসারিগুলির মতো একই ক্যাশে ( ??) থাকে এবং সুতরাং কোনও সূচী দ্বারা ব্যবহৃত ক্যাশে স্থান সারিগুলিতে পাওয়া যায় না।


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

এটি করার আগে, আমি স্পষ্ট করে বলতে চাই যে আংশিক সূচক নিয়োগ করা দুটি সুবিধা দেয়:

  1. আমরা ক্যাশে সূচকের আকার হ্রাস করি, ক্যাশে নিজেরাই সারিগুলির জন্য আরও জায়গা মুক্ত করি।
  2. আমরা বি-ট্রি এর আকার হ্রাস করি, যার ফলে একটি দ্রুত প্রশ্নের উত্তর দেওয়া হয়।

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

উত্তর:


19

Pg_buffercache দিয়ে কিছুটা খেলে আমি আপনার কয়েকটি প্রশ্নের উত্তর পেতে পারি।

  1. এটি বেশ সুস্পষ্ট, তবে (5) এর ফলাফলগুলিও হ'ল উত্তরটি হ্যাঁ
  2. আমি এটির জন্য এখনও একটি ভাল উদাহরণ স্থাপন করতে পারি না, আপাতত এটি হ্যাঁ না-এর চেয়ে বেশি :) (নীচে আমার সম্পাদনা দেখুন, উত্তরটি নেই ))
  3. যেহেতু পরিকল্পনাকারী হ'ল কে সিদ্ধান্ত নেন যে কোনও সূচক ব্যবহার করবেন কিনা, তাই আমরা হ্যাঁ বলতে পারি , এটি ক্যাশেিংয়ের সিদ্ধান্ত নেয় (তবে এটি আরও জটিল)
  4. ক্যাশিংয়ের সঠিক বিবরণ উত্স কোড থেকে নেওয়া যেতে পারে, আমি এই বিষয় ছাড়া খুব বেশি এই বিষয়টিতে খুঁজে পাইনি এই এক (লেখক দেখি উত্তর খুব)। যাইহোক, আমি নিশ্চিত যে এটি আবার সাধারণ হ্যাঁ বা না এর চেয়ে অনেক জটিল। (আবারও, আমার সম্পাদনা থেকে আপনি কিছু ধারণা পেতে পারেন - যেহেতু ক্যাশের আকার সীমাবদ্ধ, সেই 'বুদ্ধিমান' সূচীগুলি উপলব্ধ জায়গার জন্য প্রতিযোগিতা করে they যদি তারা খুব বেশি হয় তবে তারা একে অপরকে ক্যাশে থেকে লাথি মারবে - সুতরাং উত্তরটি বরং হয় না । )
  5. pg_buffercacheশো সহ একটি সহজ ক্যোয়ারী হিসাবে , উত্তর একটি নির্দিষ্ট YES । এটি লক্ষণীয় যে অস্থায়ী সারণী ডেটা এখানে ক্যাশে হবে না

সম্পাদনা

আমি টেবিল এবং সূচক স্টোরেজ সম্পর্কে জেরেমিয়া পেশকার ভয়ঙ্কর নিবন্ধটি পেয়েছি । সেখান থেকে তথ্য দিয়ে, আমি উত্তর দিতে পারে (2) । আমি একটি ছোট পরীক্ষা সেট আপ করেছি, যাতে আপনি নিজেরাই এটি পরীক্ষা করতে পারেন।

-- we will need two extensions
CREATE EXTENSION pg_buffercache;
CREATE EXTENSION pageinspect;


-- a very simple test table
CREATE TABLE index_cache_test (
      id serial
    , blah text
);


-- I am a bit megalomaniac here, but I will use this for other purposes as well
INSERT INTO index_cache_test
SELECT i, i::text || 'a'
FROM generate_series(1, 1000000) a(i);


-- let's create the index to be cached
CREATE INDEX idx_cache_test ON index_cache_test (id);


-- now we can have a look at what is cached
SELECT c.relname,count(*) AS buffers
FROM 
    pg_class c 
    INNER JOIN pg_buffercache b ON b.relfilenode = c.relfilenode 
    INNER JOIN pg_database d ON (b.reldatabase = d.oid AND d.datname = current_database())
GROUP BY c.relname
ORDER BY 2 DESC LIMIT 10;

             relname              | buffers
----------------------------------+---------
 index_cache_test                 |    2747
 pg_statistic_relid_att_inh_index |       4
 pg_operator_oprname_l_r_n_index  |       4
... (others are all pg_something, which are not interesting now)

-- this shows that the whole table is cached and our index is not in use yet

-- now we can check which row is where in our index
-- in the ctid column, the first number shows the page, so 
-- all rows starting with the same number are stored in the same page
SELECT * FROM bt_page_items('idx_cache_test', 1);

 itemoffset |  ctid   | itemlen | nulls | vars |          data
------------+---------+---------+-------+------+-------------------------
          1 | (1,164) |      16 | f     | f    | 6f 01 00 00 00 00 00 00
          2 | (0,1)   |      16 | f     | f    | 01 00 00 00 00 00 00 00
          3 | (0,2)   |      16 | f     | f    | 02 00 00 00 00 00 00 00
          4 | (0,3)   |      16 | f     | f    | 03 00 00 00 00 00 00 00
          5 | (0,4)   |      16 | f     | f    | 04 00 00 00 00 00 00 00
          6 | (0,5)   |      16 | f     | f    | 05 00 00 00 00 00 00 00
...
         64 | (0,63)  |      16 | f     | f    | 3f 00 00 00 00 00 00 00
         65 | (0,64)  |      16 | f     | f    | 40 00 00 00 00 00 00 00

-- with the information obtained, we can write a query which is supposed to
-- touch only a single page of the index
EXPLAIN (ANALYZE, BUFFERS) 
    SELECT id 
    FROM index_cache_test 
    WHERE id BETWEEN 10 AND 20 ORDER BY id
;

 Index Scan using idx_test_cache on index_cache_test  (cost=0.00..8.54 rows=9 width=4) (actual time=0.031..0.042 rows=11 loops=1)
   Index Cond: ((id >= 10) AND (id <= 20))
   Buffers: shared hit=4
 Total runtime: 0.094 ms
(4 rows)

-- let's have a look at the cache again (the query remains the same as above)
             relname              | buffers
----------------------------------+---------
 index_cache_test                 |    2747
 idx_test_cache                   |       4
...

-- and compare it to a bigger index scan:
EXPLAIN (ANALYZE, BUFFERS) 
SELECT id 
    FROM index_cache_test 
    WHERE id <= 20000 ORDER BY id
;


 Index Scan using idx_test_cache on index_cache_test  (cost=0.00..666.43 rows=19490 width=4) (actual time=0.072..19.921 rows=20000 loops=1)
   Index Cond: (id <= 20000)
   Buffers: shared hit=4 read=162
 Total runtime: 24.967 ms
(4 rows)

-- this already shows that something was in the cache and further pages were read from disk
-- but to be sure, a final glance at cache contents:

             relname              | buffers
----------------------------------+---------
 index_cache_test                 |    2691
 idx_test_cache                   |      58

-- note that some of the table pages are disappeared
-- but, more importantly, a bigger part of our index is now cached

সর্বোপরি, এটি দেখায় যে সূচিপত্র এবং সারণীগুলি পৃষ্ঠায় পৃষ্ঠাতে ক্যাশে করা যেতে পারে, সুতরাং এর উত্তর (2) হয় কোন

এবং অস্থায়ী টেবিলগুলি এখানে অ-ক্যাশে করা হয়েছে তা চিত্রিত করার জন্য একটি চূড়ান্ত এক:

CREATE TEMPORARY TABLE tmp_cache_test AS 
SELECT * FROM index_cache_test ORDER BY id FETCH FIRST 20000 ROWS ONLY;

EXPLAIN (ANALYZE, BUFFERS) SELECT id FROM tmp_cache_test ORDER BY id;

-- checking the buffer cache now shows no sign of the temp table

1
+1 খুব সুন্দর উত্তর। বোঝায় যে র‍্যামে থাকা টেম্প টেবিলগুলি ক্যাশেড নয়। যদিও আমি আশ্চর্য হই যে, কোনও টেম্প টেবিলগুলি ডিস্কে ছড়িয়ে পড়ার সাথে সাথে ক্যাশিং ঘটে কিনা (পর্যাপ্ত অভাবে temp_buffers) - পুরো টেবিলের জন্য বা ডিস্কের কেবলমাত্র অংশে। আমি পরেরটি আশা করব একটি আকর্ষণীয় পরীক্ষা হতে পারে ..
এরউইন ব্র্যান্ডসেটেটার

9

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

আপনার কাছে মেমোরিতে একটি সূচকের 0.1% বা এর 100% সহজেই থাকতে পারে। বেশিরভাগ বুদ্ধিমান "সূচকগুলি সর্বদা ক্যাশে থাকবে" এই ধারণাটি যখন আপনার কাছে এমন কোনও প্রশ্ন থাকে যা কেবলমাত্র একটি টেবিলের একটি উপসেটকে স্পর্শ করে তখন কঠোরভাবে পড়ে যায়। আপনার যদি সময় ভিত্তিক ডেটা থাকে তবে একটি সাধারণ উদাহরণ। প্রায়শই এগুলি সাধারণত টেবিলের সাম্প্রতিক প্রান্তে নেভিগেট করে থাকে, খুব কমই পুরানো ইতিহাস দেখা হয়। মেমরির সাম্প্রতিক প্রান্তে এবং আশেপাশে নেভিগেট করার জন্য প্রয়োজনীয় সমস্ত সূচক ব্লকগুলি সেখানে খুঁজে পেতে পারেন, যখন আগের রেকর্ডগুলি নেভিগেট করার জন্য খুব কম লোকের প্রয়োজন ছিল।

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

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

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