Sys.dm_exec_sessions এ "পড়া" কলামটি আসলে কী নির্দেশ করে?


10

এটি একটি খুব প্রাথমিক প্রশ্নের মতো মনে হতে পারে এবং সত্যই এটি হওয়া উচিত। তবে, বৈজ্ঞানিক পদ্ধতির অনুরাগী হিসাবে আমি একটি অনুমান তৈরি করতে চাই, তারপরে আমি সঠিক কিনা তা পরীক্ষা করে দেখুন। এই ক্ষেত্রে, আমি আউটপুট আরও ভালভাবে বোঝার চেষ্টা করছি sys.dm_exec_sessionsএবং আরও বিশেষত একক কলাম "রিডস"।

এসকিউএল সার্ভার বই অনলাইন বরং শুকনোভাবে এটি উল্লেখ করে:

এই অধিবেশন চলাকালীন, এই সেশনে অনুরোধ দ্বারা সম্পাদিত পাঠের সংখ্যা। অযোগ্য নয়।

কেউ অনুমান করতে পারেন যে এটি অধিবেশন শুরুর পর থেকে এই অধিবেশন দ্বারা জারি করা অনুরোধগুলি পূরণ করতে ডিস্ক থেকে পঠিত পৃষ্ঠাগুলির সংখ্যা নির্দেশ করে । এই ধারণাটিই আমি ভেবেছিলাম আমি পরীক্ষা করবো।

logical_readsযে একই টেবিলে কলাম হিসাবে সংজ্ঞায়িত করা হয়:

অধিবেশনটিতে কতগুলি যৌক্তিক পাঠ করা হয়েছে। অযোগ্য নয়।

এসকিউএল সার্ভার ব্যবহার করার অভিজ্ঞতা থেকে, আমি বিশ্বাস করি যে এই কলামটি ডিস্ক থেকে এবং মেমরি উভয় পৃষ্ঠার সংখ্যা প্রতিফলিত করে । অন্য কথায়, পৃষ্ঠা সংখ্যা কি কখনো অধিবেশন, কোন ব্যাপার যেখানে সেই পৃষ্ঠাগুলি রক্ষিত দ্বারা পড়া। অনুরূপ তথ্য সরবরাহকারী দুটি পৃথক কলাম থাকার ডিফারেন্টিটার বা মান-প্রস্তাবনা থেকে মনে হয় যে কোনও নির্দিষ্ট সেশনের জন্য readsবাফার ক্যাশে ( logical_reads) থেকে পড়ার তুলনায় ডিস্ক ( ) থেকে পড়া পৃষ্ঠাগুলির অনুপাত বুঝতে পারে ।

আমার পরীক্ষার ছদ্মবেশে, আমি একটি নতুন ডাটাবেস তৈরি করেছি, পরিচিত সংখ্যক পৃষ্ঠাগুলির ডেটা সহ একটি একক টেবিল তৈরি করেছি, তারপরে নতুন সেশনে সেই টেবিলটি পড়ি। তারপরে আমি অধিবেশনটি সম্পর্কে এবং কলামগুলি কী বলেছে sys.dm_exec_sessionsতা দেখার জন্য তাকিয়েছিলাম looked এই মুহূর্তে আমি ফলাফল দ্বারা বিস্মিত। সম্ভবত এখানে কেউ আমার জন্য এই বিষয়ে কিছু আলোকপাত করতে পারে।readslogical_reads

পরীক্ষার ছদ্মবেশ:

USE master;
IF EXISTS (SELECT 1
    FROM sys.databases d 
    WHERE d.name = 'TestReads')
BEGIN
    ALTER DATABASE TestReads SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE TestReads;
END
GO
CREATE DATABASE TestReads;
GO
ALTER DATABASE TestReads SET RECOVERY SIMPLE;
BACKUP DATABASE TestReads TO DISK = 'NUL:'; /* ensure we are in 
                                            simple recovery model */
GO

USE TestReads;
GO

/*
    create a table with 2 rows per page, for easy math!
*/
CREATE TABLE dbo.TestReads
(
    ID INT NOT NULL
        CONSTRAINT PK_TestReads
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , SomeData CHAR(4000) NOT NULL
);

