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

एक्सएमएल प्रदर्शन युक्तियाँ

XQuery का उपयोग करके XML से डेटा पार्स करना एक नियमित अभ्यास है। इसे सबसे प्रभावी ढंग से करने के लिए, थोड़े प्रयास की आवश्यकता है।

मान लीजिए कि हमें निम्न संरचना के साथ डिस्क फ़ाइल से डेटा पार्स करने की आवश्यकता है:

<tables>
<table name="Accounting" schema="Production" object="Accounting">
<column name="Date" order="3" visible="1" />
<column name="DateFrom" order="5" visible="1" />
<column name="DateTo" order="6" visible="1" />
<column name="Description" order="4" visible="1" />
<column name="DocumentUID" order="1" visible="0" />
<column name="Number" order="2" visible="1" />
<column name="Warehouse" order="7" visible="1" />
</table>
</tables>

यदि आप किसी फ़ाइल से डेटा पढ़ना चाहते हैं, तो बल्क इंसर्ट का उपयोग करें:

SELECT BulkColumn
FROM OPENROWSET(BULK 'D:\data.xml', SINGLE_BLOB) x sample xml file

एक नमूना xml फ़ाइल यहाँ है।

हालांकि, एक खास बात का ध्यान रखें... डेटा को सीधे पढ़ने की कोशिश न करें:

;WITH cte AS
(
SELECT x = CAST(BulkColumn AS XML)
FROM OPENROWSET(BULK 'D:\data.xml', SINGLE_BLOB) x
)
SELECT t.c.value('@name', 'VARCHAR(100)')
FROM cte
CROSS APPLY x.nodes('tables/table') t(c)

एक चर के लिए डेटा असाइन करें। इस तरह आप एक अधिक कुशल निष्पादन योजना प्राप्त कर सकते हैं:

DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'D:\data.xml', SINGLE_BLOB) x

SELECT t.c.value('@name', 'VARCHAR(100)')
FROM @xml.nodes('tables/table') t(c)

परिणामों की तुलना करें:

Table 'Worktable'. Scan count 0, logical reads 729, physical reads 0, read-ahead reads 0, lob logical reads 62655,...
SQL Server Execution Times:
CPU time = 1203 ms, elapsed time = 1214 ms.

Table 'Worktable'. Scan count 0, logical reads 7, physical reads 0, read-ahead reads 0, lob logical reads 202,....
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 4 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 3 ms.

जैसा कि आप देख सकते हैं, दूसरा विकल्प काफी तेज है।

XQuery के साथ काम करते समय SQL सर्वर की एक अन्य महत्वपूर्ण विशेषता यह है कि मूल तत्व को पढ़ने से खराब प्रदर्शन हो सकता है। निम्नलिखित उदाहरण पर विचार करें:

SET STATISTICS PROFILE OFF

DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'D:\data.xml', SINGLE_BLOB) x

SET STATISTICS PROFILE ON

SELECT
t.c.value('@name', 'SYSNAME')
, t.c.value('@order', 'INT')
, t.c.value('@visible', 'BIT')
, t.c.value('../@name', 'SYSNAME')
, t.c.value('../@schema', 'SYSNAME')
, t.c.value('../@object', 'SYSNAME')
FROM @xml.nodes('tables/table/*') t(c)

आइए ऑपरेटर से प्राप्त पंक्तियों की वास्तविक संख्या को देखें। मान असामान्य रूप से बड़ा है:

क्रॉस एप्लाई का उपयोग करके अनुरोध को आसानी से अनुकूलित किया जा सकता है:

SELECT
t2.c2.value('@name', 'SYSNAME')
, t2.c2.value('@order', 'INT')
, t2.c2.value('@visible', 'BIT')
, t.c.value('@name', 'SYSNAME')
, t.c.value('@schema', 'SYSNAME')
, t.c.value('@object', 'SYSNAME')
FROM @xml.nodes('tables/table') t(c)
CROSS APPLY t.c.nodes('column') t2(c2)

आइए निष्पादन समय की तुलना करें:

(1408 row(s) affected)
SQL Server Execution Times:
CPU time = 10125 ms, elapsed time = 10135 ms.

(1408 row(s) affected)
SQL Server Execution Times:
CPU time = 78 ms, elapsed time = 156 ms.

जैसा कि आप उदाहरण से देख सकते हैं, क्रॉस एप्लाई के साथ अनुरोध तुरंत काम करता है।

ध्यान देने के लिए आपको धन्यवाद। मुझे आशा है कि यह लेख उपयोगी था। बेझिझक कोई भी प्रश्न पूछें, इस लेख के संबंध में अपनी टिप्पणी और सुझाव दें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL डेटा परिभाषा भाषा

  2. SQL ORDER BY:डेटा को एक पेशेवर की तरह सॉर्ट करने के लिए क्या करें और क्या न करें?

  3. डेटाबेस सर्वर हार्डवेयर रुझान

  4. डेवलपर्स के लिए सर्वश्रेष्ठ डेटाबेस सॉफ्टवेयर (2022 संस्करण)

  5. बिग डेटा की 3 प्रमुख विशेषताओं को समझना