UPEPG هو امتداد postgresql يضيف دعمًا للفهارس الافتراضية.
الفهرس الافتراضي - أو الظاهري - هو فهرس لا يوجد بالفعل ، وبالتالي لا يكلف وحدة المعالجة المركزية أو القرص أو أي مورد لإنشاءه. من المفيد معرفة ما إذا كانت فهارس محددة يمكن أن تزيد من الأداء للاستعلامات الإشكالية ، حيث يمكنك معرفة ما إذا كانت PostgreSQL ستستخدم هذه الفهارس أم لا دون الحاجة إلى إنفاق الموارد لإنشاءها.
للحصول على معلومات أكثر شمولاً ، يرجى الرجوع إلى الوثائق الرسمية.
للحصول على معلومات عامة أخرى ، يمكنك أيضًا استشارة منشور المدونة هذا.
sudo make installCREATE EXTENSION hypopg; لاحظ أن HUMEPG لا يوفر نصوص ترقية الامتداد ، حيث لا توجد بيانات يتم حفظها في أي من الكائنات التي تم إنشاؤها. لذلك ، تحتاج إلى إسقاط الامتداد أولاً ثم قم بإنشائه مرة أخرى للحصول على الإصدار الجديد.
ملاحظة: توجد الفهارس الافتراضية في الواجهة الخلفية الواحدة. لذلك ، إذا قمت بإضافة فهارس افتراضية متعددة ، فإن الاتصالات المتزامنة التي EXPLAIN لن تتضايقها الفهارس الافتراضية.
بافتراض حالة اختبار بسيطة:
rjuju=# CREATE TABLE hypo AS SELECT id, 'line ' || id AS val FROM generate_series(1,10000) id;
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
أسهل طريقة لإنشاء فهرس افتراضي هي استخدام وظائف hypopg_create_index مع عبارة CREATE INDEX منتظمة كـ arg.
على سبيل المثال:
rjuju=# SELECT * FROM hypopg_create_index('CREATE INDEX ON hypo (id)');
ملاحظة: سيتم تجاهل بعض المعلومات من عبارة CREATE INDEX ، مثل اسم الفهرس إذا تم توفيرها. سيتم التعامل مع بعض المعلومات التي تم تجاهلها في إصدار مستقبلي.
يمكنك التحقق من الفهارس الافتراضية المتوفرة في الواجهة الخلفية الخاصة بك:
rjuju=# SELECT * FROM hypopg_list_indexes ;
indexrelid | index_name | schema_name | table_name | am_name
------------+-------------------------------+-------------+------------+---------
50573 | <50573>btree_hypo_id | public | hypo | btree
إذا كان أمر CREATE INDEX الذي تريد استخدامه أيضًا يحتاج إلى اقتباس ، يوصى باستخدام بناء الجملة بالدولار. على سبيل المثال:
rjuju=# SELECT * FROM hypopg_create_index($$CREATE INDEX ON hypo (id) WHERE val = 'line 1'$$);
إذا كنت بحاجة إلى مزيد من المعلومات الفنية حول الفهارس الافتراضية ، فستقوم وظيفة hypopg() بإرجاع الفهارس الافتراضية بطريقة مماثلة مثل كتالوج نظام pg_index .
والآن ، دعنا نرى ما إذا كان بيان EXPLAIN السابق الخاص بك سيستخدم مثل هذا الفهرس:
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using <41072>hypo_btree_hypo_id on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
بالطبع ، EXPLAIN فقط بدون ANALYZE سوف يستخدم الفهارس الافتراضية:
rjuju=# EXPLAIN ANALYZE SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13) (actual time=0.036..6.072 rows=1 loops=1)
Filter: (id = 1)
Rows Removed by Filter: 9999
Planning time: 0.109 ms
Execution time: 6.113 ms
(5 rows)
لإزالة الفهارس الافتراضية للواجهة الخلفية ، يمكنك استخدام الوظيفة hypopg_drop_index(indexrelid) مع OID التي يعيدها عرض hypopg_list_indexes واستدعاء hypopg_reset() لإزالة كل شيء مرة واحدة ، أو مجرد إغلاق اتصالك الحالي.
بالاستمرار في الحالة أعلاه ، يمكنك hide existing indexes ، ولكن يجب أن تستخدم hypopg_reset() لمسح الآثار السابقة للفهارس الأخرى في البداية.
قم بإنشاء فهسين حقيقيين وقم بتشغيل EXPLAIN :
rjuju=# SELECT hypopg_reset();
rjuju=# CREATE INDEX ON hypo(id);
rjuju=# CREATE INDEX ON hypo(id, val);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
----------------------------------------------------------------------------------
Index Only Scan using hypo_id_val_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
تستخدم خطة الاستعلام فهرس hypo_id_val_idx . استخدم hypopg_hide_index(oid) لإخفاء أحد الفهارس:
rjuju=# SELECT hypopg_hide_index('hypo_id_val_idx'::REGCLASS);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
تستخدم خطة الاستعلام الآن فهرس hypo_id_idx الآن. استخدم hypopg_hide_index(oid) لإخفائه:
rjuju=# SELECT hypopg_hide_index('hypo_id_idx'::REGCLASS);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
والآن تتغير خطة الاستعلام إلى Seq Scan . استخدم hypopg_unhide_index(oid) لاستعادة فهرس:
rjuju=# SELECT hypopg_unhide_index('hypo_id_idx'::regclass);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------------------------
Index Scan using hypo_id_idx on hypo (cost=0.29..8.30 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
بالطبع ، يمكنك أيضًا إخفاء الفهارس الافتراضية:
rjuju=# SELECT hypopg_create_index('CREATE INDEX ON hypo(id)');
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
------------------------------------------------------------------------------------
Index Scan using "<12659>btree_hypo_id" on hypo (cost=0.04..8.05 rows=1 width=13)
Index Cond: (id = 1)
(2 rows)
rjuju=# SELECT hypopg_hide_index(12659);
rjuju=# EXPLAIN SELECT * FROM hypo WHERE id = 1;
QUERY PLAN
-------------------------------------------------------
Seq Scan on hypo (cost=0.00..180.00 rows=1 width=13)
Filter: (id = 1)
(2 rows)
يمكنك التحقق من أي فهارس مخفية باستخدام hypopg_hidden_indexes() أو عرض hypopg_hidden_indexes :
rjuju=# SELECT * FROM hypopg_hidden_indexes();
indexid
---------
526604
526603
12659
(3 rows)
rjuju=# SELECT * FROM hypopg_hidden_indexes;
indexrelid | index_name | schema_name | table_name | am_name | is_hypo
------------+----------------------+-------------+------------+---------+---------
12659 | <12659>btree_hypo_id | public | hypo | btree | t
526603 | hypo_id_idx | public | hypo | btree | f
526604 | hypo_id_val_idx | public | hypo | btree | f
(3 rows)
لاستعادة جميع الفهارس الموجودة ، يمكنك استخدام الوظيفة hypopg_unhide_all_indexes() . لاحظ أن الوظيفة لإخفاء الفهارس الموجودة تنطبق فقط على الأمر Exply في الجلسة الحالية ولن تؤثر على الجلسات الأخرى.