PRB: RFX_LongBinary Not Optimized for SQL ServerLast reviewed: June 26, 1997Article ID: Q153888 |
The information in this article applies to:
SYMPTOMSPerforming inserts of image fields into a SQL Server table using the MFC database classes may result in less than optimum performance. Other operations involving image fields, such as updates, do not suffer from this reduced performance.
CAUSEMFC's RFX_LongBinary function uses an obsolete method to specify the size of the image field when binding the CLongBinary buffer for the insertion. Due to limitations of the SQL Server driver, MFC will always use SQL statements instead of SQLSetPos functionality to perform inserts of image fields to a recordset opened on a SQL Server database. MFC also uses parameterized insert statements. As a result, SQLBindParameter() is called to bind the CLongBinary variable's buffer to the parameter in the insert statement. MFC specifies that the length of the long binary field is SQL_DATA_AT_EXEC, a symbol that signifies that data will be transferred via SQLPutData() without providing any information about the field's size. The SQL Server driver generates an internal plan for the insert that contains a subquery of the form "SELECT ... LIKE" that results in a table scan that can be quite time- consuming.
RESOLUTIONTo avoid unnecessary table scans when inserting data into image fields, you can modify MFC to use the SQL_LEN_DATA_AT_EXEC() macro that provides information about the size of the image data and thereby minimizes the need for table scans. NOTE: Visual C++ version 5.0 now uses the SQL_LEN_DATA_AT_EXEC() macro.
STATUSThis behavior is by design.
MORE INFORMATIONThe following steps detail one method of making the needed changes in RFX_LongBinary:
REFERENCESODBC Programmer's Reference. |
Keywords : kbinterop kbprg kbusage MfcDatabase
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |