2010-02-22 12 views
7

SQL सर्वर में foreign key does not automatically create an index के रूप में देखकर, मैं अपने डेटाबेस में प्रत्येक FK फ़ील्ड पर एक स्पष्ट अनुक्रमणिका बनाना चाहता हूं। और मेरे पास स्कीमा में 100 से अधिक टेबल हैं ...प्रत्येक विदेशी कुंजी पर एक इंडेक्स जोड़ने के लिए स्क्रिप्ट?

तो, क्या किसी के पास एक तैयार पैकेज स्क्रिप्ट है जिसे मैं सभी एफके का पता लगाने और प्रत्येक पर एक इंडेक्स बनाने के लिए उपयोग कर सकता हूं?

+1

हे, मैंने सप्ताहांत में एक किया और मैंने इसे छोड़ दिया। इसे मेरे नामकरण सम्मेलन में अनुकूलित किया गया था, इसलिए मैंने बहुत सी स्ट्रिंग मैनिपुलेशन किया और sys.foreign_keys से schema_name (schema_id) और object_name (parent_object_id) के साथ चुना। –

उत्तर

7

ठीक है, मैं इस बाहर अपने आप को काम किया - यहाँ यह हर किसी के लाभ के लिए है ...

select 'create index IX_'+c.name+'_'+p.name+' on '+c.name+'('+cf.name+');' 
from sysforeignkeys fk join sysobjects c on fk.fkeyid=c.id 
join sysobjects p on fk.rkeyid=p.id 
join syscolumns cf on c.id=cf.id and cf.colid = fk.fkey 
left join sysindexkeys k on k.id = cf.id and k.colid = cf.colid 
where k.id is null 
order by c.name 

यह अगर आप एक ही करने के लिए एक मेज पर दो FKS है के रूप में 100% काम नहीं करता है, प्राथमिक तालिका, लेकिन इसके कुछ पर्याप्त उदाहरण हैं (कम से कम मेरे डीबी में) कि मैं इन्हें हाथ से सही ढंग से सही कर सकता हूं।

3

मैंने सिस्टम दृश्यों का उपयोग करने के लिए क्वेरी को संशोधित किया। यह तालिका में प्रत्येक एफके को सिर्फ एक ही स्क्रिप्ट नहीं करेगा।

SELECT 'CREATE NONCLUSTERED INDEX ndx_' + o.name + '__' + c.name 
    + ' ON ' + o.name + ' (' + c.name + ')' 
FROM sys.foreign_keys  fk 
JOIN sys.objects    o ON fk.parent_object_id = o.object_id 
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
JOIN sys.columns    c ON fkc.parent_object_id = c.object_id 
           AND fkc.parent_column_id = c.column_id 
ORDER BY o.name 
+0

यह अच्छा है, मैं नाम के चारों ओर स्क्वायर ब्रैकेट जोड़ दूंगा, अगर किसी ने कॉलम उपयोगकर्ता नाम दिया हो (बस मेरे साथ हुआ)। – vercelli

6

ठीक है, यहां पर मेरा लेना है। मैंने योजनाओं के लिए समर्थन जोड़ा और यह भी जांचें कि मौजूदा नामकरण सम्मेलन के साथ कोई सूचकांक मौजूद है या नहीं। इस तरह जब आप अपनी टेबल को संशोधित करते हैं तो आप लापता इंडेक्स की जांच कर सकते हैं।

SELECT 'CREATE NONCLUSTERED INDEX IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME + ' ON ' + s.NAME + '.' + o.NAME + ' (' + c.NAME + ')' 
    FROM sys.foreign_keys fk 
    INNER JOIN sys.objects o ON fk.parent_object_id = o.object_id 
    INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
    INNER JOIN sys.columns c ON fkc.parent_object_id = c.object_id 
     AND fkc.parent_column_id = c.column_id 
    INNER JOIN sys.tables t ON t.object_id = o.object_id 
    INNER JOIN sys.schemas s ON s.schema_id = t.schema_id 
    LEFT JOIN sys.indexes i ON i.NAME = ('IX_' + s.NAME + '_' + o.NAME + '__' + c.NAME) 
    WHERE i.NAME IS NULL 
    ORDER BY o.NAME 
+0

यह बहुत अच्छा है, पोस्ट करने के लिए धन्यवाद। – udog

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