आपने वास्तव में अपने PostgreSQL उदाहरण या आपके प्रश्नों को ट्यून करने के लिए क्या किया है, इसके बारे में बहुत कुछ नहीं कहा। ट्यूनिंग के माध्यम से PostgreSQL क्वेरी पर 50x की गति को देखना असामान्य नहीं है और/या बेहतर रूप से अनुकूलित प्रारूप में आपकी क्वेरी को पुन: स्थापित करना असामान्य नहीं है।
बस इस सप्ताह एक काम पर एक रिपोर्ट थी जिसमें किसी ने जावा और कई प्रश्नों का उपयोग करके लिखा था, जिस पर यह चार घंटों में कितना दूर था, लगभग पूरा होने में लगभग एक महीने लग रहा था। (इसे पांच अलग-अलग तालिकाओं को मारने की ज़रूरत होती है, जिनमें से प्रत्येक लाखों पंक्तियों के साथ होती है।) मैं इसे कई सीटीई और खिड़की के फ़ंक्शन का उपयोग करके फिर से लिखता हूं ताकि यह दस मिनट से भी कम समय में दौड़ सके और वांछित परिणाम सीधे क्वेरी से उत्पन्न हो सके। यह एक 4400x गति है।
मैं पोस्टग्रेएसक्यूएल में एकाधिक मानदंडों के लिए टेक्स्ट खोजों का एक संक्षिप्त उदाहरण शामिल कर सकता हूं, और कुछ छोटे बदलाव कैसे बड़े प्रदर्शन अंतर कर सकते हैं। इसे त्वरित और सरल रखने के लिए मैं केवल युद्ध और शांति को टेस्ट डेटाबेस में टेक्स्ट फॉर्म में चला रहा हूं, प्रत्येक "दस्तावेज़" एक टेक्स्ट लाइन होने के साथ। hstore
प्रकार या JSON
कॉलम का उपयोग करके मनमानी क्षेत्रों के लिए इसी तरह की तकनीकों का उपयोग किया जा सकता है, यदि डेटा को कम परिभाषित किया जाना चाहिए। जहां उनके स्वयं के इंडेक्स के साथ अलग-अलग कॉलम हैं, इंडेक्स का उपयोग करने के लाभ बहुत अधिक होते हैं।
-- Create the table.
-- In reality, I would probably make tsv NOT NULL,
-- but I'm keeping the example simple...
CREATE TABLE war_and_peace
(
lineno serial PRIMARY KEY,
linetext text NOT NULL,
tsv tsvector
);
-- Load from downloaded data into database.
COPY war_and_peace (linetext)
FROM '/home/kgrittn/Downloads/war-and-peace.txt';
-- "Digest" data to lexemes.
UPDATE war_and_peace
SET tsv = to_tsvector('english', linetext);
-- Index the lexemes using GiST.
-- To use GIN just replace "gist" below with "gin".
CREATE INDEX war_and_peace_tsv
ON war_and_peace
USING gist (tsv);
-- Make sure the database has statistics.
VACUUM ANALYZE war_and_peace;
अनुक्रमण के लिए स्थापित, मैं अनुक्रमित के दोनों प्रकार के साथ पंक्ति में गिना जाता है और समय के साथ कुछ खोजों को दिखाने:
-- Find lines with "gentlemen".
EXPLAIN ANALYZE
SELECT * FROM war_and_peace
WHERE tsv @@ to_tsquery('english', 'gentlemen');
84 पंक्तियाँ, सार: 2.006 एमएस, जिन: 0.194 एमएस
-- Find lines with "ladies".
EXPLAIN ANALYZE
SELECT * FROM war_and_peace
WHERE tsv @@ to_tsquery('english', 'ladies');
184 पंक्तियां, गीस्ट: 3.549 एमएस, जीन: 0।328 एमएस
-- Find lines with "ladies" and "gentlemen".
EXPLAIN ANALYZE
SELECT * FROM war_and_peace
WHERE tsv @@ to_tsquery('english', 'ladies & gentlemen');
1 पंक्ति, सार: 0.971 एमएस, जिन: 0.104 एमएस
अब, के बाद से जिन सूचकांक के बारे में 10 बार सार सूचकांक की तुलना में तेजी से आप आश्चर्य हो सकता है क्यों किसी को भी अनुक्रमण के लिए सार का उपयोग होता था पाठ डेटा जवाब यह है कि जीआईएसटी आमतौर पर बनाए रखने के लिए तेज़ है। इसलिए यदि आपका टेक्स्ट डेटा बेहद अस्थिर है तो जीआईएसटी इंडेक्स कुल भार पर जीत सकता है, जबकि जीआईएन इंडेक्स जीत जाएगा यदि आप केवल खोज समय में रुचि रखते हैं या ज्यादातर पढ़ने के लिए वर्कलोड के लिए।
सूचकांक के बिना उपर्युक्त प्रश्न 17.943 एमएस से 23.3 9 7 एमएस तक कहीं भी लेते हैं क्योंकि उन्हें पूरी तालिका को स्कैन करना होगा और प्रत्येक पंक्ति पर एक मैच की जांच करनी होगी।
जीआईएन सूचकांक दोनों "महिलाओं" और "सज्जनों" के साथ पंक्तियों के लिए अनुक्रमित खोज एक ही डेटाबेस में तालिका स्कैन की तुलना में 172 गुना तेज है। स्पष्ट रूप से अनुक्रमण के लाभ इस परीक्षण के लिए इस्तेमाल किए गए बड़े दस्तावेज़ों के साथ अधिक नाटकीय होंगे।
सेटअप, निश्चित रूप से, एक बार की बात है। tsv
कॉलम को बनाए रखने के लिए ट्रिगर के साथ, किसी भी बदलाव को तुरंत किसी भी सेटअप को दोबारा बिना खोजे जा सकेंगे।
धीमी PostgreSQL क्वेरी के साथ, यदि आप टेबल संरचना (इंडेक्स सहित), समस्या क्वेरी और आउटपुट को EXPLAIN ANALYZE
चलाने से आउटपुट दिखाते हैं, तो कोई भी लगभग हमेशा समस्या को खोज सकता है और सुझाव देता है कि इसे कैसे चलाने के लिए और तेज।
अद्यतन (दिसम्बर 9 '16)
मैं क्या मैं पहले समय प्राप्त करने के लिए प्रयोग किया जाता है, लेकिन आज यह शायद 9.2 प्रमुख रिलीज़ हो गया होता के आधार पर उल्लेख नहीं किया। मैं बस इस पुराने धागे में हुआ और संस्करण 9.6.1 का उपयोग करके उसी हार्डवेयर पर फिर से कोशिश की, यह देखने के लिए कि हस्तक्षेप प्रदर्शन ट्यूनिंग में से कोई भी इस उदाहरण में मदद करता है। केवल एक तर्क के लिए प्रश्न केवल 2% के प्रदर्शन में वृद्धि हुई है, लेकिन जीआईएन (उलटा) का उपयोग करते समय "महिलाओं" और "सज्जनों" की गति में दोगुना होकर 0.053 एमएस (यानी, 53 माइक्रोसॉन्ड) तक दोगुना हो गया है। सूचकांक।
क्या आपने पोस्टग्रेस पूर्ण टेक्स्ट खोज या सरल 'पसंद' प्रश्नों का उपयोग किया था? –
रिलेशनल मॉडल का कभी भी बदसूरत प्रश्नों पर अच्छा प्रदर्शन करने का इरादा नहीं था, जैसे 'मुझे उन सभी लोगों को दें जो बुधवार को पैदा हुए थे और 2003 और 2005 के बीच एक लाल कार के स्वामित्व में थे।' इसके लिए खोज इंजन (जैसे ल्यूसीन) हैं। इंडेक्स कभी-कभी मदद करते हैं, मेमोरी सेटिंग्स हमेशा मदद करते हैं। – wildplasser
मैं आपके प्रश्न से थोड़ा उलझन में हूं, इसलिए मैं यहां पूछता हूं: http://dba.stackexchange.com/questions/34014/using-solr-lucene-for-searching-non-text-tables विल/ल्यूसीन PostgreSQL से खोज तेज हो सकती है भले ही कोई पूर्ण-पाठ खोज शामिल न हो? – alfonx