কেন একটি নির্বাচন জিজ্ঞাসা কারণ লিখতে হবে?


34

আমি লক্ষ্য করেছি যে এসকিউএল সার্ভার চলমান একটি সার্ভারে ২০১ SP এসপি 1 সিই 6 কখনও কখনও একটি বর্ধিত ইভেন্টস সেশনে লেখার কারণে একটি নির্বাচনী অনুসন্ধান জিজ্ঞাসা দেখায়। উদাহরণ স্বরূপ:

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

এক্সিকিউশন প্ল্যান লেখার জন্য যেমন হ্যাশ টেবিল, স্পুল, বা টেম্পডিবিকে ছড়িয়ে দিতে পারে তার কোনও স্পষ্ট কারণ দেখায় না:

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

একটি ম্যাক্স টাইপের পরিবর্তনশীল অ্যাসাইনমেন্ট বা একটি স্বয়ংক্রিয় পরিসংখ্যান আপডেটের কারণেও এটি ঘটতে পারে তবে এই ক্ষেত্রে লেখকের কারণও ছিল না।

লেখক আর কি হতে পারে?

উত্তর:


8

কদাকার

আমি এগুলিকে আমার মূল উত্তরে অন্তর্ভুক্ত করেছিলাম কিনা তা মনে করতে পারি নি , সুতরাং এখানে আরও একটি দম্পতি রয়েছে।

Spools!

এসকিউএল সার্ভারে প্রচুর বিভিন্ন স্পুল রয়েছে যা অস্থায়ী ডেটা স্ট্রাকচারগুলি টেম্পডিবিতে সঞ্চিত। দুটি উদাহরণ সারণী এবং সূচি স্পলগুলি ool

যখন তারা কোনও ক্যোয়ারী পরিকল্পনায় আসে, সেই স্পুলগুলিতে লেখাগুলি ক্যোয়ারির সাথে যুক্ত হবে।

পাগল

এগুলি ডিএমভি, প্রোফাইলার, এক্সই, ইত্যাদিতে লেখক হিসাবেও নিবন্ধিত হবে

সূচক স্পুল

পাগল

টেবিল স্পুল

পাগল

সম্পাদিত লেখার পরিমাণ স্পষ্টভাবে ডেটা আকারের সাথে বাড়বে, স্পষ্টতই।

উপচে পড়ার

যখন এসকিউএল সার্ভার নির্দিষ্ট অপারেটরগুলির জন্য পর্যাপ্ত মেমরি পায় না, তখন এটি কিছু পৃষ্ঠা ডিস্কে ছড়িয়ে দিতে পারে। এটি প্রাথমিকভাবে বাছাই এবং হ্যাশগুলির সাথে ঘটে। আপনি এটি বাস্তব বাস্তবায়ন পরিকল্পনাগুলিতে এবং এসকিউএল সার্ভারের নতুন সংস্করণগুলিতে, স্পিমগুলি dm_exec_query_stats এও দেখতে পাবেন

SELECT deqs.sql_handle,
       deqs.total_spills,
       deqs.last_spills,
       deqs.min_spills,
       deqs.max_spills
FROM sys.dm_exec_query_stats AS deqs
WHERE deqs.min_spills > 0;

পাগল

পাগল

অনুসরণকরণ

আপনার নিজের ডেমোগুলিতে এটি দেখতে আপনি উপরে যেমনটি ব্যবহার করেছেন তেমন একটি XE অধিবেশন ব্যবহার করতে পারেন।

CREATE EVENT SESSION spools_and_spills
    ON SERVER
    ADD EVENT sqlserver.sql_batch_completed
    ( ACTION ( sqlserver.sql_text ))
    ADD TARGET package0.event_file
    ( SET filename = N'c:\temp\spools_and_spills' )
    WITH ( MAX_MEMORY = 4096KB,
           EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
           MAX_DISPATCH_LATENCY = 1 SECONDS,
           MAX_EVENT_SIZE = 0KB,
           MEMORY_PARTITION_MODE = NONE,
           TRACK_CAUSALITY = OFF,
           STARTUP_STATE = OFF );
GO

38

কিছু ক্ষেত্রে ক্যোয়ারী স্টোর একটি নির্বাচিত বিবৃতি এবং একই অধিবেশনে প্রভাব হিসাবে লিখতে পারে।

এটি নিম্নলিখিত হিসাবে পুনরুত্পাদন করা যেতে পারে:

USE master;
GO
CREATE DATABASE [Foo];
ALTER DATABASE [Foo] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, 
  CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), 
  DATA_FLUSH_INTERVAL_SECONDS = 900, 
  INTERVAL_LENGTH_MINUTES = 60, 
  MAX_STORAGE_SIZE_MB = 100, 
  QUERY_CAPTURE_MODE = ALL, 
  SIZE_BASED_CLEANUP_MODE = AUTO);
USE Foo;
CREATE TABLE Test (a int, b nvarchar(max));
INSERT INTO Test SELECT 1, 'string';

পর্যবেক্ষণের জন্য একটি বর্ধিত ইভেন্টস সেশন তৈরি করুন:

CREATE EVENT SESSION [Foo] ON SERVER 
ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1)
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.is_system,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.session_server_principal_name,sqlserver.sql_text)
    WHERE ([writes]>(0))),
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_name,sqlserver.is_system,sqlserver.server_principal_name,sqlserver.session_id,sqlserver.session_server_principal_name,sqlserver.sql_text)
    WHERE ([writes]>(0)))
