ฉันพยายามไปCOUNT(*)
ที่โต๊ะที่มี 150,000 แถวที่มีคีย์หลัก มันเป็นเครื่องมือประมาณ 5 นาทีดังนั้นฉันจึงคิดว่านี่เป็นปัญหาการจัดทำดัชนี
อ้างถึงคู่มือ PostgreSQL :
REINDEX นั้นคล้ายกับการดร็อปและสร้างดัชนีใหม่ซึ่งเนื้อหาดัชนีจะถูกสร้างใหม่ตั้งแต่เริ่มต้น อย่างไรก็ตามข้อควรพิจารณาในการล็อคค่อนข้างแตกต่างกัน REINDEX ล็อคการเขียน แต่ไม่อ่านตารางหลักของดัชนี นอกจากนี้ยังใช้การล็อกแบบเอกสิทธิ์เฉพาะบุคคลในดัชนีเฉพาะที่กำลังประมวลผลซึ่งจะบล็อกการอ่านที่พยายามใช้ดัชนีนั้น (... ) CREATE INDEX ที่ตามมาล็อคการเขียน แต่ไม่อ่าน เนื่องจากดัชนีไม่อยู่ที่นั่นการอ่านจะไม่พยายามใช้ซึ่งหมายความว่าจะไม่มีการบล็อก แต่การอ่านอาจถูกบังคับให้สแกนตามลำดับราคาแพง
จากประสบการณ์ของคุณคุณสามารถบอกได้:
- เป็น
REINDEXING
อันตรายหรือไม่? มันจะเป็นอันตรายต่อความสอดคล้องของข้อมูลหรือไม่ - ใช้เวลานานไหม?
- มันเป็นทางออกที่เป็นไปได้สำหรับสถานการณ์ของฉันหรือไม่
ปรับปรุง:
วิธีแก้ปัญหาที่ใช้งานได้สำหรับเราคือสร้างดัชนีเดียวกันใหม่ด้วยชื่ออื่นแล้วลบดัชนีเก่า
การสร้างดัชนีนั้นรวดเร็วมากและเราได้ลดขนาดดัชนีจาก 650 MB เป็น 8 MB ใช้ a COUNT(*)
กับbetween
ใช้เวลาเพียง 3 วินาที
COUNT(*)
เป็นตัวเลือกที่ดีที่สุด:If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.