यह क्वेरी चालू है यह बॉक्स एक डेटासेंटर में चल रहा एक समर्पित सर्वर है।250k पंक्तियों के खिलाफ 250 सेकंड की पंक्तियों के खिलाफ क्वेरी
AMD Opteron 1354 क्वाड-कोर 2.20GHz रैम विंडोज सर्वर 2008 64 के 2GB (हाँ मैं जानता हूँ कि मैं केवल 2GB RAM के है, मैं 8 जीबी के उन्नयन कर रहा हूँ जब परियोजना का सीधा प्रसारण होता)।
तो मैंने एक टेबल में 250,000 डमी पंक्तियां बनाईं और वास्तव में कुछ प्रश्नों का परीक्षण करने के लिए परीक्षण किया कि LINQ से SQL उत्पन्न होता है और सुनिश्चित करता है कि वे भयानक नहीं हैं और मैंने देखा कि उनमें से एक बेतुका समय ले रहा था।
मेरे पास यह क्वेरी इंडेक्स के साथ 17 सेकंड तक थी लेकिन मैंने उन्हें इस उत्तर के लिए शुरुआत से समाप्त होने के लिए हटा दिया। केवल अनुक्रमणिका प्राथमिक कुंजी हैं।
Stories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[CategoryID] [int] NOT NULL,
[VoteCount] [int] NOT NULL,
[CommentCount] [int] NOT NULL,
[Title] [nvarchar](96) NOT NULL,
[Description] [nvarchar](1024) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[UniqueName] [nvarchar](96) NOT NULL,
[Url] [nvarchar](512) NOT NULL,
[LastActivityAt] [datetime] NOT NULL,
Categories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[ShortName] [nvarchar](8) NOT NULL,
[Name] [nvarchar](64) NOT NULL,
Users table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](32) NOT NULL,
[Password] [nvarchar](64) NOT NULL,
[Email] [nvarchar](320) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[LastActivityAt] [datetime] NOT NULL,
वर्तमान में डेटाबेस में 1 उपयोगकर्ता, 1 श्रेणी और 250,000 कहानियां हैं और मैंने इस क्वेरी को चलाने का प्रयास किया।
SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
INNER JOIN Users ON Users.ID = Stories.UserID
ORDER BY Stories.LastActivityAt
क्वेरी को चलाने के लिए, CPU उपयोग 2-3% पर घूमता है 52 सेकंड लेता है, Membery 1.1GB, 900MB के लिए स्वतंत्र है, लेकिन डिस्क उपयोग नियंत्रण से बाहर लगता है। यह @ 100 एमबी/सेकंड है जिसमें से 2/3 tempdb.mdf पर लिख रहे हैं और बाकी tempdb.mdf से पढ़ रहे हैं।
अब दिलचस्प भाग के लिए ...
SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
INNER JOIN Users ON Users.ID = Stories.UserID
SELECT TOP(10) *
FROM Stories
INNER JOIN Users ON Users.ID = Stories.UserID
ORDER BY Stories.LastActivityAt
SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
ORDER BY Stories.LastActivityAt
सभी 3 इन खोजों के काफी तत्काल कर रहे हैं।
पहली क्वेरी के लिए Exec योजना।
http://i43.tinypic.com/xp6gi1.png
एक्ज़ेक अन्य 3 प्रश्नों (क्रम में) के लिए योजनाएं।
http://i43.tinypic.com/30124bp.png
http://i44.tinypic.com/13yjml1.png
http://i43.tinypic.com/33ue7fb.png
किसी भी मदद की बहुत सराहना की जाएगी।
इंडेक्स जोड़ने के बाद एक्सेल योजना (फिर से 17 सेकंड तक)।
http://i39.tinypic.com/2008ytx.png
मुझे हर किसी से बहुत उपयोगी प्रतिक्रिया मिली है और मैं आपको धन्यवाद देता हूं, मैंने इस पर एक नया कोण कोशिश की। मैं उन कहानियों से पूछता हूं जिनकी मुझे ज़रूरत है, फिर अलग-अलग प्रश्नों में श्रेणियां और उपयोगकर्ता मिलते हैं और 3 प्रश्नों के साथ ही इसे केवल 250 मिलीमीटर मिलते हैं ... मुझे इस मुद्दे को समझ में नहीं आता है, लेकिन अगर यह काम करता है और 250 एमएमएस पर कम समय के लिए मैं कम नहीं करता उस के साथ छड़ी। यहां वह कोड है जिसका उपयोग मैंने परीक्षण करने के लिए किया था।
DBDataContext db = new DBDataContext();
Console.ReadLine();
Stopwatch sw = Stopwatch.StartNew();
var stories = db.Stories.OrderBy(s => s.LastActivityAt).Take(10).ToList();
var storyIDs = stories.Select(c => c.ID);
var categories = db.Categories.Where(c => storyIDs.Contains(c.ID)).ToList();
var users = db.Users.Where(u => storyIDs.Contains(u.ID)).ToList();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
सुझाव है कि आप निष्पादन योजनाएं पोस्ट करें ... –
आपका tempDB कहां स्थित है? क्या यह एक अलग शारीरिक धुरी पर है? –
आपका डेटा कहां है, लॉग फाइलें? अलग भौतिक ड्राइव पर? –