যৌক্তিক গ্লোবাল টেম্প টেবিলে পড়েন, তবে সেশন-লেভেলের টেম্প টেবিলে নয়


11

নিম্নলিখিত সহজ MCVE বিবেচনা করুন:

SET STATISTICS IO, TIME OFF;
USE tempdb;

IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1;
CREATE TABLE #t1
(
    r int NOT NULL
);

IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1;
CREATE TABLE ##t1
(
    r int NOT NULL
);

IF OBJECT_ID(N'dbo.s1', N'U') IS NOT NULL DROP TABLE dbo.s1;
CREATE TABLE dbo.s1 
(
    r int NOT NULL
        PRIMARY KEY CLUSTERED
);

INSERT INTO dbo.s1 (r)
SELECT TOP(10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc1
    CROSS JOIN sys.syscolumns sc2;
GO

আমি যখন নিম্নলিখিত সন্নিবেশগুলি চালনা করি, #t1তখন টেম্প টেবিলের জন্য কোনও পরিসংখ্যান I / O প্রদর্শন করে না। যাইহোক, in োকানো টেম্প টেবিলের জন্য পরিসংখ্যানগুলি I / O প্রদর্শন ##t1 করে

SET STATISTICS IO, TIME ON;
GO

INSERT INTO #t1 (r)
SELECT r
FROM dbo.s1;

পরিসংখ্যান আউটপুট:

এসকিউএল সার্ভার পার্স এবং সংকলন সময়: 
   সিপিইউ সময় = 0 এমএস, অতিবাহিত সময় = 1 এমএস।
সারণী 'এস 1'। স্ক্যান কাউন্ট 1, লজিকাল রিডিজ 19, ফিজিকাল রিড 0, রিড-ফরোডড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0

 এসকিউএল সার্ভার এক্সিকিউশন টাইমস:
   সিপিইউ সময় = 16 এমএস, অতিবাহিত সময় = 9 এমএস।

(10000 সারি প্রভাবিত)
INSERT INTO ##t1 (r)
SELECT r
FROM dbo.s1;
এসকিউএল সার্ভার পার্স এবং সংকলন সময়: 
   সিপিইউ সময় = 0 এমএস, অতিবাহিত সময় = 1 এমএস।
সারণী '## টি 1'। স্ক্যান গণনা 0, লজিকাল 10010, শারীরিক 0 0, পঠন-এগিয়ে 0, লব লজিকাল রিড 0, লব শারীরিক পাঠ 0, লব পঠন-এগিয়ে 0 0 স্ক্যান
সারণী 'এস 1'। স্ক্যান কাউন্ট 1, লজিকাল রিডিজ 19, ফিজিকাল রিড 0, রিড-ফরোডড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0

 এসকিউএল সার্ভার এক্সিকিউশন টাইমস:
   সিপিইউ সময় = 47 এমএস, অতিবাহিত সময় = 45 এমএস।

(10000 সারি প্রভাবিত)

যখন আমি কেবল এটিতে প্রবেশ করিয়ে দিচ্ছি তখন কেন ## টেম্প টেবিলে এতগুলি পাঠ হয়?

উত্তর:


11

INSERT INTOগ্লোবাল টেম্প টেবিলগুলি ব্যবহার করার সময় ন্যূনতম লগিং ব্যবহার করা হচ্ছে না

গ্লোবাল টেম্প টেবিলে ব্যবহার করে এক মিলিয়ন সারি .োকানো INSERT INTO

INSERT INTO ##t1 (r)
SELECT top(1000000) s1.r
FROM dbo.s1
CROSS APPLY  dbo.s1 S2;

SELECT * FROM fn_dblog(NULL, NULL)উপরের ক্যোয়ারীটি কার্যকর হওয়ার সময় চলাকালীন , M 1M সারি ফিরে আসে।

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

LOP_INSERT_ROWপ্রতিটি সারি + অন্যান্য লগ ডেটার জন্য একটি অপারেশন।


স্থানীয় টেম্প টেবিলে একই সন্নিবেশ

INSERT INTO #t1 (r)
SELECT top(1000000) s1.r
FROM dbo.s1
CROSS APPLY  dbo.s1 S2;

কেবল 700 সারি পর্যন্ত ফিরে আসা SELECT * FROM fn_dblog(NULL, NULL)

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

নূন্যতম লগিং


গ্লোবাল টেম্প টেবিলে ব্যবহার করে এক মিলিয়ন সারি .োকানো SELECT INTO

SELECT top(1000000) s1.r
INTO ##t2
FROM dbo.s1
CROSS APPLY  dbo.s1 S2;

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

SELECT INTO 10 কে রেকর্ড সহ একটি গ্লোবাল টেম্প টেবিল

SELECT s1.r
INTO ##t2
FROM dbo.s1;

সময় এবং আইও পরিসংখ্যান

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.
Table 's1'. Scan count 1, logical reads 19, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 10 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

এই ব্লগপোস্টের ভিত্তিতে আমরা TABLOCKএকটি টেবিলের ন্যূনতম লগিং শুরু করতে যোগ করতে পারি

INSERT INTO ##t1 WITH(TABLOCK) (r)
SELECT   s1.r
FROM dbo.s1

কম যৌক্তিক পড়া

Table 's1'. Scan count 1, logical reads 19, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(10000 rows affected)

অস্থায়ী টেবিলগুলিতে কীভাবে ন্যূনতম লগিং অর্জন করতে হবে সে সম্পর্কে @ পলওয়াইটের উত্তরের অংশ

না। স্থানীয় অস্থায়ী টেবিলগুলি (# টিম্প) তৈরি সেশনের ব্যক্তিগত, সুতরাং একটি টেবিল লক ইঙ্গিত প্রয়োজন হয় না। টেবিল লক ইঙ্গিতটি বিশ্বব্যাপী অস্থায়ী টেবিলের জন্য প্রয়োজন (## টেম্পে) বা টেম্পডিবিতে তৈরি করা একটি নিয়মিত টেবিল (dbo.temp), কারণ এগুলি একাধিক সেশন থেকে অ্যাক্সেস করা যায়।

এটি পরীক্ষা করার জন্য একটি নিয়মিত টেবিল তৈরি করা:

CREATE TABLE dbo.bla
(
    r int NOT NULL 
);

এটি 1 এম রেকর্ড দিয়ে পূরণ করা

INSERT INTO bla 
SELECT   top(1000000)s1.r
FROM dbo.s1
CROSS APPLY  dbo.s1 S2;

> এই টেবিলটিতে 1 এম লজিকাল পাঠ্য

Table 's1'. Scan count 17, logical reads 155, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'bla'. Scan count 0, logical reads 1001607, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

যৌক্তিক পাঠগুলি ব্যাখ্যা করে পল হোয়াইটের উত্তর গ্লোবাল টেম্প টেবিলে প্রকাশিত

সাধারণত, সারণি যখন অল্প লগ হয় না তখন লজিক্যাল রিডগুলি লক্ষ্য টেবিলের জন্য প্রতিবেদন করা হয়।

এই যৌক্তিক পাঠগুলি নতুন সারি যুক্ত করতে বিদ্যমান কাঠামোয় একটি জায়গা সন্ধানের সাথে যুক্ত। স্বল্প-লগ ইনড্রেসেটসগুলি বাল্ক-লোডিং পদ্ধতি ব্যবহার করে, যা সম্পূর্ণ নতুন পৃষ্ঠা / এক্সটেন্টগুলি বরাদ্দ করে (এবং একইভাবে লক্ষ্য কাঠামোটি পড়ার প্রয়োজন নেই)।


উপসংহার

উপসংহারটি এই যে, INSERT INTOসর্বনিম্ন লগিং ব্যবহার করতে সক্ষম হয় না, ফলস্বরূপ গ্লোবাল টেম্প টেবিল / সাধারণ টেবিলের সাথে মিশ্রিত করার সময় টেম্পডিবির লগ ফাইলটিতে প্রতিটি সন্নিবেশ করা সারি পৃথকভাবে লগ করা যায়। যেখানে স্থানীয় টেম্প টেবিল / SELECT INTO/ INSERT INTO ... WITH(TABLOCK)ন্যূনতম লগিং ব্যবহার করতে সক্ষম।

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