/*
    insert 5000 pages of data
*/
INSERT INTO dbo.TestReads (SomeData)
SELECT TOP(10000) o1.name
FROM sys.objects o1
    , sys.objects o2
    , sys.objects o3
ORDER BY o1.object_id
    , o2.object_id
    , o3.object_id;


/*
    Verify we have 5,000 pages of data, with 10,000 rows.
*/
SELECT o.name
    , p.rows
    , au.total_pages
    , au.used_pages
    , au.data_pages
FROM sys.partitions p
    INNER JOIN sys.objects o ON p.object_id = o.object_id 
    INNER JOIN sys.allocation_units au 
        ON p.hobt_id = au.container_id 
        AND (au.type = 1 or au.type = 0)
WHERE p.index_id = 1
    AND o.name = 'TestReads'
    AND o.type = 'U';

/*
    issue a checkpoint to ensure dirty pages are flushed to disk
*/
CHECKPOINT 30;
DBCC DROPCLEANBUFFERS;
DBCC FREESYSTEMCACHE ('ALL');
DBCC FREEPROCCACHE;
DBCC FREESESSIONCACHE;
GO

/*
    ensure we have no data cached in memory for the TestReads database
*/
USE master;
ALTER DATABASE TestReads SET OFFLINE WITH ROLLBACK IMMEDIATE;
ALTER DATABASE TestReads SET ONLINE;

SELECT DatabaseName = d.name
    , SchemaName = s.name
    , ObjectName = o.name
    , AllocatedMB = COUNT(1) * 8192E0 / 1048576
    , PagesInMemory = COUNT(1)
FROM sys.dm_os_buffer_descriptors dobd
    INNER JOIN sys.allocation_units au 
        ON dobd.allocation_unit_id = au.allocation_unit_id
    INNER JOIN sys.partitions p 
        ON au.container_id = p.hobt_id 
             AND (au.type = 1 OR au.type = 0)
    INNER JOIN sys.objects o ON p.object_id = o.object_id
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    INNER JOIN sys.databases d 
        ON dobd.database_id = d.database_id
WHERE d.name = 'TestReads'
    AND o.name = 'TestReads'
    AND o.type = 'U'
GROUP BY d.name
    , s.name
    , o.name;

উপরের প্রথম নির্বাচিত বিবৃতিটি দেখায় যে আসলে টেবিলটি 10,000 টি সারি নিয়ে গঠিত, এতে 5,025 টি মোট পৃষ্ঠা, 5,020 ব্যবহৃত পৃষ্ঠাগুলি এবং 5,000 টি ডাটা পৃষ্ঠা রয়েছে; এক হিসাবে যেমন আশা করবে:

এখানে চিত্র বর্ণনা লিখুন

দ্বিতীয় নির্বাচনের বিবৃতিটি নিশ্চিত করে যে আমাদের কাছে TestReadsটেবিলের স্মৃতি নেই ।

একটি নতুন অধিবেশনে , আমরা সেশন_আইডের নোট গ্রহণ করে নিম্নলিখিত কোয়েরিটি করি:

USE TestReads;

SET STATISTICS IO ON;

SELECT *
FROM dbo.TestReads;

যেমনটি প্রত্যাশা করা যায়, এটি ডিস্ক থেকে মেমরিতে পুরো টেবিলটি পড়ে, যা থেকে আউটপুটে দেখানো হয়েছে SET STATISTICS IO ON:

(10000 row(s) affected)
Table 'TestReads'. Scan count 1, logical reads 5020, physical reads 3, 
read-ahead reads 4998, lob logical reads 0, lob physical reads 0, lob 
read-ahead reads 0.

একটি তৃতীয় অধিবেশন, আমরা পরিদর্শন sys.dm_exec_sessions:

SELECT des.session_id
    , des.reads
    , des.logical_reads
FROM sys.dm_exec_sessions des
WHERE des.session_id = 57; /* session_id from the 2nd (previous) session */

