จำเป็นต้องมี REINDEX หรือไม่หลังจาก CLUSTER


12

ฉันกำลังพิจารณาใช้ CLUSTER เพื่อเรียงลำดับตารางใหม่โดยดัชนี ฉันเข้าใจว่าการพักผ่อนหย่อนใจของข้อมูลตารางนี้ทำให้ดัชนีที่มีอยู่ทั้งหมดขยายตัวหรือไร้ประโยชน์ ฉันเห็นสิ่งบ่งชี้ว่าต้องมี REINDEX หลังจากกลุ่มข้อมูล ฉันพบการอ้างอิงอื่นที่บ่งชี้ว่า CLUSTER ทำ REINDEX เอกสารอย่างเป็นทางการกล่าวว่าไม่มีอะไรที่เกี่ยวกับดัชนีการเป็นส่วนหนึ่งของคลัสเตอร์หรือต้องการ (แม้ว่าจะไม่แนะนำให้ทำงานหลังจากวิเคราะห์คลัสเตอร์)

ทุกคนสามารถแตกต่างกัน (เช่นกับการอ้างอิงบางส่วนไปยังเอกสารอย่างเป็นทางการ) สามารถพูดว่าต้องการ REINDEX หลังจาก CLUSTER หรือไม่


2
ฉันไม่คิดว่ามันจำเป็น clusterย้ายตำแหน่งของแถวใหม่ดังนั้นจึงจำเป็นต้องอัปเดตข้อมูลดัชนีอย่างไรก็ตาม
a_horse_with_no_name

ใช่ แต่ทฤษฎีครึ่งหนึ่งของการอภิปรายที่ฉันพบคือสิ่งที่ทำให้ดัชนีขยายตัว
TREE

คำตอบ:


12

คุณไม่จำเป็นต้องทำดัชนีใหม่เพราะCLUSTERทำเพื่อคุณอย่างมีประสิทธิภาพ

โดยเฉพาะอย่างยิ่งCLUSTERล็อคตารางต้นฉบับจากนั้นสร้างสำเนาใหม่ที่สั่งตามดัชนีเป้าหมาย มันสร้างดัชนีในสำเนาใหม่จากนั้นแทนที่ตารางเก่าและดัชนีด้วยดัชนีใหม่

โปรดทราบว่านี่เป็นจริงVACUUM FULLใน 9.0+

ถ้าคุณได้เห็นการอภิปรายบอกว่าCLUSTERbloats ดัชนีมันอาจจะเป็นคนที่กำลังสมมติว่างานเหมือนก่อนCLUSTER 9.0 VACUUM FULLนอกจากนี้คุณยังอาจจะได้เห็นและ misreading อภิปรายว่าดัชนีการกล่าวถึงการขยายตัวที่เกิดจากเก่าVACUUM FULLดำเนินงานและการแนะนำCLUSTERในฐานะที่เป็นทางเลือก

สิ่งนี้มีนัยในเอกสาร :

สำเนาชั่วคราวของตารางถูกสร้างขึ้นที่มีข้อมูลตารางในลำดับดัชนี สำเนาชั่วคราวของแต่ละดัชนีบนโต๊ะจะถูกสร้างขึ้นได้เป็นอย่างดี ดังนั้นคุณต้องมีพื้นที่ว่างบนดิสก์อย่างน้อยเท่ากับผลรวมของขนาดตารางและขนาดดัชนี

สิ่งที่มันไม่ได้พูด แต่ควรจะให้ผู้ที่สำเนาชั่วคราวแล้วแทนที่ตารางเดิม (ฉันเป็นตัวหนา)


1
คุณมีการอ้างอิงใด ๆ ที่ CLUSTER แทนที่ดัชนีหรือไม่
TREE

1
@ ต้นไม้เพิ่ม เอกสารไม่ได้บอกคุณอย่างชัดเจนว่าตารางชั่วคราวและดัชนีนั้นแทนที่ต้นฉบับ แต่คุณจะเห็นว่าเป็นกรณีนี้หากคุณดูที่ไดเรกทอรีข้อมูลก่อน / หลังคลัสเตอร์หรือถ้าคุณตรวจสอบซอร์สโค้ด
Craig Ringer

