অব্যবহৃত সঞ্চিত পদ্ধতি সনাক্তকরণ


24

এই পরের বছর, আমি বেশ কয়েকটি এসকিউএল সার্ভার পরিবেশ পরিষ্কার করার একটি প্রচেষ্টাতে সহায়তা করছি।

আমাদের প্রায় 10,000 টি সঞ্চিত প্রক্রিয়া রয়েছে এবং অনুমান করা যায় যে এর মধ্যে প্রায় 1000 টি নিয়মিত ভিত্তিতে ব্যবহৃত হয় এবং অন্য 200 বা ততোধিক ঘটনা বিরল উপলক্ষে ব্যবহৃত হয়, যার অর্থ আমাদের অনেক কাজ করতে হবে।

যেহেতু আমাদের একাধিক বিভাগ এবং দল রয়েছে যা এই ডাটাবেসগুলি এবং পদ্ধতিগুলি অ্যাক্সেস করতে পারে, তাই আমরা সবসময় প্রক্রিয়াগুলিকে কল করি না, এর অর্থ হ'ল আমাদের অবশ্যই নির্ধারণ করা উচিত যে কোন পদ্ধতিগুলি বলা হচ্ছে। সর্বোপরি, আমরা এটি কয়েক মাসের মধ্যেই নির্ধারণ করতে চাই, কিছু দিনের মধ্যে নয় (যা কিছু সম্ভাবনা দূর করে)।

এর একটি পদ্ধতির মধ্যে রয়েছে SQL Server Profilerএবং কী কী পদ্ধতিগুলি বলা হচ্ছে তা ট্র্যাক করা এবং আমাদের কী পদ্ধতি ব্যবহার করা হয় তার তালিকার সাথে তাদের তুলনা করা, যখন পদ্ধতিগুলি ব্যবহৃত হয় কিনা তা চিহ্নিত করে। তারপরে, কোনও বিভাগ যদি চিৎকার করে আসে তবে আমরা প্রক্রিয়াগুলি একটি অন্য স্কিমাতে স্থানান্তর করতে পারি।

Profilerএখানে সবচেয়ে কার্যকর পদ্ধতির ব্যবহার করা হচ্ছে ? এবং / অথবা আপনি কি এরকম কিছু করেছেন এবং এটি করার জন্য অন্য কোনও উপায় / আরও ভাল উপায় খুঁজে পেয়েছেন?

উত্তর:


32

আপনি আপনার পরীক্ষার সময় বা আপনার ব্যবসায়িক চক্র চলাকালীন সার্ভার সাইড ট্রেস (প্রোফাইলার জিইউআই যা আরও বেশি সংস্থান সংস্থান ব্যবহার করে পৃথক) ব্যবহার করতে পারেন এবং কেবল এসপির সাথে সম্পর্কিত স্টাফ ক্যাপচার করতে পারেন। তারপরে আপনি সেটি কোনও টেবিলে লোড করতে পারেন বা আরও বিশ্লেষণের জন্য এক্সেল করতে পারেন।

দ্বিতীয় পন্থাটি হ'ল ডিএমভি sys.dm_exec_procedure_stats (সীমাবদ্ধতার সাথে যে যদি এসকিএল সার্ভার পুনরায় চালু করা হয় তবে ডেটা ফ্লাশ করা হয়)।

এমনকি ডিএমভি ডেটা অবিরত রাখতে একটি টেবিলের কাছে ক্যাপচারের জন্য আপনি কোনও কাজের সময় নির্ধারণ করতে পারেন।

 -- Get list of possibly unused SPs (SQL 2008 only)
    SELECT p.name AS 'SP Name'        -- Get list of all SPs in the current database
    FROM sys.procedures AS p
    WHERE p.is_ms_shipped = 0

    EXCEPT

    SELECT p.name AS 'SP Name'        -- Get list of all SPs from the current database 
    FROM sys.procedures AS p          -- that are in the procedure cache
    INNER JOIN sys.dm_exec_procedure_stats AS qs
    ON p.object_id = qs.object_id
    WHERE p.is_ms_shipped = 0;

নির্দেশ করে :


1
এছাড়াও স্ট্যাকওভারফ্লো / সিকিউরিটিস / এমটিশনস ১০৪১২৪৩৩৯/২ এবং স্ট্যাকওভারফ্লো. com/ প্রশ্নগুলি / 50১50০৯০০/২ দেখুন (উপেক্ষা করুন যে এসকিউএল সার্ভারপিডিয়ায় লিঙ্কটি এখন মারা গেছে)।
অ্যারন বারট্র্যান্ড

2
নিশ্চিত হয়ে নিন যে আপনি সপ্তাহে বা এমনকি কয়েক মাসের মধ্যে ডিএমভি পর্যায়ক্রমে চেক করেন কারণ এমন এসপি থাকতে পারে যা কেবলমাত্র মাসিক বা এমনকি ত্রৈমাসিক ভিত্তিতে চালিত হয়। উদাহরণটি পুনঃসূচনা করার পরে, ম্যানুয়ালি পরিষ্কার করা হয়েছে বা এমনকি সময়ের সাথে সাথে ডিএমভিগুলি সাফ হয়ে যায়।
কেনেথ ফিশার

