विभाजन बाधा का उपयोग टाइमस्टैम्प द्वारा विभाजित तालिकाओं में शामिल होने के लिए नहीं किया गया है


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' ;

हालाँकि, अगर मैं एक सीटीई का उपयोग करता हूं, या टाइमस्टैम्प मूल्यों को एक तालिका में डाल देता हूं (अस्थायी तालिका पर अनुक्रमित के साथ भी नहीं दिखाया गया है)।

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 स्कैन में बदल सकता है जो कि विभाजन तालिकाओं के सीमित उपसमुच्चय (50 के 4-5) से ~ 40K पंक्तियों को पुनः प्राप्त करने के लिए बहुत धीमा होगा।

मुझे चिंता है कि कुछ इस तरह की समस्या है।

गैर-तुच्छ अभिव्यक्तियों के लिए आपको पोस्टग्रेज क्वेरी प्लानर को समझने के लिए प्रश्नों में अधिक या कम शब्दशः स्थिति को दोहराना होगा, यह समझें कि वह CHECK बाधा पर भरोसा कर सकता है। भले ही यह बेमानी लगे!

मैं अपने सभी डेटा पर seq स्कैन चलाने की संभावना को कम करने के लिए विभाजन और क्वेरी संरचना को कैसे सुधार सकता हूं?


1
महान सवाल - लेकिन यह बेहतर होगा अगर आप
EXPLAIN

जवाबों:


1

कब्ज-आधारित बहिष्करण [CBE] क्वेरी प्लानिंग के प्रारंभिक चरण में किया जाता है, बस क्वेरी को पार्स करने के बाद, वास्तविक संबंधों पर मैप किया जाता है और फिर से लिखा जाता है। ( इंटर्नल्स , प्लानर / ऑप्टिमाइज़र चरण)

योजनाकार "Sens_sample" तालिका की किसी भी सामग्री को ग्रहण नहीं कर सकता है।

इसलिए जब तक आपके पास क्वेरी में हार्डकोड नहीं है, तब तक प्लानर "विभाजन" को बाहर नहीं करेगा।

मुझे लगता है कि सीटीई संस्करण के साथ क्या होता है ... योजनाकार प्रतिबंधित है क्योंकि आप TABLESAMPLE का उपयोग करते हैं और पूरे उपनगर को वाष्पशील माना जा सकता है, भले ही उपनगर में शाब्दिक स्थिर हों। ( यह सिर्फ मेरा अनुमान है, मैं योजनाकार कोड पर विशेषज्ञ नहीं हूं )

चमकदार पक्ष पर, नकारात्मक परिणाम के साथ सूचकांक स्कैन धधकते हुए तेजी से होता है। (सिंगल पेज स्कैन सबसे अधिक!) जब तक आपके पास 10000 से अधिक विभाजन नहीं होंगे, मैं परेशान नहीं होता।

तो, आपके प्रश्न का सीधा उत्तर देने के लिए:

  • आप इस डेटा संरचना को अधिक सुधार नहीं सकते हैं।

  • रेगरिन इंडेक्स स्कैन - वे सस्ते हैं;

  • अनुक्रमिक स्कैन के बारे में - जब संभव हो तो उन्हें टाला जाता है, जैसा कि आप अपने स्वयं के उदाहरणों पर देखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.