2013-04-05 7 views
5

के साथ अत्यधिक धीमी गति से धीमी गति से मैंने Kendo DataSourceResult ToDataSourceResult(this IQueryable enumerable, DataSourceRequest request); विस्तार का विस्तार किया है और अब तक 40 मिलियन रिकॉर्ड की तालिका पूछताछ करते समय प्रदर्शन प्रदर्शन कभी नहीं देखा है। 10 क्वेरी मैं एक मानक के रूप में लिखा था लेने के रूप में यह अनुरोध में पारित रूप में ही हैकेंडो एमवीसी ToDataSourceResult बड़े IQueryable

यह मेरा पढ़ने कार्रवाई है:।

public ActionResult ReadAll([DataSourceRequest] DataSourceRequest 
{ 
    var startTimer = DateTime.Now; 
    var context = Helpers.EFTools.GetCADataContext(); 
    Debug.WriteLine(string.Format("{0} : Got Context", DateTime.Now - startTimer)); 

    var events = from e in context.Events 
       select 
        new Models.Event() 
         { 
          Id = e.Id, 
          DateTime = e.EventDateTime, 
          HostId = e.Door.HostId, 
          SiteId = e.Door.Host.SiteId, 
          UserId = (int)e.UserId, 
          UserName = e.User.FirstName + " " + e.User.Surname, 
          DoorId = e.DoorId, 
          Door = e.Door.Name, 
          Description = e.Description, 
          SubDescription = e.SubDescription 
         }; 
    Debug.WriteLine(string.Format("{0} : Built Query", DateTime.Now - startTimer)); 

    var tenRecods = events.OrderByDescending(i => i.DateTime).Take(10).ToList(); 
    Debug.WriteLine(string.Format("{0} : Taken 10", DateTime.Now - startTimer)); 

    var result = events.ToDataSourceResult(request); 
    Debug.WriteLine(string.Format("{0} : Datasource Result", DateTime.Now - startTimer)); 

    return this.Json(result); 
} 

डीबग से उत्पादन:

00:00:00.1316569 : Got Context 
00:00:00.1332584 : Built Query 
00:00:00.2407656 : Taken 10 
00:00:21.5013946 : Datasource Result 

हालांकि कभी-कभी क्वेरी का समय समाप्त हो जाता है। का उपयोग dbMonitor मैं दोनों querys पर कब्जा कर लिया, पहली मैनुअल 10 ले:

"Project1".id, 
"Project1"."C1", 
"Project1".hostid, 
"Project1".siteid, 
"Project1".userid, 
"Project1"."C2", 
"Project1".doorid, 
"Project1"."name", 
"Project1".description, 
"Project1".subdescription 
FROM (SELECT 
    "Extent1".id, 
    "Extent1".userid, 
    "Extent1".description, 
    "Extent1".subdescription, 
    "Extent1".doorid, 
    "Extent2"."name", 
    "Extent2".hostid, 
    "Extent3".siteid, 
    CAST("Extent1".eventdatetime AS timestamp) AS "C1", 
    "Extent4".firstname || ' ' || "Extent4".surname AS "C2" 
    FROM public.events AS "Extent1" 
    INNER JOIN public.doors AS "Extent2" ON "Extent1".doorid = "Extent2".id 
    INNER JOIN public.hosts AS "Extent3" ON "Extent2".hostid = "Extent3".id 
    INNER JOIN public.users AS "Extent4" ON "Extent1".userid = "Extent4".id 
) AS "Project1" 
ORDER BY "Project1"."C1" DESC 
LIMIT 10 

और ToDataSourceRequest क्वेरी:

request.Aggregates Count = 0 
request.Filters Count = 0 
request.Groups Count = 0 
request.Page 1 
request.PageSize 10 
request.Sorts Count = 1 

यह वह जगह है:

SELECT 
"GroupBy1"."A1" AS "C1" 
FROM (SELECT Count(1) AS "A1" 
    FROM public.events AS "Extent1" 
    INNER JOIN public.doors AS "Extent2" ON "Extent1".doorid = "Extent2".id 
) AS "GroupBy1" 

यह DataSourceRequest request पैरामीटर में पारित कर दिया है var result = events.ToDataSourceResult(request);

का परिणाम 210

DataSourceRequest का उपयोग करके अधिक कुशल और तेज़ तरीके से IQueryable IQueryable से DataSourceResult कैसे प्राप्त कर सकता हूं?

+0

जैसा कि दूसरे SQL से देखा जा सकता है, आपके पास DataSourceRequest में पेजिंग सक्षम नहीं है। पेजिंग सक्षम करने में बहुत मदद मिलती है। –

+0

मैंने अनुरोध पैरामीटर को शामिल करने के लिए अपना उत्तर अपडेट कर दिया है। 'Var result = events.ToDataSourceResult (अनुरोध) से परिणाम;' केवल 10 आइटम शामिल हैं। मैंने सोचा कि यह पेजिंग था, अगर नहीं तो मैं इसे कैसे सक्षम करूं? –

+1

आपके अनुरोध में वास्तव में पेजिंग जानकारी है। हालांकि आप जो SQL कथन दिखा रहे हैं वह नहीं है। मुझे लगता है कि यह एक अलग एसक्यूएल कथन है। आप ToDataSourceResult को छोड़ सकते हैं और कस्टम बाध्यकारी को यहां दिखाए गए अनुसार लागू कर सकते हैं: http://docs.kendoui.com/getting-started/using-kendo-with/aspnet-mvc/helpers/grid/custom- बाइंडिंग –

उत्तर

2

कस्टम बाध्यकारी (Atanas Korchev द्वारा सुझाए गए) को लागू करने के बाद, डीबग आउटपुट टाइम स्टैम्प के साथ, यह स्पष्ट था कि प्रदर्शन समस्या, कुल गणना क्या हो रही थी।

एसक्यूएल को देखकर मैंने इसे वापस ले लिया, मुझे नहीं पता कि मैंने इसे पहले क्यों नहीं देखा।

कुल पंक्ति गणना तुरंत प्राप्त करना एक और सवाल है लेकिन मुझे यहां दिए गए किसी भी उत्तर पोस्ट करेंगे।

संबंधित मुद्दे