1
@ কেনেথফিশার আমাকে কেন একটি টেবিলে ডিএমভি ডেটা ক্যাপচারের জন্য কোনও কাজের সময় নির্ধারণের পরামর্শ দিয়েছিল তা ঠিক। যদিও উল্লেখ করার জন্য ধন্যবাদ!
কিন শাহ

11

আপনি এই প্রশ্নটি দরকারী খুঁজে পেতে পারেন , এটি টেবিল এবং কলামগুলিতে প্রযোজ্য তবে একটি তৃতীয় পক্ষের সরঞ্জাম অ্যাপেক্সএসকিউএল ক্লিন ব্যবহার করার পরামর্শ দেয় যা অব্যবহৃত স্টোরেজ পদ্ধতিগুলি এবং সেইসাথে সমস্ত বস্তুগুলি খুঁজে পেতে পারে যা ডেটাবেজে বা বাইরের ডাটাবেসে অন্য কোনও অবজেক্ট দ্বারা রেফারেন্স হয় না find

দাবি অস্বীকার: আমি সাপোর্ট ইঞ্জিনিয়ার হিসাবে অ্যাপেক্সএসকিউএলের পক্ষে কাজ করি


3
ওপি সন্ধান করতে চায় না unreferenced stored procedures, পরিবর্তে ওপি অব্যবহৃত এসপি খুঁজে পেতে চায়। আপনার উত্তর এই প্রশ্নের উত্তর হিসাবে পরিবেশন করে না।
কিন শাহ

খুন আমি আপডেট করব। অ্যাপেক্সএসকিউএল ক্লিন অব্যবহৃত অবজেক্টগুলিকে অবাস্তব হিসাবে চিহ্নিত করেছে তাই আমি বুঝতে পারি যে এই বিভ্রান্তির সৃষ্টি করেছে
মিলিকা মেডিকেল

10

আপনি যদি এসকিউএল সার্ভার ২০০৮+ তে থাকেন তবে আপনি হিস্টোগ্রাম লক্ষ্য সহ বর্ধিত ইভেন্টগুলিও ব্যবহার করতে পারেন । সম্ভবত এটি কোনও ট্রেসের চেয়ে হালকা ওজন বেশি হবে।

আফাইক আপনার আগ্রহের প্রতিটি ডাটাবেসের জন্য আলাদা আলাদা অধিবেশন তৈরি করতে হবে যদিও আমি একাধিক কলামে বুক চাপানো সম্ভব বলে কোনও ইঙ্গিত দেখতে পাইনি। ফিল্টার নীচে দ্রুত উদাহরণdatabase_id=10

CREATE EVENT SESSION [count_module_start_database_10]
ON SERVER
ADD EVENT sqlserver.module_start
(  
        WHERE (source_database_id=10) 
)
ADD TARGET package0.asynchronous_bucketizer
(     SET  filtering_event_name='sqlserver.module_start', 
            source_type=0, 
            source='object_id',
            slots = 10000
)
WITH (MAX_DISPATCH_LATENCY = 5 SECONDS)
GO
ALTER EVENT SESSION [count_module_start_database_10]
ON SERVER
STATE=START

এবং তারপরে সেই ডিবিতে কয়েকটি সঞ্চিত প্রক্রিয়া কয়েকবার চালিয়ে যাওয়ার পরে এবং এর সাথে ডেটা পুনরুদ্ধার করে

SELECT CAST(target_data as XML) target_data
FROM sys.dm_xe_sessions AS s 
JOIN sys.dm_xe_session_targets t
    ON s.address = t.event_session_address
WHERE s.name = 'count_module_start_database_10'

আউটপুট হয়

<HistogramTarget truncated="0" buckets="16384">
  <Slot count="36">
    <value>1287675635</value>
  </Slot>
  <Slot count="3">
    <value>1271675578</value>
  </Slot>
  <Slot count="2">
    <value>1255675521</value>
  </Slot>
</HistogramTarget>

দেখানো যে সঙ্গে কার্যপ্রণালী object_idএর 1287675635উদাহরণস্বরূপ 36 বার মৃত্যুদন্ড কার্যকর করা হয়। asynchronous_bucketizerতাই এটি সেরা হতে যে নির্বাচনে এই মাঝে মাঝে কিছু সেট আপ করার এবং ক্রমাগত স্টোরেজে সংরক্ষণ করে হবে শুধুমাত্র স্মৃতি।


1
এটি সত্য, আপনার ডাটাবেস প্রতি একটি সেশন প্রয়োজন। বললে দুর্দান্ত লাগবে WHERE (source_database_id IN (10,15,20))তবে হায়রে এটি সমর্থিত নয়।
অ্যারন বারট্র্যান্ড

