ฉันมีตารางที่มีแถว 250K ในฐานข้อมูลการทดสอบของฉัน (มีการผลิตอยู่สองสามร้อยล้านล้านเราสามารถสังเกตปัญหาเดียวกันได้) ตารางมีตัวระบุสตริง nvarchar2 (50) ไม่ใช่ null โดยมีดัชนีที่ไม่ซ้ำกัน (ไม่ใช่ PK)
ตัวระบุประกอบด้วยส่วนแรกที่มี 8 ค่าที่แตกต่างกันในฐานข้อมูลการทดสอบของฉัน (และประมาณหนึ่งพันครั้งในการผลิต) จากนั้นเครื่องหมาย @ และในที่สุดก็มีตัวเลขยาว 1 ถึง 6 หลัก ตัวอย่างเช่นอาจมี 50,000 แถวที่ขึ้นต้นด้วย 'ABCD_BGX1741F_2006_13_20110808.xml @' และตามด้วยตัวเลขที่แตกต่างกัน 50,000 ตัวเลข
เมื่อฉันสอบถามแถวเดียวโดยใช้ตัวระบุความเป็นหัวใจนั้นประมาณเป็น 1 ค่าใช้จ่ายต่ำมากมันใช้งานได้ดี เมื่อฉันค้นหามากกว่าหนึ่งแถวที่มีตัวระบุหลายตัวในนิพจน์ IN หรือนิพจน์ OR การประมาณค่าของดัชนีนั้นผิดอย่างสมบูรณ์ดังนั้นจึงใช้การสแกนตารางแบบเต็ม หากฉันบังคับดัชนีด้วยคำใบ้มันเร็วมากการสแกนตารางแบบเต็มจะดำเนินการตามลำดับความสำคัญช้ากว่าจริง ๆ (และผลิตได้ช้ากว่ามาก) ดังนั้นจึงเป็นปัญหาของเครื่องมือเพิ่มประสิทธิภาพ
เป็นการทดสอบฉันทำซ้ำตาราง (ใน schema + tablespace เดียวกัน) กับ DDL เดียวกันและเนื้อหาเดียวกันแน่นอน ฉันสร้างดัชนีที่ไม่ซ้ำกันขึ้นใหม่ในตารางแรกเพื่อทำการวัดที่ดีและสร้างดัชนีเดียวกันที่แน่นอนบนตารางโคลน DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);
ผม คุณสามารถเห็นได้ว่าชื่อดัชนีนั้นต่อเนื่องกัน ดังนั้นตอนนี้ความแตกต่างเพียงอย่างเดียวระหว่างสองตารางคือการโหลดครั้งแรกตามลำดับแบบสุ่มเป็นระยะเวลานานโดยมีบล็อกกระจายอยู่บนดิสก์ (ในพื้นที่ตารางพร้อมกับตารางขนาดใหญ่อื่น ๆ ) ที่สองถูกโหลดเป็นแบตช์เดียว INSERT เลือก นอกจากนั้นฉันไม่สามารถจินตนาการถึงความแตกต่างได้ (ตารางต้นฉบับถูกย่อขนาดตั้งแต่การลบครั้งใหญ่ครั้งล่าสุดและไม่มีการลบครั้งเดียวหลังจากนั้น)
ต่อไปนี้เป็นแผนคิวรีสำหรับตารางป่วยและโคลน (สตริงภายใต้แปรงสีดำเหมือนกันทั่วรูปภาพและภายใต้แปรงสีเทา)
(ในตัวอย่างนี้มีแถว 1867 แถวที่ขึ้นต้นด้วยตัวระบุที่เป็นสีดำแปรงแบบสอบถามแบบ 2 แถวจะสร้างความเป็นหัวใจของ 1867 * 2 แบบสอบถามแบบ 3 แถวจะสร้างความเป็นหัวใจที่ 1867 * 3 เป็นต้นไม่สามารถ เป็นเรื่องบังเอิญ Oracle ดูเหมือนจะไม่สนใจจุดสิ้นสุดของตัวระบุ)
สิ่งที่อาจทำให้เกิดพฤติกรรมนี้ เห็นได้ชัดว่ามันค่อนข้างแพงในการสร้างตารางขึ้นมาใหม่
USER_TABLES: http://i.stack.imgur.com/nDWze.jpg USER_INDEXES: http://i.stack.imgur.com/DG9um.jpgฉันเปลี่ยนชื่อสกีมาและพื้นที่ตารางเท่านั้น คุณจะเห็นว่าชื่อตารางและดัชนีนั้นเหมือนกับในภาพหน้าจอของแผนแบบสอบถาม