ฉันได้ทำการทดสอบแล้วและอย่างน้อยในสถานการณ์การทดสอบของฉันขนาดไฟล์ดัชนีลดลง แต่นี่เป็นเพียงสถานการณ์เดียวและอาจมีตัวแปรมากมายที่ส่งผลกระทบต่อพฤติกรรม (จำนวนดัชนีขนาดรวมของดิสก์และอื่น ๆ ) ดังนั้นฉันจึงไม่สามารถเชื่อถือการทดสอบอย่างง่าย
TREE

1
@TREE เพื่อความแน่นอนในการทำความเข้าใจพฤติกรรมในสถานการณ์ที่เป็นไปได้ทั้งหมดคุณจะต้องอ่านซอร์สโค้ด ทั้งหมดที่ผมสามารถบอกคุณได้ว่าผมไม่ได้ตระหนักถึงสถานการณ์ใด ๆ ที่CLUSTERไม่ได้เขียนดัชนีและการตรวจสอบของไฟล์ที่เกิดขึ้นจริงในbase/อย่างชัดเจนจะแสดงใหม่relfilenodes ดูเหมือนว่าคุณกังวลเกี่ยวกับปัญหาที่คุณยังไม่มี
Craig Ringer

8

ฉันใช้ a_horse_with_no_name ในเรื่องนี้: คุณไม่จำเป็นต้องสร้างดัชนีใหม่ นอกจากนั้นCLUSTERเอกสารไม่ได้กล่าวถึงเราสามารถให้คำปรึกษากับREINDEXหน้าได้อีกด้วย:

มีหลายสถานการณ์ที่ใช้ REINDEX:

  • ดัชนีเสียหายและไม่มีข้อมูลที่ถูกต้องอีกต่อไป แม้ว่าในทางทฤษฎีสิ่งนี้ไม่ควรเกิดขึ้น แต่ในทางปฏิบัติดัชนีอาจเสียหายเนื่องจากข้อบกพร่องของซอฟต์แวร์หรือความล้มเหลวของฮาร์ดแวร์ REINDEX ให้วิธีการกู้คืน

  • ดัชนีกลายเป็น "bloated" ซึ่งมีหลายหน้าเปล่าหรือเกือบจะว่างเปล่า สิ่งนี้สามารถเกิดขึ้นได้กับดัชนี B-tree ใน PostgreSQL ภายใต้รูปแบบการเข้าถึงที่ผิดปกติบางอย่าง REINDEX จัดเตรียมวิธีการลดการใช้พื้นที่ของดัชนีโดยการเขียนดัชนีเวอร์ชันใหม่โดยไม่มีเพจที่ไม่ทำงาน ดูหัวข้อ 23.2 สำหรับข้อมูลเพิ่มเติม

  • คุณได้แก้ไขพารามิเตอร์หน่วยเก็บข้อมูล (เช่นสารเติมเต็ม) สำหรับดัชนีและต้องการให้แน่ใจว่าการเปลี่ยนแปลงนั้นมีผลอย่างสมบูรณ์

  • การสร้างดัชนีที่มีตัวเลือก CONCURRENTLY ล้มเหลวทำให้ดัชนี "ไม่ถูกต้อง" ดัชนีดังกล่าวไม่มีประโยชน์ แต่สามารถใช้ REINDEX เพื่อสร้างใหม่ได้อย่างสะดวก โปรดทราบว่า REINDEX จะไม่ดำเนินการสร้างพร้อมกัน หากต้องการสร้างดัชนีโดยไม่รบกวนการผลิตคุณควรปล่อยดัชนีและออกคำสั่ง CREATE INDEX CONCURRENTLY ใหม่

ชัดเจนCLUSTERไม่ตกอยู่ในกรณีใด ๆ เหล่านี้

และมีประโยคเล็ก ๆ ในCLUSTERเอกสาร:

[ในขณะที่การทำคลัสเตอร์] สำเนาชั่วคราวของแต่ละดัชนีในตารางจะถูกสร้างขึ้นเช่นกัน

สิ่งนี้ชี้ให้เห็นว่าเช่นเดียวกับตารางตัวเองดัชนีจะถูกจัดลำดับใหม่ในระหว่างกระบวนการเช่นกัน - วิธีนี้ทำให้การทำดัชนีใหม่ไร้ประโยชน์


