2009-02-21 14 views
14

Uso SQL Server 2005 come archivio dati per un sacco di dati su cui lavoro analitico. Questo non è un database transazionale in quanto non lo sto colpendo con aggiornamenti o acquisendo dati in tempo reale. Ottengo qualche concerto di dati dai miei clienti, li carico in SQL Server e faccio una serie di manipolazioni. Prendo quindi alcuni di questi dati e li inserisco in R, dove faccio la maggior parte delle mie analisi. Quindi spingo un po 'di dati in tabelle in SQL Server e forse faccio un join o due.Rendi SQL Server più veloce nella manipolazione dei dati - disattiva la registrazione delle transazioni?

Ho un bel po 'di tempo con i log di SQL Server che diventano grandi e presumo che ci voglia un po' di overhead per crearli. Come posso configurare SQL Server in modo che venga eseguito con poca o nessuna registrazione? Se le cose si corrompono, sono felice di iniziare dall'inizio. Qualche idea su come rendere tutto più veloce?

BTW, non c'è bisogno di dirmi come ridurre i registri, lo sto già facendo. Ma vorrei che non dovessi fare i log in primo luogo. Sto solo utilizzando il DB per ospitare i dati perché è troppo grande per adattarsi alla memoria in R.

Dovrei utilizzare un DB più semplice del server Sql? Sentiti libero di dirmi che sto uccidendo una formica con un martello. Ma per favore raccomandate un martello di dimensioni più appropriate. :)

+0

Perché si vuole essere restrittiva con strizzacervelli di file di database: http://www.karaszi.com/SQLServer/info_dont_shrink.asp – JohnB

risposta

9

Come configurare SQL Server in modo che venga eseguito con registrazione minima o nulla? I

Non credo che si possa.

Tuttavia, se si configura il database (ciascun database su un server può essere diverso) per i backup semplici il file di registro non crescerà finché non lo si esegue il backup. Questo viene fatto impostando la modalità di ripristino su "semplice".

Con semplici backup il registro viene utilizzato solo per conservare lo stato delle transazioni fino a quando non vengono completamente scritte nel database principale.

+0

Questo può essere quello che devo fare. Grazie per la risposta molto veloce. –

5

È possibile ridurre al minimo il consumo del registro nel server SQL modificando il modello di recupero del database in modo semplice per visualizzare questo link. Dal momento che non hai a che fare con la concorrenza e le transazioni hai considerato Microsoft Access?

+0

Mi sono spostato su SQL Server perché stavo regolarmente sbattendo la testa sul limite di 2 GB in Access. Ho quasi fatto questa domanda sotto forma di "come posso far sì che SQL Server si comporti più come Access", ma temevo che avrei ottenuto molte informazioni su come Access succhi, yada yada. Ho solo bisogno di un buon archivio di dati! –

+0

È possibile suddividere i dati in più file di database di Access? La semantica della tabella collegata in Access renderebbe molto semplice e logicamente valido impostare un file principale che faccia riferimento a diversi file di dati Access per bambini. – James

+1

Una buona idea, ma la disponibilità di più tabelle di accesso sarebbe un kludge totale che ostacolerebbe l'analisi. Avere questo in SQL Server mi consente anche di inviare le costose query a un server più potente. L'accesso mi richiederebbe di eseguire tali query sul computer client. –

2

per ridurre al minimo la registrazione utilizzare il modello di recupero semplice e svolgere il lavoro in lotti.

+0

Stavo rileggendo queste risposte e la menzione dei lotti ha attirato la mia attenzione. Puoi darmi più informazioni su cosa intendi facendo in lotti? Se faccio un lungo script con 30 passaggi è diverso dall'eseguire 30 script? Grazie per l'aiuto. –

+0

per lotti intendo per esempio se devi aggiornare/eliminare 50.000 righe farlo in gruppi di 1000. e ogni lotto nella sua propria transazione. puoi farlo con un ciclo while. per gli inserti utilizzare le funzionalità di inserimento in blocco. –

+1

nel mondo reale, almeno in Oracle (ahi!), È sempre più veloce elaborare i dati come set completo, non dividerlo in piccoli morsi. I COMMIT funzionano, così come le transazioni iniziali e finali. Un altro consiglio è che il modo più rapido per aggiornare TUTTI (o la maggior parte) delle righe in una tabella è creare una nuova tabella. –

6

