มีความเข้าใจผิดบางประการที่นี่:
บิตแมป nullคือไม่ได้เป็นส่วนหนึ่งของส่วนหัวกอง tuple ตามเอกสาร:
มีส่วนหัวขนาดคงที่ (ครอบครอง 23 ไบต์บนเครื่องส่วนใหญ่) ตามด้วยบิตแมป null ที่เป็นตัวเลือก ...
32 คอลัมน์ที่ไม่สามารถลบได้ของคุณไม่น่าเชื่อถือด้วยเหตุผลสองประการ:
บิตแมป null ถูกเพิ่มต่อแถวและเฉพาะในกรณีที่มีค่าจริงNULL
ในแถวอย่างน้อยหนึ่งค่า คอลัมน์ที่มีค่าเป็นโมฆะไม่มีผลกระทบโดยตรงมีเพียงNULL
ค่าจริงเท่านั้น หากมีการจัดสรรบิตแมปที่ว่างเปล่ามันจะถูกจัดสรรอย่างสมบูรณ์เสมอ (ทั้งหมดหรือไม่มีเลย) ขนาดที่แท้จริงของบิตแมปโมฆะคือ1 บิตต่อคอลัมน์ปัดเศษขึ้นไบต์ต่อไป ต่อรหัส souce ปัจจุบัน:
#define BITMAPLEN(NATTS) (((int)(NATTS) + 7) / 8)
บิตแมป null ถูกปันส่วนหลังจากส่วนหัวของ heap tuple และตามด้วย OID ที่เป็นทางเลือกและจากนั้นข้อมูลแถว การเริ่มต้นของ OID หรือข้อมูลแถวถูกระบุโดยt_hoff
ในส่วนหัว รหัสแหล่งความคิดเห็นต่อ :
โปรดทราบว่า t_hoff จะต้องเป็น MAXALIGN หลายรายการ
มีหนึ่งไบต์ว่างหลังจากส่วนหัวของ heap tuple ซึ่งมี 23 ไบต์ บิตแมปที่เป็นโมฆะสำหรับแถวสูงสุด8คอลัมน์จึงไม่มีค่าใช้จ่ายเพิ่มเติม ด้วยคอลัมน์ที่ 9 ในตารางt_hoff
มีความก้าวหน้าอีกหนึ่งMAXALIGN
ไบต์ (โดยทั่วไปคือ 8) เพื่อให้อีก 64 คอลัมน์ ดังนั้นชายแดนต่อไปจะอยู่ที่72คอลัมน์
ในการแสดงข้อมูลการควบคุมของคลัสเตอร์ฐานข้อมูล PostgreSQL (รวมถึงMAXALIGN
) ตัวอย่างสำหรับการติดตั้ง Postgres 9.3 แบบทั่วไปบนเครื่อง Debian:
sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main
ฉันปรับปรุงคำแนะนำในคำตอบที่เกี่ยวข้องกับคุณยกมา
นอกจากนั้นแม้ว่าALTER TABLE
คำสั่งของคุณจะเรียกใช้การเขียนตารางใหม่ทั้งหมด (ซึ่งอาจเป็นไปได้การเปลี่ยนประเภทข้อมูล) 250K นั้นไม่มากเท่าไหร่และจะใช้เวลาไม่กี่วินาทีในเครื่องที่เหมาะสมครึ่งทาง (ยกเว้นแถวใหญ่ผิดปกติ) . 10 นาทีขึ้นไปแสดงว่าเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง คำสั่งของคุณกำลังรอการล็อคบนโต๊ะเป็นไปได้มากที่สุด
จำนวนรายการที่pg_stat_activity
เพิ่มขึ้นหมายถึงการทำธุรกรรมที่เปิดกว้างมากขึ้น - ระบุการเข้าถึงพร้อมกันบนโต๊ะ (เป็นไปได้มากที่สุด) ที่ต้องรอให้การดำเนินการเสร็จสิ้น
ภาพบางส่วนในที่มืด
ตรวจสอบการขยายตัวของตารางที่เป็นไปได้ลองแบบนุ่มนวลVACUUM mytable
หรือก้าวร้าวมากขึ้นVACUUM FULL mytable
ซึ่งอาจพบปัญหาการเกิดพร้อมกันเดียวกันเนื่องจากแบบฟอร์มนี้ได้รับการล็อคแบบเอกสิทธิ์ด้วย คุณสามารถลองpg_repackแทน ...
ฉันจะเริ่มต้นด้วยการตรวจสอบปัญหาที่อาจเกิดขึ้นกับดัชนีทริกเกอร์คีย์ต่างประเทศหรือข้อ จำกัด อื่น ๆ โดยเฉพาะประเด็นที่เกี่ยวข้องกับคอลัมน์ โดยเฉพาะดัชนีที่เสียหายอาจมีส่วนเกี่ยวข้อง? ลองREINDEX TABLE mytable;
หรือDROP
ทั้งหมดของพวกเขาและเพิ่มพวกเขาหลังจากที่ในรายการเดียวกันALTER TABLE
ลองรันคำสั่งในตอนกลางคืนหรือเมื่อใดก็ตามที่มีโหลดไม่มาก
วิธีการบังคับเดรัจฉานจะหยุดการเข้าถึงเซิร์ฟเวอร์จากนั้นลองอีกครั้ง:
หากไม่สามารถลงไปได้การอัปเกรดเป็นเวอร์ชั่นปัจจุบันหรือที่กำลังจะมาถึงโดยเฉพาะอย่างยิ่ง 9.4 อาจช่วยได้ มีการปรับปรุงหลายอย่างสำหรับตารางขนาดใหญ่และรายละเอียดการล็อค แต่ถ้ามีบางอย่างในฐานข้อมูลของคุณแตกคุณควรจะเข้าใจก่อน
SET NOT NULL
ไม่ได้เปลี่ยนประเภทเพียงเพิ่มข้อ จำกัด แต่ต้องตรวจสอบข้อ จำกัดกับตารางและต้องใช้การสแกนแบบเต็มตาราง 9.4 ปรับปรุงบางกรณีโดยการล็อคที่อ่อนแอ แต่ก็ยังมีน้ำหนักมาก