ข้อเสนอแนะมีแน่นอนและการทดสอบดูเหมือนจะยืนยัน ฉันจะรู้สึกดีขึ้นเมื่อใช้พฤติกรรมนี้ถ้าเอกสารบอกว่าดัชนีถูกสร้างขึ้นใหม่ (ถาวร)
TREE

2
ฉันเห็นของสำหรับหมอซ่อมที่นี่ คู่มือควรชัดเจนยิ่งขึ้นเกี่ยวกับการสร้างดัชนีใหม่
Erwin Brandstetter

ความสงสัยของฉัน ณ จุดนี้คือผู้ที่ไม่ต้องการจัดทำเอกสารพฤติกรรมนี้อย่างเป็นทางการเพราะพวกเขาไม่ต้องการผูกติดอยู่กับการใช้งานนี้อย่างถาวร
TREE

@TREE มีการเปลี่ยนแปลงคุณสมบัติมากมายระหว่างเวอร์ชันและการเปลี่ยนแปลงเอกสาร (ส่วนใหญ่) ตามลำดับ สเป็คเปลี่ยนไปเช่นกัน :) ดังนั้นฉันจึงไม่เห็นอะไรเลย
dezso

@dezso True แต่พวกเขาจะไม่เต็มใจที่จะลบฟังก์ชันการทำงานที่ทำเป็นเอกสาร เมื่อพิจารณาถึงคุณภาพของเอกสารโดยทั่วไปฉันยังคงถือว่าการละเว้นพฤติกรรมนี้เป็นไปโดยเจตนา
TREE

5

พบว่ามีการอ้างอิงในการกู้คืนพื้นที่ดิสก์ส่วน

หากคุณมีตารางดังกล่าวและคุณจำเป็นต้องเรียกคืนพื้นที่ว่างบนดิสก์ส่วนเกินที่คุณมีอยู่คุณจะต้องใช้ VACUUM FULL หรือCLUSTERหรือหนึ่งในตัวแปรการเขียนตารางใหม่ของ ALTER TABLE คำสั่งเหล่านี้เขียนสำเนาใหม่ทั้งหมดของตารางและสร้างดัชนีใหม่สำหรับมัน


-3

การวิเคราะห์คำตอบทั้งหมดในความคิดของฉันวิธีที่เหมาะสมในการทำเช่นนั้นคือการทำดัชนีกลุ่มก่อนที่จะ เนื่องจากเอกสารไม่ได้บอกว่าคลัสเตอร์ทำดัชนีใหม่หรือไม่และมีเพียงสำเนาดัชนีสั่งหรือไม่ฉันคิดว่าดัชนีที่จัดทำดัชนีจะส่งผลให้ตารางคลัสเตอร์ดีขึ้น หลังจากนั้นการวิเคราะห์จะทำให้งานเสร็จ สูญญากาศเต็มรูปแบบก่อนที่ทุกคนดูเหมือนว่าจะไร้ประโยชน์เว้นแต่กลุ่มและ / หรือ reindex ไม่ปล่อย tuples ตาย


ดังที่ฉันพูดถึงในคำตอบที่ยอมรับเอกสารจะบอกว่าดัชนีจะถูกสร้างใหม่ แต่ไม่ได้อยู่ในหน้าเกี่ยวกับคำสั่ง CLUSTER
TREE

และทั้งคู่CLUSTERและVACUUM FULLสร้างตารางจริงขึ้นมาใหม่ - มันจะไม่มีทางตายได้หลังจากนั้น พื้นที่ที่ใช้โดยสำเนาเก่าจะถูกทำให้ว่างในตอนท้ายของการดำเนินการ
dezso

จริง มันสร้างตารางและดัชนีทั้งหมดใหม่ แต่ฉันมีข้อสงสัยเกี่ยวกับดัชนีที่กลุ่มใช้เพื่อจัดลำดับตารางใหม่ มันจะถูกทำดัชนีใหม่ก่อนหรือจะใช้เพื่อเรียงลำดับตารางใหม่ตามที่เป็นอยู่? และหลังจากนั้นดัชนีก็ถูกสร้างใหม่? เนื่องจากดัชนีที่มีปัญหาสามารถสร้างปัญหาได้ ...
Aislan Luiz Wendling
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.