Timeout scaduto utilizzando SqlBulkCopy quando ci sono 300 milioni di righe nel database SQL Server

sql sqlbulkcopy timeout

Domanda

Non stavo riscontrando problemi nell'inserire ~ 15000 righe nel database SQL Server quando si utilizza SQLBulkCopy in determinate condizioni in cui sono presenti 183 milioni di righe esistenti nel database.

Ma quando c'erano 300M di file esistenti nel database, ho riscontrato l'eccezione:

Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde.

Nota che non ci sono vincoli o altro. È solo una tabella denormalizzata.

using (var sqlBulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, null))
            {
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID,
                    SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP,
                    SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS,
                    SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS,
                    SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE);
                sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE,
                    SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE);

                sqlBulkCopy.DestinationTableName =
                    SqlServerDatabaseStrings.SQL_TABLE_HISTORYSAMPLEVALUES;
                sqlBulkCopy.WriteToServer(historySampleValuesDataRow);
                sqlBulkCopy.Close();

            }

Qualche idea su cosa sta succedendo? BTW, SQL Server Standard è quello che sto usando

Risposta accettata

Hai 2 proprietà sul tuo oggetto sqlBulkCopy che possono aiutarti

  • BulkCopyTimeout: questo è il valore del timeout, 30 secondi per impostazione predefinita. Impostare questo valore su 0 per disabilitare completamente il timeout.
  • BatchSize: invece di inserire 300MM direttamente nella tabella, inserisce i record a una dimensione in batch, forse 1MM / volta per evitare il problema di timeout (e facilitare il caricamento un po ')

Riferimenti:



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché