এসকিউএল সার্ভারে পরিসংখ্যানগুলি শারীরিকভাবে কোথায় সংরক্ষণ করা হয়?


27

কোয়েরি অপ্টিমাইজারের দ্বারা ব্যবহৃত কোনও পরিসংখ্যান শারীরিকভাবে কোনও এসকিউএল সার্ভার ডাটাবেস ফাইল এবং বাফার পুলের মধ্যে সংরক্ষণ করা হয়?

আরও সুনির্দিষ্টভাবে, ডিএমভি এবং / অথবা ডিবিসিসি ব্যবহার করে পরিসংখ্যান দ্বারা ব্যবহৃত পৃষ্ঠাগুলি বের করার কোনও উপায় আছে?

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


1
আপনি যখন একটি পরিসংখ্যান তৈরি করেন তখন কেবলমাত্র ডাটাবেসের অনুলিপিটি বাইনারি দেখায় STATS_STREAMআমি কখনই এটি ফাইলে খুঁজে পাওয়ার যোগ্য কিছু কিনা তা সন্ধান করিনি।
মার্টিন স্মিথ

2
পরিসংখ্যানগুলি কেবলমাত্র একটি অভ্যন্তরীণ সামগ্রিক ফাংশন ( StatMan) দ্বারা তৈরি করা হয় যা একটি ব্লবকে আউটপুট করে (হাস্যকরভাবে, সেই নামটি একটি এসএসএমএস ক্যোয়ারী উইন্ডোতে ফাংশন হিসাবে হাইলাইট করা হয়)। যৌক্তিকভাবে, পরিসংখ্যানগুলি কোনও সূচক বা টেবিল কলামগুলির একটি সেটের সাথে যুক্ত, তাই আমি অভ্যন্তরীণ মেটাডেটা টেবিলগুলি পরীক্ষা করে শুরু করব যাতে কোনও কলাম binaryবা সারণী সন্ধান varbinaryকরবে যা ব্লব করতে পারে। এটি ব্যবহারযোগ্যভাবে দেখতে পারা উচিত DBCC PAGE, তবে সম্ভবত অন্য কোনও উপায়ে নয় কারণ এটি সমস্ত অভ্যন্তরীণ।
জন সেগেল

1
@ivanmp আমি আপনার প্রশ্নটি স্পষ্টতার জন্য সম্পাদনা করেছি যেহেতু আরও কিছু নবাগত ডিবিএর অনেকেই জানেন না যে বিপি বা কিউও কী।
ম্যাক্স ভার্নন

2
হতে ব্যবহৃত sysindexes.statblobকিন্তু 2005 সাল থেকে যে আয় NULLএবং অবস্থান সম্পূর্ণরূপে অনথিভুক্ত করা হয়, শুধুমাত্র পুনরুদ্ধার (যে আমি জানি) মাধ্যমে DBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
অ্যারন বারট্র্যান্ড

1
সূচকের পরিসংখ্যানগুলি পাওয়া গেছে - তারা এতে রয়েছে sys.sysidxstats- দেখে মনে হচ্ছে যে সেই টেবিলে একটি এলওবি পয়েন্টার রয়েছে। কলামের পরিসংখ্যান এখনও কোথায় আছে তা আমি নিশ্চিত নই; তারা সেই টেবিলে থাকতে পারে পাশাপাশি একটি typeকলামও থাকতে পারে।
জন সেগেল

উত্তর:


30

তাদের খুঁজে পাওয়া যায়.

  1. একটি সহজ পরিসংখ্যান অবজেক্ট সহ একটি টেবিল তৈরি করুন।

    CREATE DATABASE splunge;
    GO
    USE splunge;
    GO
    CREATE TABLE dbo.foo(bar INT, munge INT);
    GO
    CREATE STATISTICS x ON dbo.foo(bar);
    CREATE STATISTICS y ON dbo.foo(munge);
    GO
    INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
      FROM sys.objects AS s1
      CROSS JOIN sys.objects AS s2;
    GO
    UPDATE STATISTICS dbo.foo;
    GO
  2. ড্যাক ( ADMIN:Server[\instance]) ব্যবহার করে সংযুক্ত করুন ।

  3. নিম্নলিখিত প্রশ্নগুলি চালান:

    DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
    DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
    
    SELECT name, imageval 
      FROM sys.stats AS s
      INNER JOIN sys.sysobjvalues AS o
      ON s.object_id = o.objid
      AND s.stats_id = o.subobjid
    WHERE 
      s.object_id = OBJECT_ID('dbo.foo');