@ অ্যারোনবার্ট্র্যান্ড - এবং এটি সমর্থিত হলেও আপনাকে আলাদা আলাদা ডাটাবেসে একই object_id(বা একই object_name) সমেত বস্তুর জন্য পৃথক পৃথক পদ্ধতি গণনা করতে হবে এবং আমি সম্ভবত এটি সম্ভব বলেও মনে করি না।
মার্টিন স্মিথ

আমি ভুল হলে আমাকে সংশোধন করে তবে extended events২০০২ সালে কোথায় যোগ করা হয়নি?
পিটার

1
@ পিটার হ্যাঁ আপনি ভুল করছেন :-) টেকনেট.মাইক্রোসফট.টেন-us
মার্টিন স্মিথ

1
এসএসএমএস ২০১২ অবধি বর্ধিত ইভেন্ট ইউআই চালু করা হয়নি এবং আমি মনে করি না তারা এটিকে পিছনের দিকে সামঞ্জস্যপূর্ণ করেছে। ২০০৮-এ বাক্সটি সেশন তৈরির একমাত্র উপায় ছিল টিএসকিউএল এর মাধ্যমে যদিও একই রকম কার্যকারিতার জন্য সম্প্রদায়ের প্রকল্প ছিল এক্সটেন্ডেন্টেন্টেঞ্জারকোডেপ্লেক্স.কম
মার্টিন স্মিথ

4

কিন এর স্ক্রিপ্ট অনুসরণ করুন। সময়ের সাথে সাথে ব্যবহারগুলি এবং সময় সময় এটি আপডেট করার জন্য কোনও স্ক্রিপ্ট ট্র্যাক করার জন্য একটি সারণী তৈরি করার জন্য এখানে একটি সাধারণ স্ক্রিপ্ট is

--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--  Create the use table 
--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE TABLE [dbo].[_ProcedureUseLog](
    [ObjectName] [nvarchar](255) NOT NULL,
    [UseCount] [int] NULL,
    [LastUse] [datetime] NULL,
    [LastCache] [datetime] NULL,
 CONSTRAINT [PK___PROCEDURE_USE] PRIMARY KEY CLUSTERED 
(
    [ObjectName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[_ProcedureUseLog] ADD  CONSTRAINT [DF_Table_1_References]  DEFAULT ((0)) FOR [UseCount]
GO

--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--  Run this periodically to update the usage stats
--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DECLARE @UsesTable TABLE
(
    ObjectName nvarchar(255),
    Executions int,
    LastUse datetime,
    LastCache datetime
)

INSERT INTO @UsesTable       
SELECT p.name, qs.execution_count, qs.last_execution_time, qs.cached_time
FROM    sys.procedures AS p LEFT OUTER JOIN
        sys.dm_exec_procedure_stats AS qs ON p.object_id = qs.object_id
WHERE        (p.is_ms_shipped = 0)

MERGE [dbo].[_ProcedureUseLog]      AS [Target]
USING @UsesTable                    AS [Source]
    ON Target.ObjectName = Source.ObjectName
WHEN MATCHED AND 
        ( Target.LastCache <> Source.LastCache)
    THEN UPDATE SET
        Target.UseCount = Target.UseCount + Source.Executions,
        Target.LastCache = Source.LastCache,
        Target.LastUse = Source.LastUse
WHEN NOT MATCHED
    THEN INSERT (ObjectName, UseCount, LastUse, LastCache) 
    VALUES      (ObjectName, Executions, LastUse, LastCache);

--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--  This just shows what you've logged so far
--  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SELECT * FROM [_ProcedureUseLog] ORDER BY UseCount DESC

0

এই পোস্টটি অব্যবহৃত অবজেক্টগুলি সন্ধানের জন্য একটি স্ক্রিপ্টও সরবরাহ করে: এসকিউএল সার্ভারে অব্যবহৃত ডাটাবেস সারণিগুলি অনুসন্ধান করুন নীচের নিবন্ধ থেকে স্ক্রিপ্টটি আছে, আমি সারণী প্রকার "ইউ" কে সঞ্চিত পদ্ধতি টাইপ "পি" তে পরিবর্তন করেছি:

   USE DBName;
   SELECT 

       ao.[name] [Table],
       s.[name] [Schema],
       [create_date] [Created],
        [modify_date] [LastModified]
    FROM
         sys.all_objects ao JOIN sys.schemas s
           ON ao.schema_id = s.schema_id
    WHERE
         OBJECT_ID NOT IN (
              SELECT OBJECT_ID
              FROM sys.dm_db_index_usage_stats
        )
        AND [type] = 'P'
    ORDER BY
        [modify_date] DESC

সূচি ব্যবহারের পরিসংখ্যান ডিএমভি-তে পদ্ধতিতে প্রবেশপত্রগুলি না পাওয়ায় এটি সর্বদা সমস্ত পদ্ধতি ফিরিয়ে দেবে ...
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.