ADD TARGET package0.event_file(SET filename=N'C:\temp\FooActivity2016.xel',max_file_size=(11),max_rollover_files=(999999))
WITH (MAX_MEMORY=32768 KB,EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF);

এরপরে নিম্নলিখিতটি চালান:

WHILE @@TRANCOUNT > 0 COMMIT
SET IMPLICIT_TRANSACTIONS ON;
SET NOCOUNT ON;
GO
DECLARE @b nvarchar(max);
SELECT @b = b FROM dbo.Test WHERE a = 1;
WAITFOR DELAY '00:00:01.000';
GO 86400

একটি অন্তর্নিহিত লেনদেন এটি পুনরুত্পাদন করার প্রয়োজন হতে পারে বা নাও পারে।

ডিফল্টরূপে, পরের ঘন্টা শীর্ষে কোয়েরি স্টোরের পরিসংখ্যান সংগ্রহের কাজ ডেটা লিখবে। এটি প্রদর্শিত হয় (কখনও কখনও?) এক ঘন্টা সময় কার্যকর হওয়া প্রথম ব্যবহারকারী ক্যোয়ারির অংশ হিসাবে ঘটে। বর্ধিত ইভেন্টস সেশনটি নীচের মতো কিছু দেখায়:

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

লেনদেন লগ ঘটেছিল যে লেখাগুলি দেখায়:

USE Foo;
SELECT [Transaction ID], [Begin Time], SPID, Operation, 
  [Description], [Page ID], [Slot ID], [Parent Transaction ID] 
FROM sys.fn_dblog(null,null) 
/* Adjust based on contents of your transaction log */
WHERE [Transaction ID] IN ('0000:0000042c', '0000:0000042d', '0000:0000042e')
OR [Parent Transaction ID] IN ('0000:0000042c', '0000:0000042d', '0000:0000042e')
ORDER BY [Current LSN];

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

পৃষ্ঠাটি পর্যালোচনা করে DBCC PAGEদেখায় যে লেখাগুলি হ'ল sys.plan_persist_runtime_stats_interval

USE Foo;
DBCC TRACEON(3604); 
DBCC PAGE(5,1,344,1); SELECT
OBJECT_NAME(229575856);

নোট করুন যে লগ এন্ট্রিগুলি তিনটি নেস্টেড লেনদেন দেখায় তবে কেবল দুটি কমিট রেকর্ড করে। উত্পাদনের অনুরূপ পরিস্থিতিতে, এটি একটি তর্কযুক্ত ত্রুটিযুক্ত ক্লায়েন্ট লাইব্রেরির দিকে পরিচালিত করেছিল যা অপ্রত্যাশিতভাবে লিখিত লেনদেন শুরু করে, লেনদেন লগকে সাফ হওয়া থেকে রোধ করে imp লাইব্রেরিটি কেবল একটি আপডেট চালানো, সন্নিবেশ করানো বা বিবৃতি মোছার পরে কোনও প্রতিশ্রুতি জারি করতে লেখা হয়েছিল, সুতরাং এটি কখনও কোনও কমিট আদেশ দেয়নি এবং লিখিত লেনদেন উন্মুক্ত রাখেনি।


25

এটি ঘটতে পারে এমন আরও একটি সময় আছে এবং এটি একটি স্বয়ংক্রিয় পরিসংখ্যান আপডেটের সাথে।

এখানে XE অধিবেশনটি আমরা দেখব:

CREATE EVENT SESSION batches_and_stats
    ON SERVER
    ADD EVENT sqlserver.auto_stats
    ( ACTION ( sqlserver.sql_text )),
    ADD EVENT sqlserver.sql_batch_completed
    ( ACTION ( sqlserver.sql_text ))
    ADD TARGET package0.event_file
    ( SET filename = N'c:\temp\batches_and_stats' )
    WITH ( MAX_MEMORY = 4096KB,
           EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
           MAX_DISPATCH_LATENCY = 30 SECONDS,
           MAX_EVENT_SIZE = 0KB,
           MEMORY_PARTITION_MODE = NONE,
           TRACK_CAUSALITY = OFF,
           STARTUP_STATE = OFF );
GO

তারপরে আমরা তথ্য সংগ্রহ করতে এটি ব্যবহার করব:

USE tempdb

DROP TABLE IF EXISTS dbo.SkewedUp

CREATE TABLE dbo.SkewedUp (Id INT NOT NULL, INDEX cx_su CLUSTERED (Id))

INSERT dbo.SkewedUp WITH ( TABLOCK ) ( Id )
SELECT CASE WHEN x.r % 15 = 0 THEN 1
            WHEN x.r % 5 = 0 THEN 1000
            WHEN x.r % 3 = 0 THEN 10000
            ELSE 100000
       END AS Id
FROM   (   SELECT     TOP 1000000 ROW_NUMBER() OVER ( ORDER BY @@DBTS ) AS r
           FROM       sys.messages AS m
           CROSS JOIN sys.messages AS m2 ) AS x;


ALTER EVENT SESSION [batches_and_stats] ON SERVER STATE = START

SELECT su.Id, COUNT(*) AS records
FROM dbo.SkewedUp AS su
WHERE su.Id > 0
GROUP BY su.Id

ALTER EVENT SESSION [batches_and_stats] ON SERVER STATE = STOP

এক্সই অধিবেশন থেকে আকর্ষণীয় কিছু ফলাফল:

পাগল

অটো পরিসংখ্যান আপডেট কোনও লিখন দেখায় না, তবে ক্যোয়ারী পরিসংখ্যান আপডেটের সাথে সাথেই একটি লেখা দেখায়।

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