আপনি লক্ষ করবেন যে imagevalপ্রতিটি পরিসংখ্যানের জন্য স্ট্যাটাস ব্লবের মতো নয়, তবে এতে স্ট্যাটাস ব্লব রয়েছে - এটি কেবল অফসেট। আমার সিস্টেমে এটি এক্স এর জন্য পেয়েছে (আমি স্পষ্টতই বিটগুলি মোটামুটি ছাঁটাই করেছি):

0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
                            0x07000000C4E1BE00EEA0...rest the same

এবং এটি আপনার জন্য:

0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
                            0x07000000C7E1BE00EEA0...rest the same

সূচক ভিত্তিক পরিসংখ্যানগুলির ক্ষেত্রেও এটি একই ছিল।

আপনি সম্ভবত DBCCকমান্ড ব্যবহার করে ক্রিয়াকলাপের সিরিজ দিয়ে এর আরও বৈধতা যাচাই করতে পারেন । প্রথমত, যে পৃষ্ঠাগুলি ক্লাস্টারড ইনডেক্সের সাথে জড়িত রয়েছে তা সন্ধান করুন sys.sysobjvalues(আপনার ডাটাবেসের নামটি প্রতিস্থাপন করুন):

DBCC IND('splunge', 'sys.sysobjvalues', 1);

ফলাফল পৃষ্ঠাগুলির একটি গোছা তালিকাবদ্ধ করবে, আপনি যেগুলির মধ্যে আগ্রহী PageType = 1। একটি নতুন ডাটাবেস সহ, আপনি সর্বাধিক PagePIDমান সহ কোনও পৃষ্ঠায় এই তথ্যটি সন্ধান করতে সক্ষম হবেন । উদাহরণস্বরূপ, আমার সিস্টেমে এই পৃষ্ঠাটি ছিল 281, সুতরাং আমি সেই পৃষ্ঠাটির কাছাকাছি তাকালাম:

DBCC TRACEON(3604);

DECLARE @dbid INT = DB_ID();

DBCC PAGE(@dbid, 1, 281, 3);

DBCC TRACEOFF(3604);

নিশ্চিতভাবেই, আমি স্লট 17 এ ডেটা পেয়েছি:

ডিবিসিসি পৃষ্ঠার আংশিক ফলাফল

(বৃহত্তর ডাটাবেসে, আপনাকে আরও অনেক বেশি শিকার এবং বিদ্রূপ করতে হতে পারে, যেহেতু কোনও নতুন পরিসংখ্যানও নতুন (এআর) পৃষ্ঠায় শেষ হওয়ার কোনও গ্যারান্টি নেই)

এগিয়ে যান এবং বাড়িতে এটি চেষ্টা করুন, তবে এর জন্য আপনাকে ড্যাকের সাথে সংযোগ স্থাপনের প্রয়োজন রয়েছে। আমি জানতে আগ্রহী হব, অবশ্যই, আপনি এই তথ্যটি কী করতে যাচ্ছেন যা আপনি DBCC SHOW_STATISTICSআউটপুট দিয়ে করতে পারেন নি ।

মনে রাখবেন যে এটি অবশ্যই STATS_STREAMহিস্টোগ্রাম বা অন্যান্য তথ্য সরবরাহ করার জন্য ডিকোড করার চেষ্টা করে না , এবং আমি কোনও প্রমাণ খুঁজে পাইনি DBCC SHOW_STATISTICS ... WITH HISTOGRAMযে এর সারণী আউটপুটটি টেবিল বিন্যাসে কোথাও সঞ্চিত রয়েছে। জো চ্যাংয়ের ডিকোডিং সম্পর্কে কিছু তথ্য রয়েছে যদি সেটাই পরে থাকে। আমি মনে করি না যে এটি এমন কোনও কিছু যা আপনি ক্যোয়ারিতে করতে চান - কেবল ব্যবহার করুন DBCC


2
আমরা একটি বিজয়ী মহিলা এবং ভদ্রলোক আছে। স্যারকে আমি আমার টুপি টিপছি।
জেন 16

হাহাহা, অভিনন্দন ও ধন্যবাদ, স্যার! চিন্তা করবেন না, আমি এমন কিছু করছি না যা আমার করা উচিত নয় (একে একে "বোকা")। এটি কেবল ব্যক্তিগত বৃদ্ধির জন্য। আমি বুঝতে পেরেছিলাম যে আমি এটির বিষয়ে সত্যিই আগ্রহী হয়ে উঠলাম আর আমি কোথাও এটি সম্পর্কে কিছুই খুঁজে পাচ্ছি না। =)
ivanmp

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