Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं Sql Profiler का उपयोग करके SqlBulkCopy में पास किए गए डेटा को कैसे कैप्चर करूं?

बल्क इंसर्ट ऑपरेशंस के लिए इवेंट की जानकारी कैप्चर करना ( BCP.EXE , SqlBulkCopy , और मुझे लगता है BULK INSERT , और OPENROWSET(BULK... ) संभव है, लेकिन आप अलग-अलग पंक्तियों और स्तंभों को नहीं देख पाएंगे।

बल्क इंसर्ट ऑपरेशंस एकल के रूप में दिखाई देते हैं (ठीक है, प्रति बैच एक, और डिफ़ॉल्ट एक ही बैच में सभी पंक्तियों को करना है) डीएमएल स्टेटमेंट:

INSERT BULK <destination_table_name> (
      <column1_name> <column1_datatype> [ COLLATE <column1_collation> ], ...
      ) [ WITH (<1 or more hints>) ]

<hints> := KEEP_NULLS, TABLOCK, ORDER(...), ROWS_PER_BATCH=, etc

आप एमएसडीएन पेज पर BCP के लिए "संकेत" की पूरी सूची पा सकते हैं। उपयोगिता . कृपया ध्यान दें कि SqlBulkCopy केवल उन संकेतों के सबसेट का समर्थन करता है (उदा. KEEP_NULLS , TABLOCK , और कुछ अन्य) लेकिन नहीं . करता है समर्थन ORDER(...) या ROWS_PER_BATCH= (जो काफी दुर्भाग्यपूर्ण है, वास्तव में, ORDER() . के रूप में ऑपरेशन को न्यूनतम रूप से लॉग करने की अनुमति देने के लिए tempdb में होने वाले एक प्रकार से बचने के लिए संकेत की आवश्यकता होती है (यह मानते हुए कि इस तरह के ऑपरेशन के लिए अन्य शर्तें भी संतुष्ट हैं)।

इस कथन को देखने के लिए, आपको निम्न में से किसी भी घटना को SQL सर्वर प्रोफाइलर में कैप्चर करना होगा:

आप कम से कम निम्नलिखित कॉलम (एसक्यूएल सर्वर प्रोफाइलर में) का चयन करना चाहेंगे:

और, चूंकि कोई उपयोगकर्ता INSERT BULK . सबमिट नहीं कर सकता है यदि आप केवल इन घटनाओं को देखना चाहते हैं और कुछ नहीं देखना चाहते हैं, तो आप सीधे कॉलम फ़िल्टर में उस पर फ़िल्टर कर सकते हैं।

यदि आप आधिकारिक अधिसूचना देखना चाहते हैं कि एक BULK INSERT ऑपरेशन शुरू हो रहा है और/या समाप्त हो रहा है, तो आपको निम्नलिखित घटना को कैप्चर करने की आवश्यकता है:

और फिर निम्नलिखित प्रोफाइलर कॉलम जोड़ें:

ObjectName के लिए आपको हमेशा "बल्क इंसर्ट" दिखाने वाले ईवेंट मिलेंगे और चाहे वह शुरुआत हो या समाप्ति EventSubClass में मान द्वारा निर्धारित की जाती है , जो या तो "0 - शुरुआत" या "1 - कमिट" है (और मुझे लगता है कि अगर यह विफल रहता है तो आपको "2 - रोलबैक" देखना चाहिए)।

अगर ORDER() संकेत निर्दिष्ट नहीं किया गया था (और फिर, यह नहीं SqlBulkCopy . का उपयोग करते समय निर्दिष्ट किया जाना चाहिए ), तो आपको ObjectName में "sort_init" दिखाते हुए एक "SQLTransaction" ईवेंट भी मिलेगा। कॉलम। इस ईवेंट में "0 - शुरुआत" और "1 - कमिट" ईवेंट भी हैं (जैसा कि EventSubClass में दिखाया गया है) कॉलम)।

अंत में, भले ही आप विशिष्ट पंक्तियों को नहीं देख सकते हैं, फिर भी आप लेन-देन लॉग के विरुद्ध संचालन देख सकते हैं (उदाहरण के लिए पंक्ति सम्मिलित करें, IAM पंक्ति संशोधित करें, PFS पंक्ति संशोधित करें, आदि) यदि आप निम्न ईवेंट को कैप्चर करते हैं:

और निम्नलिखित प्रोफाइलर कॉलम जोड़ें:

रुचि की मुख्य जानकारी EventSubClass . में होगी कॉलम, लेकिन दुर्भाग्य से यह सिर्फ आईडी मान है और मुझे एमएसडीएन दस्तावेज में उन मूल्यों का कोई अनुवाद नहीं मिला। हालांकि, मुझे जोनाथन केहैयस द्वारा निम्नलिखित ब्लॉग पोस्ट मिली: TransactionLog SQL Trace Event को मैप करने के लिए SQL Server Denali CTP1 में एक्सटेंडेड इवेंट्स का उपयोग करना EventSubClass मान

@RBarryYoung ने बताया कि EventSubClass मान और नाम sys.trace_subclass_values में पाए जा सकते हैं कैटलॉग दृश्य, लेकिन उस दृश्य को क्वेरी करने से पता चलता है कि इसमें TransactionLog . के लिए कोई पंक्तियाँ नहीं हैं घटना:

SELECT * FROM sys.trace_categories -- 12 = Transactions
SELECT * FROM sys.trace_events WHERE category_id = 12 -- 54 = TransactionLog
SELECT * FROM sys.trace_subclass_values WHERE trace_event_id = 54 -- nothing :(

कृपया ध्यान दें कि SqlBulkCopy.BatchSize संपत्ति -b . को सेट करने के बराबर है BCP.EXE . के लिए विकल्प , जो एक परिचालन सेटिंग है जो नियंत्रित करती है कि प्रत्येक कमांड पंक्तियों को सेट में कैसे विभाजित करेगा। यह ROWS_PER_BATCH= के समान नहीं है संकेत जो भौतिक रूप से नियंत्रित नहीं करता है कि पंक्तियों को सेट में कैसे विभाजित किया जाता है, बल्कि इसके बजाय SQL सर्वर को बेहतर योजना बनाने की अनुमति देता है कि यह कैसे पृष्ठों को आवंटित करेगा, और इसलिए लेनदेन लॉग में प्रविष्टियों की संख्या को कम करता है (कभी-कभी काफी थोड़ा)। फिर भी मेरे परीक्षण से पता चला कि:

  • निर्दिष्ट करना -b BCP.EXE . के लिए ROWS_PER_BATCH= सेट किया था उसी मान की ओर इशारा करें।
  • SqlBulkCopy.BatchSize निर्दिष्ट करना संपत्ति नहीं थी ROWS_PER_BATCH= सेट करें संकेत, लेकिन, कम लेनदेन लॉग गतिविधि का लाभ किसी तरह निश्चित रूप से था (जादू?) तथ्य यह है कि शुद्ध प्रभाव अभी भी लाभ प्राप्त करना है, इसलिए मैंने शीर्ष पर इसका उल्लेख नहीं किया जब मैंने कहा कि यह दुर्भाग्यपूर्ण था कि ORDER() संकेत SqlBulkCopy द्वारा समर्थित नहीं था ।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RAISERROR में संदेश को संयोजित करें

  2. LINQ + TransactionScope SQL सर्वर प्रोफाइलर में अलगाव स्तर नहीं बदलेगा

  3. अटैचमेंट के साथ डेटाबेस ईमेल (एक्सेल फाइल / पीडीएफ फाइल)?

  4. SQL सर्वर डेटाबेस में स्टेटमेंट डालें

  5. SQL सर्वर गैर-अद्वितीय क्लस्टर इंडेक्स में 4 बाइट पूर्णांक क्यों जोड़ता है