আমি উভয় এবং উভয়ের জন্য কমপক্ষে 5,000 sys.dm_exec_sessionsশো দেখার আশা করব । হায়, আমি শূন্য দেখছি । 5000 এর উত্তরে কোথাও পাঠের একটি প্রত্যাশিত সংখ্যা দেখায় - এটি আমার পরীক্ষায় 5,020 দেখায়:readslogical_readsreadslogical_reads

এখানে চিত্র বর্ণনা লিখুন

আমি জানি এসকিউএল সার্ভার ডিএমভির TestReadsকারণে পুরো টেবিলটি মেমরির মধ্যে পড়ে sys_dm_os_buffer_descriptors:

USE TestReads;
GO
SELECT DatabaseName = d.name
    , SchemaName = s.name
    , ObjectName = o.name
    , AllocatedMB = COUNT(1) * 8192E0 / 1048576
    , PagesInMemory = COUNT(1)
FROM sys.dm_os_buffer_descriptors dobd
    INNER JOIN sys.allocation_units au 
        ON dobd.allocation_unit_id = au.allocation_unit_id
    INNER JOIN sys.partitions p 
        ON au.container_id = p.hobt_id 
            AND (au.type = 1 OR au.type = 0)
    INNER JOIN sys.objects o ON p.object_id = o.object_id
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    INNER JOIN sys.databases d 
        ON dobd.database_id = d.database_id
WHERE d.name = 'TestReads'
    AND o.name = 'TestReads'
    AND o.type = 'U'
GROUP BY d.name
    , s.name
    , o.name;

এখানে চিত্র বর্ণনা লিখুন

আমি কি ভুল করছি?

আমি এই পরীক্ষার জন্য এসকিউএল সার্ভার 2012 11.0.5343 ব্যবহার করছি।


আরও অনুসন্ধান:

আমি যদি নিম্নলিখিতটি চালিত করি:

SELECT des.session_id
    , des.reads
    , des.logical_reads
FROM sys.dm_exec_sessions des

আমি readsসেশনে 784 টি দেখতে পাচ্ছি যেখানে আমি পরীক্ষার ছাদ তৈরি করছি; তবে অন্যান্য সমস্ত সেশন readsকলামে শূন্য প্রদর্শন করে ।

আমি এখন আমার এসকিউএল সার্ভার পরীক্ষার উদাহরণ 11.0.6020 এ আপডেট করেছি; তবে ফলাফল একই।


sys.dm_exec_requestsআপনাকে প্রায় একই set statistics io onফলাফল দেবে।
কিন শাহ

1
SET STATISTICS IO ONদ্বিতীয় সেশনে আমি টেবিল থেকে পড়ার ঠিক আগে আকর্ষণীয় 3 শারীরিক পাঠ, এবং 4998 রিড-ফরোয়ার্ড রিডস রিপোর্ট করেছে; তবে sys.dm_exec_sessionsএটি readsকলামে প্রতিফলিত করে না ।
ম্যাক্স ভার্নন


1
আসলে আমি ২০০৮ থেকে এসকিউএল ২০১6 এসটিপি 3
মার্টিন স্মিথ

1
@ মার্টিনস্মিথ এবং ম্যাক্স: আমি readsক্ষেত্রগুলির কিছু বৃদ্ধিতে বিলম্বও দেখছি । আমার সন্দেহ হয় এটি অনেকটা সেশন_স্পেস_উসেজ বা ডিএমভির মতো কাজ করে যা সেশন প্রতি টেম্পডিবির ব্যবহার দেখায় যা "অনুরোধ" শেষ না হওয়া পর্যন্ত বৃদ্ধি পায় না।
সলোমন রুটজকি

উত্তর:


2

আমার বোধগম্যতা সবসময় ছিল readsযা কেবল শারীরিক (যেমন ডিস্ক থেকে) এবং logical_readsকেবল বাফার পুল (অর্থাত মেমরি থেকে)। আমি একটি ছোট টেবিলে একটি দ্রুত পরীক্ষা করেছিলাম যার কেবলমাত্র 2 টি ডেটা পৃষ্ঠা এবং মোট 3 পৃষ্ঠাগুলি রয়েছে এবং আমি যা দেখছি তা এই দুটি সংজ্ঞাটি নিশ্চিত করেছে বলে মনে হচ্ছে।