Un modo per evitare la registrazione quando si lavora con insiemi di dati di grandi dimensioni, sta usando SELECT/INTO. Creerà una nuova tabella ma nessuno di questi verrà registrato.

ci sono alcune cose da tenere d'occhio in questo modo:

  • colonne calcolate diventano colonne di dati regolari dovrebbe essere stabilita anche

  • di indicizzazione e di identità colonne Se fatto correttamente può salvare non solo lo spazio ma il tempo di elaborazione.

    L'alternativa è qualcosa di simile a quello che sto facendo in questo momento, come un esempio:

    UPDATE [MyTable] 
    SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 
    

    funziona bene, ma aggiorna l'intera tabella creando una serie enorme di transazione, invece si può fare:

    DECLARE @IDs TABLE ([id] int) 
    DECLARE @Batch TABLE ([id] int) 
    
    INSERT INTO @IDs ([ID]) SELECT [ID] FROM [MyTable] 
    
    WHILE EXISTS (SELECT TOP 1 [ID] FROM @IDs) 
    BEGIN 
        INSERT INTO @Batch ([ID]) SELECT TOP 1000 [Id] FROM @IDS 
    
        UPDATE [MyTable] 
        SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 
        WHERE [Id] IN (SELECT [Id] FROM @Batch) 
    
        DELETE @IDs WHERE [Id] IN (SELECT [Id] FROM @Batch) 
        DELETE @Batch 
    END 
    

    Questo aggiorna la tabella 1.000 righe alla volta mantenendo le dimensioni della transazione verso il basso.

  • 3

    Non renderete il vostro SQL Server quasi più veloce disattivando la registrazione delle transazioni, ma le dimensioni del registro possono essere ridotte andando alla modalità di recupero con registrazione semplice o in blocco, come già suggerito da altri.

    La mia opinione su questo è che non si dovrebbe mai girare la modalità di recupero completo tranne in casi speciali come il tuo quando non è assolutamente necessario.

    Il motivo principale per questo è che il registro delle transazioni in pieno recupero può essere l'unica speranza di ripristino in caso di accidentalmente eseguito UPDATE, DELETE o TRUNCATE in cui non si dispone di backup o tutti i dati non sono nei backup.

    Ci sono diversi thread su questo argomento in cui il log delle transazioni di lettura era l'ultima speranza per il ripristino.

    How can I rollback an UPDATE query in SQL server 2005?

    How to undo a delete operation in SQL Server 2005?

    Ancora una volta, nel tuo caso specifico questo probabilmente non è un problema, ma la mia ipotesi è che può essere utile ad altri.

    -1

    codice utilizzando EntityFramework per configurare il database come Richards risposta descrive:

    using (var dbInstance = new YourEntityFrameworkDB_Context()) 
    { 
        var sqlConfigConn = dbInstance.Database.Connection as SqlConnection; 
        sqlConfigConn.Open(); 
    
        using (var sqlCmd = new SqlCommand()) 
        { 
         sqlCmd.Connection = sqlConfigConn as SqlConnection; 
         sqlCmd.CommandText = String.Format("ALTER DATABASE model SET RECOVERY SIMPLE"); 
         var result = sqlCmd.ExecuteNonQuery(); 
        } 
        sqlConfigConn.Close(); 
    } 
    

    e di verificare se fosse successo solo iniziare Management Studio ed eseguire: Screenshot Management Studio


    EDIT Feb 2018:

    MSDN descrizione abo ut il modello di recupero

    ╔══════════╦══════════════════════╦══════════════════════════════════════════╗ 
    ║ Recovery ║ Description  ║  Recover to a point in time?   ║ 
    ║ model ║      ║           ║ 
    ╠══════════╬══════════════════════╬══════════════════════════════════════════╣ 
    ║ Simple ║ No log backups  ║ Can recover only to the end of a backup. ║ 
    ║   ║      ║           ║ 
    ║ Full  ║ Requires log backups ║ Can recover to a specific point in time, ║ 
    ║   ║      ║ assuming that your backups are complete ║ 
    ║   ║      ║ up to that point in time.    ║ 
    ║   ║      ║           ║ 
    ║ Bulk  ║ Requires log backups ║ Can recover to the end of any backup. ║ 
    ║ logged ║      ║           ║ 
    ╚══════════╩══════════════════════╩══════════════════════════════════════════╝ 
    
    Problemi correlati