Memoria insufficiente su istruzione openrowset

mercoledì 21 luglio 2010 - 10.43
Tag Elenco Tags  SQL Server Express

zeropower Profilo | Newbie

Salve a tutti ho fatto una procedura che mi aggiorna un Db su sqlexpress 2005 da dei file dbf del gestionale Arca utilizzando ole db con istruzioni openrowset.
Le tabelle da aggiornare sono circa una quindicina, una tabella risulta particolarmente onerosa il file dbf è circa di 600/700 mb.
Dal visualizzatore eventi sqlexpress restituisce sempre errori di memoria insufficiente anche se poi le operazioni vanno a buon fine.
( secondo me appesantendo successivamente sql).
Talvolta l'operazion di aggiornamento si blocca senza motivo apparente.

se qualcuno ha qualche ideaa....

grazie

lbenaglia Profilo | Guru

>Salve a tutti ho fatto una procedura che mi aggiorna un Db su
>sqlexpress 2005 da dei file dbf del gestionale Arca utilizzando
>ole db con istruzioni openrowset.
>Le tabelle da aggiornare sono circa una quindicina, una tabella
>risulta particolarmente onerosa il file dbf è circa di 600/700
>mb.

Ciao,

SQL Server 2005 Express Edition è in grado di allocare al più 1GB di RAM e non vorrei che sia proprio questa limitazione a generare gli errori di memoria insufficiente.

>Talvolta l'operazion di aggiornamento si blocca senza motivo
>apparente.
Trovi qualche errore nell'error log di SQL Server o nell'event log di sistema?

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zeropower Profilo | Newbie

Ciao Lorenzo
grazie per l'interessamento.
non riesco ad aprire il log degli errori di sql server sul server di produzione.
è installato il management express non so se manca qualcosa ma quando tento di aprire il log non succede niente e con il tasto dx del mouse ho nel menu solo 'aggiorna'.

nell'event log di windows l'errore è 'Memoria di sistema insufficiente per l'esecuzione della query.'
ripetuto varie volte.
le query sono del tipo
INSERT into Anagrafe# ( **** tutti i campi *** ) SELECT **** tutti i campi *** FROM OPENrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver; SourceDB=C:\dbf; SourceType = DBF ','select **** tutti i campi *** from Anagrafe ')
con **** tutti i campi *** circa 30 colonne.

una volta dato l'errore il server sembra mantenere alto l'utilizzo della memoria.

Grazie ancora..

lbenaglia Profilo | Guru

>non riesco ad aprire il log degli errori di sql server sul server
>di produzione.
>è installato il management express non so se manca qualcosa ma
>quando tento di aprire il log non succede niente e con il tasto
>dx del mouse ho nel menu solo 'aggiorna'.
Il file ERRORLOG lo puoi aprire con Notepad.

>nell'event log di windows l'errore è 'Memoria di sistema insufficiente
>per l'esecuzione della query.'
>ripetuto varie volte.
>le query sono del tipo
>INSERT into Anagrafe# ( **** tutti i campi *** ) SELECT ****
>tutti i campi *** FROM OPENrowset('MSDASQL','Driver=Microsoft
>Visual FoxPro Driver; SourceDB=C:\dbf; SourceType = DBF ','select
>**** tutti i campi *** from Anagrafe ')
>con **** tutti i campi *** circa 30 colonne.
Ma accodi continuamente le righe?

>una volta dato l'errore il server sembra mantenere alto l'utilizzo
>della memoria.
Questo è normale, la memoria verrà rilasciata in base alle richieste del sistema operativo.
Quanta RAM ha il server?

>Grazie ancora..
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zeropower Profilo | Newbie

se ho capito quello che intendi ...

Le operazioni che eseguo sono le seguenti.

Estraggo i dati dai file dbf con la query precedente,
Creando una tabella temporanea, confronto i dati presenti nel db ed aggiorno la tabella.

queste operazioni vengono effettuate per ogni tabella da aggiornare con un ciclo.
effettuo il dispose a fine ciclo e riparto con la tabella successiva .
Ogni operazione viene effettuata con transazione.


il server ha 4gb di ram.

grazie ancora

lbenaglia Profilo | Guru

>Estraggo i dati dai file dbf con la query precedente,
>Creando una tabella temporanea, confronto i dati presenti nel
>db ed aggiorno la tabella.
>
>queste operazioni vengono effettuate per ogni tabella da aggiornare
>con un ciclo.
>effettuo il dispose a fine ciclo e riparto con la tabella successiva
Perché non esegui queste operazioni lato server senza ricorrere ad alcun ciclo?
Che tipo di verifiche fai per stabilire se una riga va inserita o meno?

>grazie ancora
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zeropower Profilo | Newbie


in effetti potrei farlo fare internamente a sql. hai ragione.
non ci avevo pensato.

Le operazioni da fare sono diverse in quanto il database è collegato ad un servizio web che serve delle procedure installate su client remoti con una copia locale del db.

estraggo da una tabella la lista delle tabelle da aggiornare, (compresi i campi e le varie clausole where)
compongo il ciclo dinamicamente.
verifico il timestamp della riga , per verificare se questa è stata modificata.

Creo una tabella dei record presenti nel mio db e non più sui file dbf per poterli eliminare dai client.

Poi ho controllato ed ultimamente non aggiorno la tabella ma una volta salvata la tabella temporanea elimino la tabella originale e rinomino la tabella temporanea che diventa la tabella definitiva.

ciao

lbenaglia Profilo | Guru

>Poi ho controllato ed ultimamente non aggiorno la tabella ma
>una volta salvata la tabella temporanea elimino la tabella originale
>e rinomino la tabella temporanea che diventa la tabella definitiva.

Quindi ad ogni giro importi 6/700MB di dati? Non mi sembra una soluzione "furba"
Se avessi la possibilità di passare a SQL Server 2008 potrebbe tornarti utile il comando MERGE:
http://technet.microsoft.com/en-us/library/bb510625.aspx

In questo modo potresti importare solo le righe modificate direttamente nelle tabelle di destinazione senza passare da tabelle temporanee.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zeropower Profilo | Newbie

La tabella di quelle dimensioni è solamente una , le altre sono molto più piccole da poche centinaia di record a qualche migliao al max.

Ciao e grazie di tutto
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5