2016-02-02 12 views
7

मैं .NET ढांचे का उपयोग कर रहा हूं 4.5.1 SQL से लिंक।एकल प्रश्न 3 प्रश्नों से धीमे

public class Part 
{ 
    public int PartID { get; set; } 

    [Required(ErrorMessage = "xxx")]   
    public string Title { get; set; } 

    [MaxLength(50)] 
    [Index(IsClustered = false, IsUnique = false,Order =1)] 
    public string Part_Number { get; set; } 

    [MaxLength(50)] 
    [Index(IsClustered = false, IsUnique = false, Order = 2)] 
    public string Manufacturer_Number { get; set; } 
} 

मैं डेटाबेस में उन संस्थाओं के लगभग 2500000 है:

मैं पहली बार कोड का उपयोग कर इस उत्पाद वर्ग की है।

पहले दृष्टिकोण

var query = db.Parts.Where(s => s.Manufacturer_Number == sstring).ToList();     
query.AddRange(db.Parts.Where(s => s.Part_Number == sstring).ToList()); 
query.AddRange(db.Parts.Where(s => s.Title == sstring).ToList()); 

दूसरा दृष्टिकोण

var query = db.Parts.Where(s => s.Manufacturer_Number == sstring 
|| s.Part_Number == sstring || s.Title == sstring).ToList(); 

पहले दृष्टिकोण 100 बार दूसरा दृष्टिकोण की तुलना में तेजी है। क्या कोई इसे समझा सकता है?

+8

आपको एसक्यूएल को देखना चाहिए जो आपके linq द्वारा प्रोड्यूज़ किया गया है और फिर अपने ManagmentStudio में निष्पादन योजना की जांच करें। हो सकता है कि आपके पास प्रत्येक फ़ील्ड पर इंडेक्स हों और सरल प्रश्न उनका उपयोग कर सकें लेकिन आपका अंतिम नहीं। –

+1

मुझे उम्मीद है कि यदि आपके पास तालिका में 2,5 एम रिकॉर्ड हैं तो उसके पास इंडेक्स हैं ... –

+0

आप वास्तव में क्या हासिल करना चाहते हैं ..? @J37yvanEijk टिप्पणी के अनुसार –

उत्तर

1

शीर्षक पर किसी सूचकांक के बिना मुझे यह विश्वास करना थोड़ा मुश्किल लगता है कि आप जिस व्यवहार का दावा कर रहे हैं उसे प्राप्त कर रहे हैं।

कम से कम आंकड़े सेट करें और परिणाम इस प्रश्न में जोड़ें।

लेकिन कहा कि पहला दृष्टिकोण वास्तव में डेटाबेस के लिए तीन यात्रा है, लेकिन बनाए गए इंडेक्स का लाभ उठाएगा।

दूसरा दृष्टिकोण डाटाबेस के लिए एक ही यात्रा है, लेकिन निश्चित रूप से एक पूर्ण टेबल स्कैन में परिणाम होगा, 2,500,000 पंक्तियों में गैर-छोटी अवधि लगने की संभावना है।

+1

यदि सभी फ़ील्ड अनुक्रमित हैं, तो इसका परिणाम तालिका स्कैन नहीं होगा। एकमात्र मामला मैं सोच सकता हूं कि * वास्तविक अंतर क्या हो सकता है (यानी ओपी ने समय की त्रुटि नहीं की है), अगर 'sstring' नल है।शीर्षक में 'आवश्यक' विशेषता है, जिसका अर्थ है कि यह पूर्ण नहीं है। –

+0

@PanagiotisKanavos क्या आप निश्चित हैं कि SQL सर्वर एक ही क्वेरी में एकाधिक अनुक्रमणिका का उपयोग करेगा? –

+0

एसक्यूएल सर्वर सबसे कुशल विकल्प का उपयोग करेगा। बेशक यह होगा, अगर यह * सबसे सस्ता विकल्प है। या यह tempdb में अस्थायी परिणाम कैश करने का निर्णय ले सकता है। खराब आंकड़े या गायब इंडेक्स का मतलब है कि यह गलत योजना चुन सकता है क्योंकि यह नहीं पता था कि यह 'शीर्षक' में किस प्रकार का डेटा मिलेगा। किसी भी मामले में, दोनों दृष्टिकोण समकक्ष भी नहीं हैं - पहला दृष्टिकोण * एक बार से अधिक शर्त को पूरा करने वाली कई बार पंक्तियों को वापस करेगा। दूसरा दृष्टिकोण सभी स्थितियों के खिलाफ पंक्तियों को फ़िल्टर करेगा और उन्हें –

1

जैसा कि मैंने कहा समस्या सूचकांकों में हो सकता है अगर आप अपने प्रश्न इस सटीक क्वेरी मैं आप इस सूचकांक बनाने के लिए सुझाव है कि के साथ तेजी से जाना चाहते हैं:

CREATE NONCLUSTERED INDEX PartIndex 
ON Part (PartID, Manufacturer_Number, Part_Number, Title) 

आंकड़ों को अपडेट करने के लिए यदि आप अपनी तालिका को बदलने के लिए मत भूलना डेटा बहुत

+2

पार्ट_नंबर और निर्माता_नंबर पहले ही अनुक्रमित कर देगा। गुणों में 'इंडेक्स' विशेषता है। यह 'शीर्षक' संपत्ति है जिसमें कोई अनुक्रमणिका नहीं है। एक उम्मीद करेगा कि दोनों के कारण एक ही समय में लेने का प्रयास होगा। ओपी को उत्पन्न प्रश्नों को पोस्ट करना चाहिए –

+0

@ पानागियोटिस कानावोस सहमत हैं, चलिए उनके लिए प्रतीक्षा करें –

+0

मददगार रूप से, SQL सर्वर ट्रैक करता है कि आपके पास कौन से इंडेक्स * नहीं हैं, और इससे कोई फर्क पड़ता है। यहां कुछ स्क्रिप्ट दी गई है जो आपको बताएगी कि आप कौन से इंडेक्स जोड़ सकते हैं, जो सर्वोत्तम प्रदर्शन सुधार प्रदान करेगा: http://mikesknowledgebase.com/pages/SQLServer/FindingMissingIndexes.htm –

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