একটি জিনিস যা সম্ভবত আপনাকে খারাপ ফলাফল দিচ্ছে তা হ'ল আপনি স্মৃতি পরিষ্কার করছেন না। এটিকে ডিস্ক থেকে পুনরায় লোড করতে বাধ্য করার জন্য আপনার পরীক্ষাগুলির মধ্যে নিম্নলিখিতটি চালানো উচিত:

DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;

আমার পরীক্ষার সেটআপটি কেবল নিম্নলিখিত:

CREATE TABLE dbo.ReadTest (Col1 CHAR(7500) DEFAULT (' '));
INSERT INTO dbo.ReadTest (Col1) VALUES (DEFAULT), (DEFAULT);

আমি তারপর নিম্নলিখিত চালানো:

SELECT reads, logical_reads FROM sys.dm_exec_sessions WHERE session_id = @@SPID;
SELECT * FROM dbo.ReadTest;

(হ্যাঁ, আমি একই অধিবেশনটিতে যাচাই করেছিলাম যে আমি ডিএমভি চালাচ্ছিলাম, তবে এটি readsক্ষেত্রের জন্য ফলাফলগুলি কাটেনি , এবং অন্য কিছু না হলে, যদি logical_readsক্ষেত্রের ক্ষেত্রে অবদান রাখে তবে কমপক্ষে সামঞ্জস্য ছিল ))

পরীক্ষার জন্য আমি ডিবিসিসি কমান্ড চালাব এবং তারপরে দুটি এস ইলেক্ট কোয়েরি করবো। তারপর আমি উভয় readsএবং logical_readsক্ষেত্রের মধ্যে একটি লাফ দেখতে হবে । আমি আবার নির্বাচন নির্বাচনগুলি চালাতাম এবং কখনও কখনও আমি একটি অতিরিক্ত লাফ দেখতে পেতাম reads

এর পরে, আমি দুটি নির্বাচনী ক্যোয়ারীটি বহুবার চালিত করব এবং প্রতি একক সময় 4 টি বাড়িয়ে readsযাওয়ার সময় একই থাকবে logical_reads

আমি তখন ডিবিসিসি চালানো শুরু করব এবং একই প্যাটার্নটি দেখতে পাবো। আমি এটি বেশ কয়েকবার করেছি এবং রিপোর্ট করা নম্বরগুলি পরীক্ষার সমস্ত রান জুড়ে সুসংগত ছিল।


অধিক তথ্য:

আমি এসকিউএল সার্ভার 2012, এসপি 2 - 64 বিট (11.0.5343) এও পরীক্ষা করছি।

নিম্নলিখিত ডিবিসিসি কমান্ডগুলি আমরা উভয়ই চেষ্টা করে দেখেছি এবং এর কোনও প্রভাব নেই:

DBCC FREESYSTEMCACHE('ALL');
DBCC FREEPROCCACHE;
DBCC FREESESSIONCACHE;

বেশিরভাগ সময় DBCC DROPCLEANBUFFERSকাজ করে তবে আমি মাঝে মধ্যে দেখতে পাই যে এটি এখনও বাফার পুলে রয়েছে। অস্বাভাবিক.

যখন আমি:

  • DBCC DROPCLEANBUFFERS: পাঠাগুলি 24-র উপরে এবং যৌক্তিক পাঠগুলি 52 দ্বারা উপরে যায়।
  • চালান SELECT [Col1] FROM dbo.ReadTest;আবার পর্যন্ত যেতে না সার্চ কিন্তু logical_reads 6 দ্বারা আপ যান।
  • ক্যোয়ারী পাঠ্যে একটি স্থান যুক্ত করুন এবং পুনরায় রান করুন: পাঠগুলি উপরে যায় না, তবে লজিক্যাল_ড্রেডগুলি 52 দ্বারা উঠে যায় (ঠিক ঠিক ঠিক ঠিক পরে DBCC DROPCLEANBUFFERS)।

