I am performing some test on sql server and I want to get the best insert speed possible. The statement I use is something like this:
INSERT INTO db_Test_databse..tbl_test with(rowlock)
( joinid, date_key,
col1, col2,col3,col4, col5, col6, col7, col8, col9, col10, ...
)
SELECT tabid as joinid,
date_key,
rec_type,
col2,
dbo.udf_convert_hex_to_dec(col3),
col4, col5, col6, col7, col8,
dbo.udf_convert_hex_to_dec(col9),
dbo.udf_convert_hex_to_dec(col10),
...
from source_table f
There are 25 columns; most of them are of type bigint or int.
I dropped all indexes from the destination table except the primary key which is an identity field.
Any tips on how to improve the performance more?
P.s. In this form I have an average speed of 16.000 rows / sec.
To get the best possible performance you should:
Are multiple clients inserting records in parallel? If so then you should also consdier the locking implications.
Note that SQL Server can suggest indexes for a given query either by executing the query in SQL Server Management Studio or via the Database Engine Tuning Advisor. You should do this to make sure you haven't removed an index which SQL Server was using to speed up the INSERT
.
If this still isn't fast enough then you should consider grouping up inserts an using BULK INSERT
instead (or something like the bcp utility or SqlBulkCopy
, both of which use BULK INSERT
under the covers). This will give the highest throughput when inserting rows.
Also see Optimizing Bulk Import Performance - much of the advice in that article also applies to "normal" inserts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With