उपयोग 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)
ऊपर क्वेरी करते समय चलने पर , ~ 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
10k रिकॉर्ड के साथ एक वैश्विक अस्थायी तालिका
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)
अस्थायी तालिकाओं पर न्यूनतम लॉगिंग प्राप्त करने के तरीके पर @PaulWite द्वारा उत्तर का एक हिस्सा
नहीं। स्थानीय अस्थायी टेबल (# टैम्प) बनाने के सत्र के लिए निजी हैं, इसलिए टेबल लॉक हिंट की आवश्यकता नहीं है। वैश्विक अस्थायी तालिका (## अस्थायी) या अस्थायी तालिका (dbo.temp) के लिए एक टेबल लॉक संकेत की आवश्यकता होगी, क्योंकि इन्हें कई सत्रों से एक्सेस किया जा सकता है।
इसका परीक्षण करने के लिए एक नियमित तालिका बनाना:
CREATE TABLE dbo.bla
(
r int NOT NULL
);
इसे 1M रिकॉर्ड के साथ भरना
INSERT INTO bla
SELECT top(1000000)s1.r
FROM dbo.s1
CROSS APPLY dbo.s1 S2;
> 1M तार्किक इस तालिका पर पढ़ता है
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.
पॉल व्हाइट का जवाब वैश्विक अस्थायी तालिका पर बताई गई तार्किक रीड्स की व्याख्या करता है
आम तौर पर, तार्किक रीड लक्ष्य तालिका के लिए रिपोर्ट किए जाते हैं जब सम्मिलित न्यूनतम रूप से लॉग इन नहीं होते हैं।
ये तार्किक रीड नई पंक्तियों को जोड़ने के लिए मौजूदा संरचना में एक जगह खोजने से जुड़े हैं। न्यूनतम रूप से लॉग किए गए आवेषण बल्क-लोडिंग तंत्र का उपयोग करते हैं, जो पूरे नए पृष्ठों / extents को आवंटित करता है (और उसी तरह लक्ष्य संरचना को पढ़ने की आवश्यकता नहीं है)।
निष्कर्ष
निष्कर्ष यह है कि INSERT INTO
न्यूनतम लॉगिंग का उपयोग करने में सक्षम नहीं है, जिसके परिणामस्वरूप जब एक वैश्विक अस्थायी तालिका / सामान्य तालिका के साथ संयोजन में उपयोग किया जाता है, तो प्रत्येक सम्मिलित पंक्ति को व्यक्तिगत रूप से tempdb की लॉग फ़ाइल में लॉग किया जाता है। जबकि स्थानीय अस्थायी तालिका / SELECT INTO
/ INSERT INTO ... WITH(TABLOCK)
न्यूनतम लॉगिंग का उपयोग करने में सक्षम है।