मैं एक HSQLDB
सर्वर पर 500 000 प्रविष्टियों वाली तालिका के साथ कुछ परीक्षण कर रहा हूं । तालिका में कोई संकेत नहीं है। 5000 अलग-अलग व्यावसायिक कुंजी हैं। मुझे उनकी एक सूची चाहिए। स्वाभाविक रूप से मैंने एक DISTINCT
प्रश्न के साथ शुरू किया था :
SELECT DISTINCT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
इसमें लगभग 90 सेकंड लगते हैं !!!
फिर मैंने प्रयोग करने की कोशिश की GROUP BY
:
SELECT business_key FROM memory WHERE
concept <> 'case' or
attrib <> 'status' or
value <> 'closed'
GROUP BY business_key
और 1 सेकंड लगता है !!!
मेरे द्वारा चलाए गए अंतर का पता लगाने की कोशिश की जा रही है EXLAIN PLAN FOR
लेकिन यह दोनों प्रश्नों के लिए समान जानकारी देता है।
EXLAIN PLAN FOR DISTINCT ...
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
EXLAIN PLAN FOR SELECT ... GROUP BY ...
isDistinctSelect=[false]
isGrouped=[true]
isAggregated=[false]
columns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
join type=INNER
table=MEMORY
alias=M
access=FULL SCAN
condition = [ index=SYS_IDX_SYS_PK_10057_10058
other condition=[
OR arg_left=[
OR arg_left=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[
VALUE = case, TYPE = CHARACTER]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[
VALUE = status, TYPE = CHARACTER]]] arg_right=[
NOT_EQUAL arg_left=[
COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[
VALUE = closed, TYPE = CHARACTER]]]
]
]]
groupColumns=[
COLUMN: PUBLIC.MEMORY.BUSINESS_KEY]
PARAMETERS=[]
SUBQUERIES[]
Object References
PUBLIC.MEMORY
PUBLIC.MEMORY.CONCEPT
PUBLIC.MEMORY.ATTRIB
PUBLIC.MEMORY.VALUE
PUBLIC.MEMORY.BUSINESS_KEY
Read Locks
PUBLIC.MEMORY
WriteLocks
संपादित करें : मैंने अतिरिक्त परीक्षण किए। HSQLDB
सभी अलग-अलग व्यावसायिक कुंजियों के साथ 500 000 रिकॉर्ड के साथ, प्रदर्शन DISTINCT
अब बेहतर है - 3 सेकंड, बनाम GROUP BY
जिसमें लगभग 9 सेकंड लगे।
में MySQL
दोनों प्रश्नों ही पहिले:
MySQL: 500 000 पंक्तियाँ - 5 000 अलग-अलग व्यावसायिक कुंजियाँ: दोनों प्रश्न: 0.5 सेकंड MySQL: 500 000 पंक्तियाँ - सभी अलग-अलग व्यावसायिक कुंजियाँ:
SELECT DISTINCT ...
- 11 सेकंड
SELECT ... GROUP BY business_key
- 13 सेकंड
तो समस्या केवल से संबंधित है HSQLDB
।
मैं बहुत आभारी रहूंगा अगर कोई समझा सकता है कि इतना कठोर अंतर क्यों है।
EXPLAIN PLAN
औरDISTINCT
क्वेरी को चलाने का प्रयास करें जब आप यहGROUP BY
देखने के लिए दौड़ें कि क्या कुछ कैशिंग समयरेखा को कम कर रहा है ...