2009-05-12 11 views
5

में उच्च प्रदर्शन वृक्ष दृश्य को कार्यान्वित करने के लिए कैसे पेड़ का प्रतिनिधित्व करने वाली तालिका बनाने का सबसे अच्छा तरीका क्या है? मैं एक चयन, सम्मिलित, अद्यतन और हटा देना चाहता हूं जो बड़े डेटा के साथ अच्छी तरह से काम करेगा। उदाहरण के लिए चयन को "सभी का विस्तार करें" का समर्थन करना होगा - किसी दिए गए नोड के लिए सभी बच्चों (और वहां बच्चे) प्राप्त करना।SQL सर्वर 2005

उत्तर

8

CTE का उपयोग करें।

पेड़ की तरह तालिका संरचना को देखते हुए:

id parent name 
1 0  Electronics 
2 1  TV 
3 1  Hi-Fi 
4 2  LCD 
5 2  Plasma 
6 3  Amplifiers 
7 3  Speakers 

, इस क्वेरी id, parent और गहराई स्तर वापस आ जाएगी, एक पेड़ के रूप आदेश दिया:

WITH v (id, parent, level) AS 
     (
     SELECT id, parent, 1 
     FROM table 
     WHERE parent = 0 
     UNION ALL 
     SELECT id, parent, v.level + 1 
     FROM v 
     JOIN table t 
     ON  t.parent = v.id 
     ) 
SELECT * 
FROM v 

id parent name 
1 0  Electronics 
2 1  TV 
4 2   LCD 
5 2   Plasma 
3 1  Hi-Fi 
6 3   Amplifiers 
7 3   Speakers 

बदलें parent = @parent साथ parent = 0 केवल प्राप्त करने के लिए एक पेड़ की एक शाखा।

प्रदान किया गया है table (parent) पर एक सूचकांक है, यह क्वेरी कुशलतापूर्वक एक बहुत बड़ी मेज पर काम करेगी, क्योंकि यह प्रत्येक माता-पिता के लिए सभी चिल्डर्डन खोजने के लिए INDEX LOOKUP का पुनरावृत्तिपूर्वक उपयोग करेगी।

WITH v (id, parent, level) AS 
     (
     SELECT id, parent, 1 
     FROM table 
     WHERE parent = 0 
     UNION ALL 
     SELECT id, parent, v.level + 1 
     FROM v 
     JOIN table t 
     ON  t.parent = v.id 
     ) 
UPDATE table t 
SET  column = newvalue 
WHERE t.id IN 
     (
     SELECT id 
     FROM v 
     ) 

जहां @parent शाखा की जड़ है:

एक निश्चित शाखा, इस मुद्दे को अपडेट करें।

+0

क्या आप टेबल संरचना के बारे में विस्तार से बता सकते हैं? क्या यह प्रश्न एक बड़े डीबी के साथ अच्छी तरह से काम करेगा? – SirMoreno

+0

धन्यवाद, गहरा अपडेट कैसे कर सकता है? - माता-पिता के नीचे सभी नोड्स अपडेट करें? (पोते सहित) – SirMoreno

+0

अरे, मैं इसे काम करने की कोशिश कर रहा हूं, और ऐसा लगता है कि vq आइटम dossent work, मैं 2008 में कोशिश कर रहा हूं।डेटाबेस में स्तर को भी संग्रहीत किया जाना चाहिए, क्योंकि यह तालिका में नहीं दिखाया गया है? –

2

पदानुक्रम की समस्या से निपटने के कई तरीकों के लिए Joe Celko's book on trees and hierarchies देखें। आपके द्वारा चुने गए मॉडल पर निर्भर करेगा कि आप वज़न लुकअप बनाम अपडेट बनाम जटिलता कैसे बनाते हैं। आप आसन्नता सूची मॉडल का उपयोग करके लुकअप को बहुत तेजी से (विशेष रूप से सभी बच्चों को नोड में प्राप्त करने के लिए) बना सकते हैं, लेकिन पेड़ के अपडेट धीमे होते हैं।

+0

धन्यवाद मैं इसे देख लूंगा। संघ फिर रिकर्सिव के बाद और अधिक कुशल है? मैंने सुना है कि mssql 2005 के पेड़ से निपटने का एक नया तरीका है, क्या आप जानते हैं कि यह बड़े डीबी के साथ अच्छा काम करता है? – SirMoreno

+0

यूनियन सभी एक सीटीई के भीतर रिकर्सिव है, हालांकि मुझे यकीन नहीं है कि SQL सर्वर दृश्यों के पीछे इसे कैसे संभालता है या यदि इसमें प्रदर्शन में बदलाव होता है। प्रदर्शन के बारे में निश्चित रूप से कहने के लिए मैंने सीटीई के साथ पर्याप्त बड़े पैमाने पर परीक्षण नहीं किया है। –

3

आपको खुद को ये प्रश्न पहले पूछना होगा: 1) संशोधन बनाम पाठ का अनुपात क्या है? (= ज्यादातर स्थिर पेड़ या लगातार बदल रहे हैं?) 2) पेड़ कितनी गहरी और कितनी बड़ी उम्मीद है?

नेस्टेड सेट ज्यादातर स्थैतिक पेड़ों के लिए बहुत अच्छे हैं जहां आपको पूरी शाखाओं पर संचालन की आवश्यकता होती है। यह बिना किसी समस्या के गहरे पेड़ों को संभालता है।

भौतिक मार्ग गतिशील/अनुमानित गहराई वाले गतिशील (बदलते) पेड़ों के लिए अच्छी तरह से काम करता है।

रिकर्सिव सीटीई बहुत छोटे पेड़ों के लिए आदर्श हैं, लेकिन शाखा संचालन ("इस शाखा में सभी बच्चों को प्राप्त करें ..") गहरे/बड़े पेड़ के साथ बहुत महंगा हो जाते हैं।

http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

+1

मेरा पेड़ बहुत गतिशील है, कई अपडेट हैं लेकिन कई भी चुनते हैं। और मैं 10-15 के स्तर के रूप में गहराई से प्राप्त करने में सक्षम होना चाहता हूं। मुझे इस आलेख को नेस्टेड सेट के बारे में मिला: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/swinging-from-tree-to-tree-using-ctes-part-1-adjacency -to-nested-sets.aspx क्या इस आलेख में वर्णित जैसा नेस्टेड सेट मेरा सबसे अच्छा विकल्प होगा? धन्यवाद। – SirMoreno

1

आप कई अद्यतन और चयन किया है, तो सबसे अच्छा विकल्प पथ गणन मॉडल है, जो संक्षेप में यहाँ वर्णित है प्रतीत हो रहा है । पढ़ने के लिए बहुत ही कुशल और लिखने के लिए बहुत आसान है।

0

मैं हैरान हूँ कि कोई भी उल्लेख किया है एक Closure Table के साथ जा रहा: