2012-05-24 4 views
15

मेरे पास विदेशी कुंजी के साथ बहुत सी टेबल हैं और कुछ में इंडेक्स है जबकि अन्य नहीं हैं। सभी विदेशी कुंजियों को FK_<name of the foreign key> नामित इंडेक्स के साथ IX_<name of the foreign key> नाम दिया गया है।एसक्यूएल सर्वर: जहां आवश्यक हो वहां विदेशी कुंजी पर इंडेक्स बनाएं

क्या इंडेक्स बनाने (या नहीं) बनाने के लिए विदेशी कुंजी के कॉलम कार्डिनिटी को देखते हुए कुछ अच्छे अभ्यास हैं? क्या इसे टी-एसक्यूएल कमांड के रूप में स्क्रिप्ट किया जा सकता है?

+0

मैं आपको अपने प्रश्न को स्पष्ट करने के लिए, डैरेन के जवाब में इस अवलोकन को देखने की जरूरत है (मैं छोटे टेबल पर अनुक्रमित जोड़ने के लिए नहीं करते): * "आपका प्रश्न एक छोटे से अस्पष्ट है , तो मैं अनिश्चित हूं अगर आप भी अगर यह सूचकांक विदेशी कुंजी के सभी के लिए ठीक है पूछ रहे हैं "* – Kev

उत्तर

32

इससे कोई फर्क नहीं पड़ता कि वे टी-एसक्यूएल स्क्रिप्ट या डिजाइनर के माध्यम से बनाए गए हैं या नहीं। आपका प्रश्न थोड़ा संदिग्ध है, इसलिए मुझे यकीन नहीं है कि आप यह भी पूछ रहे हैं कि क्या सभी विदेशी कुंजीों को इंडेक्स करना ठीक है या नहीं। हालांकि, अगर आप कर रहे हैं, अनुक्रमित कॉलम कि प्रश्नों में अक्सर संदर्भित पर बनाया जाना चाहिए और आप के प्रदर्शन में सुधार करने के लिए निम्न कर सकते हैं:

  • डेटाबेस ट्यूनिंग विज़ार्ड जो सुधार का एक सारांश की आपूर्ति और अनुक्रमित की सिफारिश करेंगे भागो ।

  • सभी विदेशी कुंजी इंडेक्स और निष्पादन योजना चलाएं (यह देखने के लिए कि प्रश्न तेजी से या धीमे प्रदर्शन कर रहे हैं)।

T-SQL के माध्यम से एक सूचकांक बनाने के लिए: सभी विदेशी कुंजी आप कर सकते थे भर में अनुक्रमित लागू होने वाला एक स्क्रिप्ट उत्पन्न करने के लिए

SELECT f.name AS ForeignKey, 
OBJECT_NAME(f.parent_object_id) AS TableName, 
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id 

:

CREATE INDEX IX_INDEX_NAME 
ON Table (FieldName); 

सभी विदेशी कुंजी की एक सूची प्राप्त करने के लिए ऐसा करें:

SELECT 'CREATE INDEX [IX_' + f.name + '] ON ' + OBJECT_NAME(f.parent_object_id) + '(' + COL_NAME(fc.parent_object_id, fc.parent_column_id) + ')]' 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id 

http://msdn.microsoft.com/en-us/library/ms188783.aspx

+0

मैं सवाल स्पष्ट किया, मैं इस का उपयोग करते हुए टी SQL स्क्रिप्ट – psadac

+0

@psadac क्या करना चाहते हैं -। मेरी पोस्ट अपडेट किया गया। एक निश्चित प्रमुखता के साथ सिर्फ विदेशी कुंजी के बारे में क्या - –

+0

'सभी विदेशी keys' भर में अनुक्रमित लागू होने वाला एक स्क्रिप्ट उत्पन्न करने के लिए? –

0

बढ़िया काम हर किसी को, बहुत उपयोगी।

एक वृद्धि जोड़ना जिसमें तालिका स्कीमा शामिल है। यदि आप चाहें तो आप भी FK नाम बाहर कर सकते हैं

SELECT 
    * 
FROM 
(
    SELECT TOP 99 PERCENT 
      f.name AS ForeignKeyName 

     , s.name 
       + '.' 
       + OBJECT_NAME(f.parent_object_id) 
       + '.' 
       + COL_NAME(fc.parent_object_id, fc.parent_column_id) 
      ParentTable 

     , referencedSchema.name 
       + '.' 
       + OBJECT_NAME (f.referenced_object_id) 
       + '.' 
       + COL_NAME(fc.referenced_object_id, fc.referenced_column_id) 
      ReferencedTable 

     , 'CREATE INDEX [IX_' + f.name + ']' 
       + ' ON ' 
        + '[' + referencedSchema.name + ']' 
        + '.' 
        + '[' + OBJECT_NAME(f.parent_object_id) + ']' 
        + '(' 
         + COL_NAME(fc.parent_object_id, fc.parent_column_id) 
        + ')' 
      CreateIndexSql   

    FROM 
     sys.foreign_keys AS f 
     INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id 
     inner join sys.schemas s on f.schema_id = s.schema_id 

     inner join sys.tables referencedTable on f.referenced_object_id = referencedTable.object_id 
     inner join sys.schemas referencedSchema on referencedTable.schema_id = referencedSchema.schema_id 

    ORDER BY 
     2, 3, 1 
) a 
where a.ParentTable not in (
    -- Add any exclusions here so you can forget about them 
     '' 
) 
संबंधित मुद्दे