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


11

ฉันมีโครงสร้างตารางที่แบ่งพาร์ติชันเช่น:

CREATE TABLE measurements (
    sensor_id bigint,
    tx timestamp,
    measurement int
);

CREATE TABLE measurements_201201(
    CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone 
       AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval))    
)INHERITS (measurements);
CREATE INDEX ON measurements_201201(sensor_id);
CREATE INDEX ON measurements_201201(tx);
CREATE INDEX ON measurements_201201(sensor_id, tx);
....

และอื่น ๆ แต่ละตารางมีแถวประมาณ 20M

ถ้าฉันค้นหาตัวอย่างของเซ็นเซอร์และตัวอย่างของการประทับเวลาในส่วนWHEREคำสั่งแผนแบบสอบถามจะแสดงตารางที่ถูกต้องที่ถูกเลือกและดัชนีที่กำลังถูกใช้เช่น:

SELECT *
FROM measurements
INNER JOIN sensors TABLESAMPLE BERNOULLI (0.01) USING (sensor_id)
WHERE tx BETWEEN '2015-01-04 05:00' AND '2015-01-04 06:00' 
    OR tx BETWEEN '2015-02-04 05:00' AND '2015-02-04 06:00' 
    OR tx BETWEEN '2014-03-05 05:00' AND '2014-04-07 06:00' ;

อย่างไรก็ตามถ้าฉันใช้ CTE หรือใส่ค่าการประทับเวลาลงในตาราง (ไม่แสดงแม้จะมีดัชนีบนตารางชั่วคราว)

WITH sensor_sample AS(
    SELECT sensor_id, start_ts, end_ts
    FROM sensors TABLESAMPLE BERNOULLI (0.01)
    CROSS JOIN (VALUES (TIMESTAMP '2015-01-04 05:00', TIMESTAMP '2015-01-04 06:00'),
        (TIMESTAMP '2015-02-04 05:00', TIMESTAMP '2015-02-04 06:00'),
        (TIMESTAMP  '2014-03-05 05:00', '2014-04-07 06:00') ) tstamps(start_ts, end_ts)
)

สิ่งที่ต้องการด้านล่าง

SET constraint_exclusion = on;
SELECT * FROM measurements
INNER JOIN sensor_sample USING (sensor_id)
WHERE tx BETWEEN start_ts AND end_ts

ทำการสแกนดัชนีในทุกตาราง ซึ่งยังค่อนข้างเร็ว แต่ด้วยความซับซ้อนที่เพิ่มขึ้นของการค้นหาสิ่งนี้สามารถเปลี่ยนเป็นการสแกน seq ซึ่งจะช้าลงมากสำหรับการดึงแถว ~ 40K จากชุดย่อยที่ จำกัด ของตารางที่แบ่งพาร์ติชัน (4-5 จาก 50)

ฉันกังวลว่าสิ่งนี้เป็นปัญหา

สำหรับนิพจน์ที่ไม่สำคัญคุณต้องทำซ้ำเงื่อนไขคำต่อคำมากขึ้นหรือน้อยลงในเคียวรีเพื่อให้ผู้วางแผนเคียวรี Postgres เข้าใจว่าสามารถพึ่งพาข้อ จำกัด ของการตรวจสอบ แม้ว่ามันดูเหมือนจะซ้ำซ้อน!

ฉันจะปรับปรุงโครงสร้างการแบ่งพาร์ติชันและคิวรีเพื่อลดโอกาสในการเรียกใช้การสแกน seq ในข้อมูลทั้งหมดของฉันได้อย่างไร


1
คำถามที่ดี - แต่มันจะดีกว่านี้ถ้าคุณวางผลลัพธ์ของ
EXPLAIN (ANALYZE, BUFFERS

คำตอบ:


1

การแยกตามข้อ จำกัด [CBE] ดำเนินการในระยะแรกของการวางแผนคิวรีหลังจากที่เคียวรีถูกวิเคราะห์แล้วแม็พกับความสัมพันธ์จริงและเขียนใหม่ ( ภายใน , เวที / เครื่องมือเพิ่มประสิทธิภาพเวที)

ผู้วางแผนไม่สามารถสรุปเนื้อหาใด ๆ ของตาราง "sensor_sample"

ดังนั้นหากคุณไม่มีค่า hardcoded ในแบบสอบถามผู้วางแผนจะไม่ยกเว้น "พาร์ติชัน"

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

ในด้านที่สว่างการสแกนดัชนีพร้อมผลลัพธ์เชิงลบนั้นเร็วอย่างเห็นได้ชัด (สแกนหน้าเดียวมากที่สุด!) ดังนั้นหากคุณไม่มีพาร์ทิชันมากกว่า 10,000 พาร์ติชั่นฉันก็จะไม่รำคาญ

ดังนั้นเพื่อตอบคำถามของคุณโดยตรง:

  • คุณไม่สามารถปรับปรุงโครงสร้างข้อมูลนี้ได้อีกมาก

  • เกี่ยวกับการสแกนดัชนี - ราคาถูก;

  • เกี่ยวกับการสแกนตามลำดับ - จะถูกหลีกเลี่ยงเมื่อเป็นไปได้ตามที่คุณเห็นในตัวอย่างของคุณเอง

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