এটি প্রদর্শিত হবে যে 52 যৌক্তিক পড়ার পরিকল্পনা পরিকল্পনা তৈরির ফলাফল এবং ফলাফলগুলির জন্য, যা বোঝায় যে পরিকল্পনা প্রজন্ম অতিরিক্ত 46 লজিকাল রিডের কারণ হয়েছিল। তবে শারীরিক পাঠগুলি আবার উপরে উঠে যায় না এবং তবুও এটি একইভাবে 52 টি যৌক্তিক পাঠ হয় যেমনটি যখন শারীরিক পাঠ করার দরকার পড়েছিল তাই logical_readsশারীরিক অন্তর্ভুক্ত হয় না reads। আমি কেবল এই বিষয়টিকে পরিষ্কার করে দিচ্ছি, এটি প্রশ্নের মধ্যে বর্ণিত বা অন্তর্ভুক্ত ছিল কিনা।

কিন্তু, একটি আচরণ আমি লক্ষ্য করেছি যে টেবিলের ডেটা পৃষ্ঠাগুলির অস্তিত্ব ব্যবহার করে (কমপক্ষে কিছুটা) ছুড়ে ফেলেছে sys.dm_os_buffer_descriptors: এটি অন্য কোনও প্রক্রিয়া দ্বারা পুনরায় লোড হয়ে যায়। আপনি যদি ড্রপক্লেইনবাউফারগুলি এবং তত্ক্ষণাত্ পরীক্ষা করে থাকেন তবে তা শেষ করা উচিত। তবে কয়েক মিনিট অপেক্ষা করুন এবং এটি আবার প্রদর্শিত হবে তবে এবার সমস্ত ডেটা পৃষ্ঠা ছাড়াই। আমার পরীক্ষায়, টেবিলটিতে 1 আইএএম পৃষ্ঠা এবং 4 টি ডেটা পৃষ্ঠা রয়েছে। সমস্ত 5 পৃষ্ঠাগুলি আমি করার পরে বাফার পুলে রয়েছে SELECT। কিন্তু যখন এটি অন্য কোনও প্রক্রিয়া দ্বারা পুনরায় লোড হয়ে যায়, এটি কেবল আইএএম পৃষ্ঠা এবং 1 ডেটা পৃষ্ঠা। আমি ভেবেছিলাম এটি এসএসএমএস ইন্টেলিজেন্স হতে পারে তবে আমি আমার ক্যোরি ট্যাবে সেই অবজেক্টের নামের সমস্ত উল্লেখ সরিয়ে দিয়েছি এবং এটি এখনও পুনরায় লোড হয়ে যায়।


মজাদারভাবে যথেষ্ট, আমি DBCC DROPCLEANBUFFERS(এবং অন্যান্য DBCC DROPxxxকমান্ড) আমার পরীক্ষার ছদ্মবেশ থেকে সরিয়েছি কারণ তারা কোনও পার্থক্য করেনি। ডাটাবেস অফলাইনে সেট করা সমস্ত বাফার এবং ডাটাবেসের সাথে যুক্ত সমস্ত কিছু ড্রপ করে।
ম্যাক্স ভার্নন

আপনি শারীরিক হওয়ার বিষয়ে আপনার মত সমান ধারণা পেয়েছিলাম এবং বাফার পুল, বিটিডব্লিউ থেকে যৌক্তিক পাঠগুলি শুরু হয়।
ম্যাক্স ভার্নন

আমি এটি দিয়েও চেষ্টা করেছি: DBCC FREESYSTEMCACHE ('ALL'); DBCC FREEPROCCACHE; DBCC FREESESSIONCACHE;
ম্যাক্স ভার্নন

1
@ ম্যাক্স ভার্নন "এমপি গেসিন রাখুন" বৈশিষ্ট্য হতে পারে ;-)
সলোমন রুটজকি

2
@ ম্যাক্স ভার্নন, এর CHECKPOUNTআগে ডেটাবেস প্রসঙ্গে একটি প্রয়োগ করতে ভুলবেন না DBCC DROPCLEANBUFFERS
ড্যান গুজম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.