ओएस: उबंटू १८.०४
अपाचे इग्नाइट: 2.9.0 (नवीनतम)

लोड किया गया डेटा: (कागल से ओलिस्ट ब्राज़ीलियाई ई-कॉमर्स डेटासेट)
2 टेबल:
ऑर्डर: 100k रिकॉर्ड
ऑर्डर_पेमेंट्स: 100k रिकॉर्ड

अनुक्रमित कॉलम:
आदेश_भुगतान: CREATE INDEX idx_order_payments ON order_payments (id, order_id, payment_type)
आदेश: CREATE INDEX idx_orders ON orders (order_id,customer_id,order_status,order_purchase_timestamp)

इग्नाइट ऑफ-हीप और पर्सिस्टेंस में कुल ~400 एमबी स्पेस ले रहा है।

मैं एक साधारण SQL क्वेरी कर रहा हूँ:

    SELECT orders.order_status, 
           order_payments.payment_type, 
           SUM(order_payments.payment_value) AS total_payments
    FROM order_payments
    JOIN orders ON orders.order_id = order_payments.order_id
    GROUP BY orders.order_status, order_payments.payment_type
    ORDER BY total_payments DESC

मैं एक डोकर कंटेनर में अपाचे इग्नाइट चला रहा हूँ।

यह कैश टेम्पलेट कॉन्फ़िगरेशन है:

<property name="cacheConfiguration">
    <list>
        <bean abstract="true" class="org.apache.ignite.configuration.CacheConfiguration"
              id="cache-template-bean">
            <!-- when you create a template via XML configuration, you must add an asterisk to
            the name of the template -->
            <property name="name" value="tbl_pll*"/>
            <property name="cacheMode" value="PARTITIONED"/>
            <property name="backups" value="1"/>
            <property name="queryParallelism" value="4"/>
            <!-- Other cache parameters -->
        </bean>
        <bean abstract="true" class="org.apache.ignite.configuration.CacheConfiguration"
              id="cache-template-bean">
            <!-- when you create a template via XML configuration, you must add an asterisk to
            the name of the template -->
            <property name="name" value="tbl_hf_pll*"/>
            <property name="cacheMode" value="PARTITIONED"/>
            <property name="backups" value="1"/>
            <property name="queryParallelism" value="2"/>
            <!-- Other cache parameters -->
        </bean>
    </list>
</property>

जब मैं तालिकाओं के लिए tbl_pll कैश टेम्पलेट का उपयोग करता हूं, तो परिणाम सेट (क्वेरी के लिए) लगभग (1 / queryParallelism) * तालिका में मानों की संख्या है। तो, tbl_pll के मामले में, यह अपेक्षित आउटपुट का लगभग 1/4 देता है।

मैंने queryParallelism=2 के साथ भी ऐसा ही करने की कोशिश की और यह मुझे लगभग 1/2 वां आउटपुट देता है।

मैंने queryParallelism पैरामीटर यानी 1 के डिफ़ॉल्ट मान का उपयोग करके किसी भी कैश टेम्पलेट का उपयोग न करने का भी प्रयास किया और इसने पूरा परिणाम लौटा दिया।

अपेक्षित पूर्ण आउटपुट (और आउटपुट जब queryParallelism=1):

[['delivered', 'credit_card', 12101094.87999937]
 ['delivered', 'boleto', 2769932.57999998]
 ['delivered', 'voucher', 343013.19]
 ['delivered', 'debit_card', 208421.12]]

queryParallelism=4 के साथ:

[['delivered', 'credit_card', 4064387.2800000096], 
 ['delivered', 'boleto', 918272.54], 
 ['delivered', 'voucher', 110648.45000000004], 
 ['delivered', 'debit_card', 64584.53000000001]]

queryParallelism=2 के साथ:

[['delivered', 'credit_card', 6129872.129999977], 
 ['delivered', 'boleto', 1360427.3799999985], 
 ['delivered', 'voucher', 168392.55999999976], 
 ['delivered', 'debit_card', 107637.38999999996]]

मुझे क्या संदेह है: queryparallelism खंडित अनुक्रमणिका का उपयोग कर रहा है, आउटपुट अंतिम/प्रथम अनुक्रमणिका खंड में जो था उस पर आधारित है। या तो कमी ठीक से काम नहीं कर रही है और आउटपुट को सभी थ्रेड्स से मर्ज नहीं किया जा रहा है, या इग्नाइट केवल एक थ्रेड चला रहा है और आउटपुट को कम करने के बाद वापस कर रहा है।

चूंकि मैंने इंडेक्स में ऑर्डर_पेमेंट्स का पेमेंट_टाइप कॉलम जोड़ा है, इसलिए आउटपुट लगभग पूरी तरह से थ्रेड्स/इंडेक्स सेगमेंट की संख्या से विभाजित हो रहा है।

मैं क्या गलत कर रहा हूँ और मैं इसे कैसे ठीक कर सकता हूँ?

संपादित करें: मैं अपाचे इग्नाइट का केवल 1 उदाहरण चला रहा हूं।

साथ ही, EXPLAIN कीवर्ड का आउटपुट:

SELECT
    __Z1.ORDER_STATUS AS __C0_0,
    __Z0.PAYMENT_TYPE AS __C0_1,
    SUM(__Z0.PAYMENT_VALUE) AS __C0_2
FROM PUBLIC.ORDERS __Z1
    /* PUBLIC.ORDERS.__SCAN_ */
INNER JOIN PUBLIC.ORDER_PAYMENTS __Z0
    /* PUBLIC.IDX_ORDER_PAYMENTS: ORDER_ID = __Z1.ORDER_ID */
    ON 1=1
WHERE __Z1.ORDER_ID = __Z0.ORDER_ID
GROUP BY __Z1.ORDER_STATUS, __Z0.PAYMENT_TYPE'], ['SELECT
    __C0_0 AS ORDER_STATUS,
    __C0_1 AS PAYMENT_TYPE,
    CAST(CAST(SUM(__C0_2) AS DOUBLE) AS DOUBLE) AS TOTAL_PAYMENTS
FROM PUBLIC.__T0
    /* PUBLIC."merge_scan" */
GROUP BY __C0_0, __C0_1
ORDER BY 3 DESC
0
anurags 22 अक्टूबर 2020, 17:15

1 उत्तर

सबसे बढ़िया उत्तर

सुनिश्चित करें कि टेबल सह-स्थित हैं . affinityKey के पैरामीटर का इस्तेमाल करें < डेटा को एक साथ समूहित करने के लिए कोड>टेबल बनाएं कमांड

साथ ही, जांच लें कि इग्नाइट SQL इंजन सर्वश्रेष्ठ अनुक्रमणिका का चयन करता है। आम तौर पर, एक बार जब आप affinityKey को order_id कॉलम की ओर इशारा करते हुए सेट करते हैं, तो जुड़ने के दौरान order_id इंडेक्स का चयन करना होगा।

1
dmagda 22 अक्टूबर 2020, 18:51