मेरे पास एक SQL क्वेरी है (LINQ से Entities द्वारा जेनरेट की गई) जो लगभग निम्न की तरह है:आदेशित कॉलम अनुक्रमित होने के बावजूद मेरा SQL सर्वर ऑर्डर धीमा क्यों है?
SELECT * FROM [mydb].[dbo].[employees]
JOIN [mydb].[dbo].[industry]
ON jobs.industryId = industry.id
JOIN [mydb].[dbo].[state]
ON jobs.stateId = state.id
JOIN [mydb].[dbo].[positionType]
ON jobs.positionTypeId = positionType.id
JOIN [mydb].[dbo].[payPer]
ON jobs.salaryPerId = payPer.id
JOIN [mydb].[dbo].[country]
ON jobs.countryId = country.id
WHERE countryName = 'US'
ORDER BY startDatetime
क्वेरी 1200 पंक्तियों के बारे में बताती है, जो मुझे नहीं लगता कि यह एक बड़ी राशि है। दुर्भाग्य से यह ~ 16 सेकंड भी लेता है। आदेश के बिना, क्वेरी < 1 सेकंड लेता है।
मैंने प्रारंभिक समय कॉलम पर एक इंडेक्स डालने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग किया है, और "cityId, industryId, startDatetime, positionTypeId, payPerId, stateId" पर एक क्लस्टर इंडेक्स भी उपयोग किया है (यानी "नौकरियों" में सभी कॉलम कि हम जॉइन और कॉलम पर उपयोग करते हैं, हम ऑर्डर द्वारा ऑर्डर करते हैं)। हमारे पास जॉइन में उपयोग किए जाने वाले प्रत्येक कॉलम पर पहले से ही व्यक्तिगत इंडेक्स हैं। दुर्भाग्यवश इसने क्वेरी को और तेज़ नहीं बनाया है।
मैंने एक शोप्लान चलाया और मिला:
|--Nested Loops(Inner Join, OUTER REFERENCES:([mydb].[dbo].[jobs].[cityId]))
|--Nested Loops(Inner Join, OUTER REFERENCES:([mydb].[dbo].[jobs].[stateId]))
| |--Nested Loops(Inner Join, OUTER REFERENCES:([mydb].[dbo].[jobs].[industryId]))
| | |--Nested Loops(Inner Join, OUTER REFERENCES:([mydb].[dbo].[jobs].[positionTypeId]))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([mydb].[dbo].[jobs].[salaryPerId]))
| | | | |--Sort(ORDER BY:([mydb].[dbo].[jobs].[issueDatetime] ASC))
| | | | | |--Hash Match(Inner Join, HASH:([mydb].[dbo].[currency].[id])=([mydb].[dbo].[jobs].[salaryCurrencyId]))
| | | | | |--Index Scan(OBJECT:([mydb].[dbo].[currency].[IX_currency]))
| | | | | |--Nested Loops(Inner Join, WHERE:([mydb].[dbo].[jobs].[countryId]=[mydb].[dbo].[country].[id]))
| | | | | |--Index Seek(OBJECT:([mydb].[dbo].[country].[IX_country]), SEEK:([mydb].[dbo].[country].[countryName]='US') ORDERED FORWARD)
| | | | | |--Clustered Index Scan(OBJECT:([mydb].[dbo].[jobs].[PK_jobs]))
| | | | |--Clustered Index Seek(OBJECT:([mydb].[dbo].[payPer].[PK_payPer]), SEEK:([mydb].[dbo].[payPer].[id]=[mydb].[dbo].[jobs].[salaryPerId]) ORDERED FORWARD)
| | | |--Clustered Index Seek(OBJECT:([mydb].[dbo].[positionType].[PK_positionType]), SEEK:([mydb].[dbo].[positionType].[id]=[mydb].[dbo].[jobs].[positionTypeId]) ORDERED FORWARD)
| | |--Clustered Index Seek(OBJECT:([mydb].[dbo].[industry].[PK_industry]), SEEK:([mydb].[dbo].[industry].[id]=[mydb].[dbo].[jobs].[industryId]) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([mydb].[dbo].[state].[PK_state]), SEEK:([mydb].[dbo].[state].[id]=[mydb].[dbo].[jobs].[stateId]) ORDERED FORWARD)
|--Clustered Index Seek(OBJECT:([mydb].[dbo].[city].[PK_city]), SEEK:([mydb].[dbo].[city].[id]=[mydb].[dbo].[jobs].[cityId]) ORDERED FORWARD)
महत्वपूर्ण रेखा "| --ोर्ट (ऑर्डर द्वारा: ([mydb]। [dbo]। [jobs]। [issueDatetime] ASC)) "— उस कॉलम पर किसी इंडेक्स के किसी भी उल्लेख के बिना।
मेरी क्वेरी इतनी धीमी गति से मेरे ऑर्डर क्यों है, और मैं अपनी क्वेरी को कैसे बढ़ा सकता हूं?
और क्या वे सभी विदेशी कुंजी कॉलम हैं जिन्हें आप अनुक्रमित करते हैं ?? –
@marc_s: हाँ, अलग-अलग तालिकाओं पर सभी आईडी कॉलम भी अनुक्रमित हैं। मैं 99.9% निश्चित हूं कि यह शामिल होने वाले जोड़ों में धीमा नहीं है, क्योंकि ORDER BY (और जॉइन छोड़कर) को हटाकर ~ 16s से 1s से बहुत कम समय तक गिर जाता है। – George