यह स्थिति असामान्य नहीं है जब एक्सेस में ओडीबीसी लिंक्ड टेबल के लिए थोक INSERTs से निपटते हैं। निम्नलिखित एक्सेस क्वेरी के मामले में
INSERT INTO METER_DATA (MPO_REFERENCE)
SELECT MPO_REFERENCE FROM tblTempSmartSSP
जहां [METER_DATA] एक ODBC लिंक्ड टेबल है और [tblTempSmartSSP] एक स्थानीय (मूल) एक्सेस टेबल है, ODBC कुछ हद तक सीमित है कि यह कितना चतुर हो सकता है क्योंकि इसे लक्ष्य डेटाबेस की एक विस्तृत श्रृंखला को समायोजित करने में सक्षम होना चाहिए जिनकी क्षमताएं भिन्न हो सकती हैं बहुत। दुर्भाग्य से, इसका अक्सर मतलब होता है कि सिंगल एक्सेस SQL स्टेटमेंट के बावजूद जो वास्तव में रिमोट (लिंक्ड) डेटाबेस को भेजा जाता है, वह एक अलग INSERT (या समकक्ष) होता है स्थानीय तालिका में प्रत्येक पंक्ति के लिए . स्वाभाविक रूप से, यह बहुत धीमा साबित हो सकता है यदि स्थानीय तालिका में बड़ी संख्या में पंक्तियाँ हों।
विकल्प 1:दूरस्थ डेटाबेस में नेटिव बल्क इंसर्ट्स
डेटा के बल्क लोडिंग के लिए सभी डेटाबेस में एक या अधिक नेटिव मैकेनिज्म होते हैं:Microsoft SQL सर्वर में "bcp" और BULK INSERT
होता है। , और Oracle में "SQL*Loader" है। ये तंत्र थोक संचालन के लिए अनुकूलित हैं और आमतौर पर महत्वपूर्ण गति लाभ प्रदान करेंगे। वास्तव में, यदि डेटा को एक्सेस में आयात करने और दूरस्थ डेटाबेस में स्थानांतरित होने से पहले "मालिश" करने की आवश्यकता होती है, तो संशोधित डेटा को वापस टेक्स्ट फ़ाइल में डंप करना और फिर इसे दूरस्थ डेटाबेस में थोक आयात करना तेज़ हो सकता है।पी>
विकल्प 2:एक्सेस में पास-थ्रू क्वेरी का उपयोग करना
यदि थोक आयात तंत्र एक व्यवहार्य विकल्प नहीं है, तो एक और संभावना है कि एक समय में एक से अधिक पंक्तियों को सम्मिलित करने वाले INSERT कथनों का उपयोग करके डेटा अपलोड करने के लिए एक्सेस में एक या अधिक पास-थ्रू क्वेरीज़ का निर्माण किया जाए।
उदाहरण के लिए, यदि दूरस्थ डेटाबेस SQL सर्वर (2008 या बाद का) था तो हम इस तरह एक एक्सेस पास-थ्रू (T-SQL) क्वेरी चला सकते थे
INSERT INTO METER_DATA (MPO_REFERENCE) VALUES (1), (2), (3)
एक INSERT कथन के साथ तीन पंक्तियाँ सम्मिलित करने के लिए।
एक अन्य पहले के प्रश्न के उत्तर के अनुसार यहाँ Oracle के लिए संगत सिंटैक्स होगा
INSERT ALL
INTO METER_DATA (MPO_REFERENCE) VALUES (1)
INTO METER_DATA (MPO_REFERENCE) VALUES (2)
INTO METER_DATA (MPO_REFERENCE) VALUES (3)
SELECT * FROM DUAL;
मैंने 10,000 पंक्तियों वाली एक देशी [tblTempSmartSSP] तालिका का उपयोग करके SQL सर्वर (क्योंकि मेरे पास Oracle डेटाबेस तक पहुंच नहीं है) के साथ इस दृष्टिकोण का परीक्षण किया। कोड ...
Sub LinkedTableTest()
Dim cdb As DAO.Database
Dim t0 As Single
t0 = Timer
Set cdb = CurrentDb
cdb.Execute _
"INSERT INTO METER_DATA (MPO_REFERENCE) " & _
"SELECT MPO_REFERENCE FROM tblTempSmartSSP", _
dbFailOnError
Set cdb = Nothing
Debug.Print "Elapsed time " & Format(Timer - t0, "0.0") & " seconds."
End Sub
... मेरे परीक्षण वातावरण में निष्पादित होने में लगभग 100 सेकंड लगे।
इसके विपरीत निम्न कोड, जो ऊपर वर्णित अनुसार बहु-पंक्ति INSERT बनाता है (जिसे Microsoft टेबल वैल्यू कंस्ट्रक्टर कहता है) ...
Sub PtqTest()
Dim cdb As DAO.Database, rst As DAO.Recordset
Dim t0 As Single, i As Long, valueList As String, separator As String
t0 = Timer
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset("SELECT MPO_REFERENCE FROM tblTempSmartSSP", dbOpenSnapshot)
i = 0
valueList = ""
separator = ""
Do Until rst.EOF
i = i + 1
valueList = valueList & separator & "(" & rst!MPO_REFERENCE & ")"
If i = 1 Then
separator = ","
End If
If i = 1000 Then
SendInsert valueList
i = 0
valueList = ""
separator = ""
End If
rst.MoveNext
Loop
If i > 0 Then
SendInsert valueList
End If
rst.Close
Set rst = Nothing
Set cdb = Nothing
Debug.Print "Elapsed time " & Format(Timer - t0, "0.0") & " seconds."
End Sub
Sub SendInsert(valueList As String)
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("METER_DATA").Connect
qdf.ReturnsRecords = False
qdf.sql = "INSERT INTO METER_DATA (MPO_REFERENCE) VALUES " & valueList
qdf.Execute dbFailOnError
Set qdf = Nothing
Set cdb = Nothing
End Sub
... समान परिणाम देने में 1 से 2 सेकंड का समय लगा।
(टी-एसक्यूएल टेबल वैल्यू कंस्ट्रक्टर्स एक बार में 1000 पंक्तियों को सम्मिलित करने तक सीमित हैं, इसलिए उपरोक्त कोड इससे थोड़ा अधिक जटिल है।)