Domanda

Sto vedendo alcuni comportamenti in questo momento in SQL Server 2008 R2, e non riesco a decidere se il server è poco efficiente oppure no.

ho creato un test per inserire un numero intero in una tabella, come di seguito definito, 75.000 volte.

dbo.Test1
(
    id INT IDENTITY(1,1)
    , [text] VARCHAR(2000)
    , [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)

Sia il (# codice C sotto) applicazione inserendo i dati e l'istanza di SQL Server sono sulla stessa macchina fisica.

I risultati: il processo sta prendendo quasi 10 minuti per ciclo e inserire i dati. Non proprio sicuro di come questo può essere possibile.

for (int i = 0; i < 75000; i++)
{
     using (SqlConnection connection = new SqlConnection(@"<server>"))
     {
           connection.Open();

           using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
           {
                 command.ExecuteNonQuery();
           }

           connection.Close();
     }
}

EDIT:

Aggiornamento alla domanda come da @ risposta di AaronBertrand.

Quanto è grande io? Come ho specificato, è un intero in un ciclo. Non mi importa di testo che può o non può andare nella colonna di testo.

Che tipo di unità? E 'un 7200 SATA ( http://www.seagate.com/ww/v/index.jsp?vgnextoid=2ee06c02c732f110VgnVCM100000f5ee0a0aRCRD )

è il database piccolo? Sì, questo è un possibile problema.

è il database remoto? Si prega di leggere la domanda più da vicino. Tutto è sulla stessa macchina fisica, proprio di fronte a me. Gli stessi problemi con due scatole attraverso una rete, però, ma io non sto cercando di eseguire il debug problemi di rete in questo momento. Basta SQL Server inserto problemi.

Buona soldi sono sul tema di aumento automatico al momento.

EDIT 2:

Aggiornamento di nuovo.

La macchina è una macchina virtuale? No.

metodo di connessione Application La ricerca che. Dal momento che tutto è sulla stessa macchina, non sono sicuro di come si connette.

Trigger Nessuno

Resource Governor Non configurato.

Profiler Il profiler non mostra qualsiasi ritardi di sorta, che è di sorvegliare i l'inferno fuori di me.

Blocco Questa è l'unica cosa accada, quindi non ci dovrebbe essere alcun blocco o attese, forse escluso attese di registro. Sulla mia casella, tutto è sullo stesso disco fisico. Tuttavia, (grande comunque) su altre caselle con lo stesso problema questo non è il caso, quindi non mi perseguire questo come un problema in questo momento.

È stato utile?

Soluzione

La mia impressione è che ha qualcosa a che fare con la vostra apertura loop e chiusura della connessione 75.000 volte. Forse provare qualcosa di simile e vedere cosa succede:

 using (SqlConnection connection = new SqlConnection(@"<server>"))
 {
       connection.Open();

       using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) VALUES (@i)", connection))
       {
             command.Parameters.Add(new SqlParameter("@i", SqlDbType.Int));
             for (int i = 0; i < 75000; i++) {
                 command.Parameters["@i"].Value = i;
                 command.ExecuteNonQuery();
             }
       }

       connection.Close();
 }

EDIT: Un'altra accelerazione ho trovato è avvolgendo tutte le esecuzioni in un'unica transazione (presumibilmente questo elimina l'overhead di costantemente bloccaggio e sbloccaggio serrature). Fare SqlTransaction trans = connection.BeginTransaction() prima di creare un'istanza tua SqlCommand e trans.Commit() dopo il gioco è fatto. Ecco i tempi di esecuzione sulla mia macchina di sviluppo:

1: 08.14 - Versione originale
0: 33.05 - Modificato per aprire la connessione solo una volta, e riutilizzare lo SqlConnection
0: 11.93 - Modificato per usare una singola transazione

Altri suggerimenti

Quanto è grande io, più o meno? Che tipo di dischi sono alla base di questo, le unità 5400rpm del portatile? È il database minuscolo e incorrere in un sacco di eventi di aumento? Ho il sospetto che ci sia un qualche tipo di problema di configurazione. Ho eseguito il seguente codice in 52 secondi sul mio Win7 VM contro unità 7200rpm.

CREATE TABLE dbo.Test1
(
    id INT IDENTITY(1,1)
    , [text] VARCHAR(2000)
    , [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
);
GO

INSERT dbo.Test1([text]) SELECT 'Not sure how long this text is supposed to be.';
GO 75000

Altre domande: E 'la macchina di una macchina virtuale? È l'applicazione di collegamento via TCP / IP, memoria condivisa, named pipe? Quali altre attività è in corso sulla scatola? Ci sono trigger sul tavolo, risorsa governatore implementato, ecc? Hai controllato sys.dm_exec_requests o profiler per vedere quanto tempo questi singoli inserti sono in realtà prendendo, che altro C # sta inviando al server, e ciò che il blocco o altra attesa potrebbe essere che si verificano?

pensieri, oltre ai "/ connessioni apertura chiusura per ogni iterazione" questione

Ogni inserto invierà un pacchetto con (xx rows affected) che sarà inviato (evebn se non si gestisce esso) a meno di utilizzare SET NOCOUNT ON. Vedere https://stackoverflow.com/q/1483732/27535 su SO per più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top