| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Performance differences, BLOB vs LONG RAW
DA Morgan <damorgan_at_x.washington.edu> wrote in message news:<1108998931.908925_at_yasure>...
> I don't know if it is expected because I don't know what version you
> are using or what you are storing. I've not seen enough of a delta
> to make me investigate further.
I'm using Oracle 10g on Windows 2000. Oracle ODBC driver 10.01.00.02. I've spent a few minutes today settings up a simple test. I have two tables JUNK1 and JUNK2.
JUNK1 contains;
COL1 NUMBER
COL2 NUMBER
COL3 BLOB
JUNK2 contains
COL1 NUMBER
COL2 NUMBER
COL3 LONG RAW
Apart from the different data type for COL3, both tables are
identical. I have listed below a bit of code which uses ADO to insert
20000 rows. For JUNK1 this runs in about 31 seconds. If I change the
command string so it inserts into JUNK2 the time is around 15 seconds.
I've tried the same thing using a recordset to do the insert and have
seen similar difference in performance.
Any ideas?
_ConnectionPtr pConnection = NULL;
_CommandPtr pCommand1 = NULL;
_CommandPtr pCommand2 = NULL;
ParametersPtr pParameters = NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
HRESULT hr = CoInitialize (NULL);
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(bstrConnectionString,"","",
adConnectUnspecified);
CheckHR(hr);
// Create the command
hr = pCommand1.CreateInstance(__uuidof(Command));
pCommand1->putref_ActiveConnection(pConnection);
hr = pCommand1->put_CommandText(_bstr_t(_T("INSERT INTO DBO.JUNK1
(COL1, COL2, COL3) VALUES(?,?,?)")));
hr = pCommand1->put_CommandType(adCmdText);
hr = pCommand1->get_Parameters(&pParameters);
long lTrans = pConnection->BeginTrans();
const int nBatchSize = 1000;
// Do 20000 inserts
for (int n = 0; n < 20000; n++)
{
VARIANT varEmpty;
varEmpty.vt = VT_NULL;
// Put some dummy data into the first two columns
_ParameterPtr pParam;
hr = pParameters->get_Item(variant_t(0l), &pParam); //col1
hr = pParam->put_Value(variant_t(long(n)));
hr = pParameters->get_Item(variant_t(1l), &pParam); // col2
hr = pParam->put_Value(variant_t(long(666)));
// Put some dummy data into the binary data column
const int nBlobSize = 200; // number of bytes
VARIANT vBlob;
vBlob.vt = VT_ARRAY|VT_UI1;
vBlob.parray = ::SafeArrayCreateVector(VT_UI1, 0, nBlobSize);
BYTE* pArrayData = NULL;
hr = ::SafeArrayAccessData(vBlob.parray, (void**) &pArrayData);
if (SUCCEEDED(hr))
{
memset(pArrayData, n, nBlobSize);
::SafeArrayUnaccessData(vBlob.parray);
}
hr = pParameters->get_Item(variant_t(2l), &pParam); // col3
hr = pParam->put_Value(vBlob);//); varEmpty//
variant_t vtRecordsAffected;
VariantInit(&vtRecordsAffected);
long lOptions = adExecuteNoRecords;
hr = pCommand1->Execute(&vtRecordsAffected, &vtEmpty, lOptions);
::SafeArrayDestroy(vBlob.parray);
if (!(n % nBatchSize))
{
hr = pConnection->CommitTrans();
lTrans = pConnection->BeginTrans();
}
}
hr = pConnection->CommitTrans();
Received on Thu Feb 24 2005 - 09:10:33 CST
![]() |
![]() |