The bindsize and readsize parameters are related to each other. If you specify a BINDSIZE that is smaller than the size you specified for READSIZE, the BINDSIZE value will be automatically increased to the specified value of READSIZE. If the READSIZE value specified is smaller than the BINDSIZE value, the READSIZE value will be increased.
So, we usually specify only the BINDSIZE parameter.
In general, larger bind arrays improve performance. The documentation says that “In general, you gain large improvements in performance with each increase in the bind array size up to 100 rows. Increasing the bind array size to be greater than 100 rows generally delivers more modest improvements in performance. The size (in bytes) of 100 rows is typically a good value to use.”
We made many tests about this in the past, and in our case, that was true, so we ended up using a bind array of about the size of 100 rows, but this could be different in your case, so I would recommend to make some tests to find what sizes offer better performance.
The ROWS parameters can also be used for this. As part of its initialization, SQL*Loader determines the space required to load a single row, and then multiplies that size by the number of rows specified for the load. <i> “If the number of rows and the maximum bind array size are both specified, SQL*Loader always uses the smaller value for the bind array.”</i>
So, you could start using the ROWS and/or the BINDSIZE parameters only, to see what happens and how load speed varies when varying that parameter.
<pre>sqlldr user@database control=your_control.ctl rows=100 bindsize=2000000</pre>
(assuming that 2000000 is enough for about 100 rows)
Hope this helps.