2009-01-02 9 views
8

कैसे कहते हैं कि आपको एमएस एसक्यूएल 2000 या 2005 डेटाबेस विरासत मिला है, और आप जानते हैं कि कुछ टेबल्स, व्यू, प्रोसेस और फ़ंक्शंस वास्तव में अंतिम उत्पाद में उपयोग नहीं किया जाता है।एमएसएसक्यूएल डाटाबेस क्लीनअप - आप अप्रयुक्त वस्तुओं (टेबल्स, व्यू, प्रोसेस, फंक्शंस)

क्या कोई आंतरिक लॉगिंग या कोई अन्य तंत्र है जो मुझे बता सकता है कि कौन सी वस्तुओं को नहीं कहा जा रहा है? या केवल हजारों बार बनाम कुछ बार कहा जाता है।

उत्तर

4

जवाब कैसे डेटाबेस एक साथ डाल दिया गया है पर एक छोटे से निर्भर करेगा, लेकिन एक ऐसी ही समस्या के लिए मेरे दृष्टिकोण 3 गुना था:

चित्रा बाहर जो वस्तुओं कोई आंतरिक निर्भरता है। आप इस तरह के रूप में sysdepends के खिलाफ क्वेरी से बाहर यह काम कर सकते हैं:

select 
    id, 
    name 
from 
    sys.sysdepends sd 
inner join sys.sysobjects so 
    on so.id = sd.id 
where 
    not exists (
     select 
      1 
     from 
      sysdepends sd2 
     where 
      sd2.depid = so.id 
    ) 

आप वस्तु (sysobjects.xtype) के प्रकार के इकट्ठा करने के साथ इस गठबंधन करना चाहिए के रूप में आप केवल मेज, काम करता है, संग्रहीत procs अलग करने के लिए चाहता हूँ और देखा गया। "Sp_" शुरू करने वाली किसी भी प्रक्रिया को अनदेखा करें, जब तक कि लोग आपके आवेदन के लिए उन नामों के साथ प्रक्रियाएं नहीं बना रहे हों!

लौटाई गई कई प्रक्रियाएं आपके आवेदन के प्रवेश बिंदु हो सकती हैं। यह उन प्रक्रियाओं को कहना है जिन्हें आपकी एप्लिकेशन परत से या किसी अन्य दूरस्थ कॉल से कहा जाता है और उनके पास कोई ऑब्जेक्ट नहीं है जो डेटाबेस के भीतर उन पर निर्भर करता है।

मान लीजिए कि प्रक्रिया बहुत आक्रामक नहीं होगी (हालांकि यह कुछ अतिरिक्त भार नहीं बनाएगा, हालांकि बहुत अधिक नहीं है) अब आप एसपी की कुछ प्रोफाइलिंग चालू कर सकते हैं: प्रारंभ, एसक्यूएल: बैचस्टार्टिंग और/या एसपी: StmtStarting ईवेंट। जब तक आप फिट दिखाई देते हैं, तब तक इसे चलाएं, आदर्श क्रॉस रेफरेंसिंग के लिए आदर्श रूप से एक एसक्यूएल तालिका में लॉग इन करना। आपको कई प्रक्रियाओं को खत्म करने में सक्षम होना चाहिए जिन्हें सीधे आपके आवेदन से बुलाया जाता है।

इस लॉग से टेक्स्ट डेटा को संदर्भित करने और आपकी आश्रित वस्तु सूची को संदर्भित करके आप उम्मीद करेंगे कि अप्रयुक्त प्रक्रियाओं में से अधिकांश को अलग कर दिया जाएगा।

अंत में, आप इस प्रक्रिया के परिणामस्वरूप अपनी उम्मीदवार सूची लेना चाहेंगे और उनके खिलाफ अपने स्रोत कोड को grep कर सकते हैं। यह एक बोझिल काम है और सिर्फ इसलिए कि आपको अपने कोड में संदर्भ मिलते हैं इसका मतलब यह नहीं है कि आपको उनकी आवश्यकता है! यह बस हो सकता है कि कोड को हटाया नहीं गया है, हालांकि यह अब तर्कसंगत रूप से पहुंच योग्य नहीं है।

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

चेतावनी:

जहां तक ​​मुझे पता है कर रहा हूँ, वहाँ इस के लिए एक आदर्श जवाब नहीं है क्योंकि, टेबल को दूर करने के लिए विशेष रूप से सावधान रहना। कुछ गलत होने पर प्रक्रियाओं, कार्यों और विचारों को आसानी से बदला जा सकता है (हालांकि सुनिश्चित करें कि आप उन्हें जलने से पहले स्रोत नियंत्रण में रखते हैं!)। यदि आप वास्तव में परेशान महसूस कर रहे हैं क्यों तालिका का नाम नहीं बदलते हैं और पुराने नाम के साथ एक दृश्य बनाते हैं, तो आपको एक आसान आउट मिल गया है।

+0

sysdepends अविश्वसनीय – gbn

3

हम निम्नलिखित क्वेरी का उपयोग कर अप्रयुक्त कॉलम और तालिका भी पा सकते हैं। मैं कर्सर लिखने के लिए थक गया।कर्सर आपको प्रत्येक तालिका में प्रत्येक कॉलम के बारे में जानकारी देगा।

declare @name varchar(200), @id bigint, @columnname varchar(500) 
declare @temptable table 
(
table_name varchar(500), 
Status bit 
) 
declare @temp_column_name table 
(
table_name varchar(500), 
column_name varchar(500), 
Status bit 
) 


declare find_table_dependency cursor for 
select name, id from sysobjects where xtype ='U' 
open find_table_dependency 
fetch find_table_dependency into @name, @id 
while @@fetch_Status = 0 
begin 

if exists(select top 1 name from sysobjects where id in 
    (select id from syscomments where text like '%'[email protected] +'%')) 
    insert into @temptable 
    select @name, 1 
else 
    insert into @temptable 
    select @name, 0 

declare find_column_dependency cursor for 
    select name from syscolumns where id = @id 
open find_column_dependency 
fetch find_column_dependency into @columnname 
while @@fetch_Status = 0 
begin 

    if exists(select top 1 name from sysobjects where id in 
    (select id from syscomments where text like '%'[email protected] +'%')) 
    insert into @temp_column_name 
    select @name,@columnname, 1 
    else 
    insert into @temp_column_name 
    select @name,@columnname, 0 

    fetch find_column_dependency into @columnname 
end 
close find_column_dependency 
deallocate find_column_dependency 


fetch find_table_dependency into @name, @id 
end 
close find_table_dependency 
deallocate find_table_dependency 

select * from @temptable 
select * from @temp_column_name 
+0

धन्यवाद, एक आकर्षण की तरह काम किया :) – leppie

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