जब आपके पास एक क्वेरी या संग्रहीत कार्यविधि होती है जिसमें प्रदर्शन ट्यूनिंग की आवश्यकता होती है, तो आपके द्वारा पहले किए गए कुछ प्रयास क्या हैं?
जब आपके पास एक क्वेरी या संग्रहीत कार्यविधि होती है जिसमें प्रदर्शन ट्यूनिंग की आवश्यकता होती है, तो आपके द्वारा पहले किए गए कुछ प्रयास क्या हैं?
जवाबों:
यहाँ उन चीजों की आसान सूची है, जो मैं हमेशा अनुकूलन के बारे में पूछने वाले किसी व्यक्ति को देता हूं।
हम मुख्य रूप से साइबेस का उपयोग करते हैं, लेकिन अधिकांश सलाह बोर्ड पर लागू होगी।
उदाहरण के लिए, SQL सर्वर, प्रदर्शन निगरानी / ट्यूनिंग बिट्स के एक मेजबान के साथ आता है, लेकिन अगर आपके पास ऐसा कुछ नहीं है (और शायद आप भी करते हैं) तो मैं निम्नलिखित पर विचार करूंगा ...
99% समस्याएं जो मैंने देखी हैं, वे बहुत सी तालिकाओं को एक सम्मिलित में रखने के कारण होती हैं । इसके लिए तय है कि आप आधी ज्वाइनिंग (कुछ टेबल के साथ) करें और नतीजों को अस्थायी टेबल में कैशे करें। फिर उस अस्थायी तालिका में शेष क्वेरी को मिलाएं।
#temp
टेबल @table
बड़े संस्करणों (हजारों पंक्तियों) के साथ चर की तुलना में बहुत बेहतर प्रदर्शन कर सकते हैं ।विषय से थोड़ा दूर लेकिन अगर आपका इन मुद्दों पर नियंत्रण है ...
उच्च स्तर और उच्च प्रभाव।
CREATE INDEX
आश्वासन दें कि आपके WHERE
और JOIN
क्लॉस के लिए इंडेक्स उपलब्ध हैं। यह डेटा एक्सेस को बहुत तेज कर देगा।
यदि आपका वातावरण डेटा मार्ट या वेयरहाउस है, तो अनुक्रमणिका को लगभग किसी भी बोधगम्य क्वेरी के लिए छोड़ देना चाहिए।
एक लेन-देन के माहौल में , अनुक्रमित की संख्या कम होनी चाहिए और उनकी परिभाषाएं अधिक रणनीतिक होनी चाहिए ताकि सूचकांक रखरखाव संसाधनों को नीचे न खींचे। (इंडेक्स मेंटेनेंस तब होता है जब इंडेक्स की पत्तियों को अंतर्निहित तालिका में परिवर्तन को दर्शाने के लिए बदलना चाहिए, जैसा कि INSERT, UPDATE,
और DELETE
संचालन के साथ ।)
इसके अलावा, सूचकांक में फ़ील्ड्स के क्रम के प्रति सावधान रहें - जितना अधिक चयनात्मक (उच्च कार्डिनैलिटी) एक फ़ील्ड, सूचकांक में यह पहले दिखाई देना चाहिए। उदाहरण के लिए, कहें कि आप प्रयुक्त ऑटोमोबाइल के लिए क्वेरी कर रहे हैं:
SELECT i.make, i.model, i.price
FROM dbo.inventory i
WHERE i.color = 'red'
AND i.price BETWEEN 15000 AND 18000
आमतौर पर मूल्य में उच्च कार्डिनलिटी होती है। केवल कुछ दर्जन रंग उपलब्ध हो सकते हैं, लेकिन संभवतः हजारों अलग-अलग पूछ मूल्य हैं।
इन अनुक्रमणिका विकल्पों में से, idx01
क्वेरी को संतुष्ट करने के लिए तेज़ पथ प्रदान करता है:
CREATE INDEX idx01 ON dbo.inventory (price, color)
CREATE INDEX idx02 ON dbo.inventory (color, price)
ऐसा इसलिए है क्योंकि कम कारें रंग पसंद की तुलना में मूल्य बिंदु को संतुष्ट करेंगी, क्वेरी इंजन को विश्लेषण करने के लिए कम डेटा देगी।
मुझे पता है कि दो बहुत ही समान अनुक्रमित हैं जो केवल एक में प्रश्नों (पहले नाम, अंतिम नाम) को गति देने के लिए और दूसरे में (अंतिम नाम, प्रथम नाम) को अलग करने के लिए फ़ील्ड क्रम में हैं।
एक ट्रिक जो मैंने हाल ही में सीखी है, वह यह है कि SQL सर्वर अपडेट स्टेटमेंट में स्थानीय वेरिएबल्स के साथ-साथ फील्ड को भी अपडेट कर सकता है।
UPDATE table
SET @variable = column = @variable + otherColumn
या अधिक पठनीय संस्करण:
UPDATE table
SET
@variable = @variable + otherColumn,
column = @variable
मैंने पुनरावर्ती गणनाओं को लागू करते समय जटिल अभिशापों / जोड़ों को बदलने के लिए इसका उपयोग किया है, और प्रदर्शन में भी बहुत कुछ हासिल किया है।
यहाँ विवरण और उदाहरण कोड है कि प्रदर्शन में शानदार सुधार किया है: http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005-----optimal। aspx
यहां MySQL की मानें, तो क्वेरी के साथ क्या हो रहा है, यह जानने के लिए EXPLAIN का उपयोग करें, सुनिश्चित करें कि इंडेक्स को यथासंभव कुशलता से उपयोग किया जा रहा है और फ़ाइल प्रकारों को समाप्त करने का प्रयास करें। उच्च प्रदर्शन MySQL: अनुकूलन, बैकअप, प्रतिकृति, और अधिक इस विषय पर एक महान पुस्तक है जैसा कि MySQL Performance Blog है ।
@Terrapin isnull और coalesce के बीच कुछ अन्य अंतर हैं जो ध्यान देने योग्य हैं (ANSI अनुपालन के अलावा, जो मेरे लिए एक बड़ा है)।
मैं आम तौर पर जॉन्स के साथ शुरू करूँगा - मैं उनमें से हर एक को क्वेरी से बाहर एक समय में दस्तक दूँगा और एक विचार प्राप्त करने के लिए क्वेरी को फिर से चला सकता हूं यदि कोई विशेष जॉइन है तो मुझे समस्या हो रही है।
मेरे सभी अस्थायी तालिकाओं पर, मैं अनुक्रमणिका बनाने के लिए अद्वितीय अवरोधों (जहां उपयुक्त) को जोड़ना पसंद करता हूं, और प्राथमिक कुंजी (लगभग हमेशा)।
declare @temp table(
RowID int not null identity(1,1) primary key,
SomeUniqueColumn varchar(25) not null,
SomeNotUniqueColumn varchar(50) null,
unique(SomeUniqueColumn)
)
मैंने इसे हमेशा बाइंड चर का उपयोग करने की आदत बनाई है। अगर RDBMS SQL स्टेटमेंट को कैश नहीं करता है तो यह संभव है कि बाइंड वैरिएबल मदद नहीं करेगा। लेकिन अगर आप बाइंड वेरिएबल्स का उपयोग नहीं करते हैं तो RDBMS के पास क्वेरी एक्जीक्यूटिव प्लान और पार्स किए गए एसक्यूएल स्टेटमेंट का पुन: उपयोग करने का मौका नहीं है। बचत भारी हो सकती है: http://www.akadia.com/services/ora_bind_variables.html । मैं ज्यादातर ओरेकल के साथ काम करता हूं, लेकिन Microsoft SQL सर्वर उसी तरह से काम करता है।
मेरे अनुभव में, यदि आप नहीं जानते कि आप बाइंड चर का उपयोग कर रहे हैं या नहीं, तो आप शायद नहीं हैं। यदि आपकी एप्लिकेशन भाषा उनका समर्थन नहीं करती है, तो ऐसा करने वाले को खोजें। कभी-कभी आप क्वेरी B के लिए बाइंड चर का उपयोग करके क्वेरी A को ठीक कर सकते हैं।
उसके बाद, मैं अपने डीबीए से बात करता हूं कि आरडीबीएमएस को सबसे ज्यादा दर्द हो रहा है। ध्यान दें कि आपको यह नहीं पूछना चाहिए कि "यह क्वेरी धीमी क्यों है?" यह आपके डॉक्टर से आपको अपेंडिक्स निकालने के लिए कहने जैसा है। सुनिश्चित करें कि आपकी क्वेरी समस्या हो सकती है, लेकिन यह केवल संभावना है कि कुछ और गलत हो रहा है। डेवलपर्स के रूप में, हम कोड की लाइनों के संदर्भ में सोचना चाहते हैं। यदि कोई रेखा धीमी है, तो उस रेखा को ठीक करें। लेकिन RDBMS वास्तव में एक जटिल प्रणाली है और आपकी धीमी क्वेरी एक बहुत बड़ी समस्या का लक्षण हो सकती है।
जिस तरह से कई एसक्यूएल ट्यूनिंग युक्तियां कार्गो पंथ की मूर्तियां हैं। अधिकांश समय यह समस्या असंबंधित या न्यूनतम रूप से आपके द्वारा उपयोग किए गए सिंटैक्स से संबंधित होती है, इसलिए आमतौर पर आपके द्वारा किए गए सबसे साफ सिंटैक्स का उपयोग करना सबसे अच्छा होता है। तब आप डेटाबेस को ट्यून करने के तरीकों को देखना शुरू कर सकते हैं (क्वेरी नहीं)। केवल विफल होने पर वाक्यविन्यास को ट्विस्ट करें।
किसी भी प्रदर्शन ट्यूनिंग की तरह, हमेशा सार्थक आंकड़े एकत्र करें। जब तक यह उपयोगकर्ता का अनुभव नहीं है कि आप ट्यूनिंग कर रहे हैं, तो वॉलकॉक समय का उपयोग न करें। इसके बजाय सीपीयू समय जैसी चीजों को देखें, पंक्तियाँ और ब्लॉक डिस्क से पढ़ें। अक्सर लोग गलत काम के लिए अनुकूलन करते हैं।
यदि संभव हो तो बाईं ओर के प्रश्नों को प्रश्नों में न बदलें। उदाहरण के लिए यदि आप तालिका 1 में सभी पंक्तियों को खोजना चाहते हैं जो तालिका 2 में एक विदेशी कुंजी द्वारा अप्रयुक्त हैं तो आप ऐसा कर सकते हैं:
SELECT *
FROM Table1
WHERE Table1.ID NOT IN (
SELECT Table1ID
FROM Table2)
लेकिन आपको इससे बेहतर प्रदर्शन मिलेगा:
SELECT Table1.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.Table1ID
WHERE Table2.ID is null
@ डेविड एम
MySQL की मानें तो, क्वेरी के साथ क्या चल रहा है, यह जानने के लिए EXPLAIN का उपयोग करें, यह सुनिश्चित करें कि इंडेक्स का यथासंभव कुशलता से उपयोग किया जा रहा है ...
SQL सर्वर में, निष्पादन योजना आपको एक ही चीज़ मिलती है - यह बताता है कि अनुक्रमणिका क्या हिट हो रही हैं, आदि।
जरूरी नहीं कि एसक्यूएल परफॉर्मेंस ट्रिक प्रति एसई लेकिन निश्चित रूप से संबंधित हो:
एक अच्छा विचार यह होगा कि जहां संभव हो सके, मेमेकैच्ड का उपयोग करना होगा क्योंकि यह डेटाबेस से प्राप्त करने के बजाय मेमोरी से सीधे पहले से तैयार किए गए डेटा को प्राप्त करना अधिक तेज होगा। MySQL का एक फ्लेवर भी है जिसे मेमस्कैल्ड इन (थर्ड पार्टी) बनाया गया है।
सुनिश्चित करें कि आपकी अनुक्रमणिका की लंबाई यथासंभव छोटी है। यह DB को फ़ाइल सिस्टम से एक बार में अधिक कुंजियों को पढ़ने की अनुमति देता है, इस प्रकार आपके जुड़ने में तेजी लाता है। मुझे लगता है कि यह सभी DB के साथ काम करता है, लेकिन मुझे पता है कि यह MySQL के लिए एक विशिष्ट सिफारिश है।
मैं बाहर देखने के लिए:
SET NOCOUNT ON
आमतौर पर मेरी संग्रहीत प्रक्रियाओं के अंदर पहली पंक्ति, जब तक कि मुझे वास्तव में उपयोग करने की आवश्यकता न हो @@ROWCOUNT
।
SQL सर्वर में, nolock निर्देश का उपयोग करें। यह प्रतीक्षा किए बिना चयन कमांड को पूरा करने की अनुमति देता है - आमतौर पर अन्य लेनदेन समाप्त करने के लिए।
SELECT * FROM Orders (nolock) where UserName = 'momma'
जहाँ भी निंदक नहीं हैं, वहाँ से श्राप हटा दें।
फ़ंक्शन कॉल को Sprocs में निकालें जहाँ बहुत सारी पंक्तियाँ फ़ंक्शन को कॉल करेंगी।
मेरे सहयोगी ने बहुत व्यापक रिकॉर्ड वापस करने के लिए फ़ंक्शन कॉल का उपयोग किया (उदाहरण के रूप में उपयोगकर्ता से अंतिम रूप प्राप्त करना)।
अनुकूलन के साथ काम किया, मैंने फ़ंक्शन कॉल को फ़ंक्शन के कोड के साथ स्पोक में बदल दिया: मुझे कई स्प्रोक्स का समय> 20 सेकंड से <1 तक कम हो गया।
मुझे इस्तेमाल करना पसंद है
isnull(SomeColThatMayBeNull, '')
ऊपर
coalesce(SomeColThatMayBeNull, '')
जब मुझे कई तर्क समर्थन की आवश्यकता नहीं होती है जो आपको देता है।
http://blog.falafel.com/2006/04/05/SQLServerArcanaISNULLVsCOALESCE.aspx
"Sp_" के साथ Stored Procedure नामों को पहले से न रखें क्योंकि सिस्टम प्रक्रियाएं सभी "sp_" से शुरू होती हैं, और SQL सर्वर को कॉल करने पर आपकी प्रक्रिया को खोजने के लिए कठिन खोज करनी होगी।
set transaction isolation level read uncommitted
मृत तालों को रोकता है जहां लेनदेन अखंडता बिल्कुल आवश्यक नहीं है (जो आमतौर पर सच है)