Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Livelli di isolmento annidati su due database diversi
mercoledì 04 maggio 2016 - 16.44
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
C#
|
SQL Server 2008 R2
dompa72
Profilo
| Senior Member
245
messaggi | Data Invio:
mer 4 mag 2016 - 16:44
Ciao a tutti,
ho una necessità che non so se è risolvibile........come premessa è pessima
Devo fare una query abbastanza complessa, utilizzando il risultato in modo diverso
Ho pensato di dichiarare una variabile Table (Declare @Table as Table (campo1 int.....)), inserire al''interno di questa il contenuto e fare le ulteriori elaborazioni sulla variabile
ho scritto il codice ma ho notato che se eseguo la query senza popolare la variabile impiega un secondo, mentre se popolo la variabile impiega 12 secondi, purtroppo per il tipo di applicazione questo è un tempo troppo altro considerando anche che il risultato è di 300 record.
ho riscritto il codice cambiando la variabile con una tabella creata nel tempdb, naturalmente creo la tabella, eseguo tutte le elaborazione ed elimino la tabella,in questo caso impiega un secondo per eseguire il tutto.
Quindi tutto a posto.....invece no
ho la necessità di non far leggere ad altri il contenuto della tabella mentre è in esecuzione il batch. Sul database principale la query di selezione deve essere lanciata con il livello di isolamento snapshot, questo per evitare di bloccare record e leggere gli ultimi dati consistenti.
Per questo avevo la necessità di annidare due transazioni diverse per il database utilizzato, ora la cosa complessa utilizzare il livello di isolamento ReadCommited per il database TempDB mentre per il database ufficiale il livello Snapshot
........Non penso che posso avere due transazioni diverse nello comando:
Insert tempdb.dbo.tabella (select * from UFFICIALE.dbo.querycomplessa)
Non penso che ci sia una soluzione di questo tipo.........siete l'ultima speranza
Grazie
ysdemarc
Profilo
| Expert
587
messaggi | Data Invio:
ven 6 mag 2016 - 09:35
2 transazione diverse annidare non credo sia possibile
infatti fino a quando non fai la COMMIT nessuno avrà i dati da te elaborati.
se non vuoi usare tabelle temporanee potresti usare delle subqueries.
Oppure in SQlServer si possono creare tabelle temporanee valide solo fino a che la connessione che l'ha creata sia chiusa e automaticamente si distruggono (in teoria in temdb li vedi con il suffisso ##)
dompa72
Profilo
| Senior Member
245
messaggi | Data Invio:
lun 9 mag 2016 - 14:32
>2 transazione diverse annidare non credo sia possibile
>
>infatti fino a quando non fai la COMMIT nessuno avrà i dati da
>te elaborati.
>
>se non vuoi usare tabelle temporanee potresti usare delle subqueries.
>
>Oppure in SQlServer si possono creare tabelle temporanee valide
>solo fino a che la connessione che l'ha creata sia chiusa e automaticamente
>si distruggono (in teoria in temdb li vedi con il suffisso ##)
Scusa le tabelle temporanee non sono tipi di dati speciali con questa sintassi: Declare @Table as Table (campo1 int.....) ch avevo scritto nella premessa?
Ciao
ysdemarc
Profilo
| Expert
587
messaggi | Data Invio:
lun 9 mag 2016 - 15:16
Ho dovuto ricredermi..
Le tabelle temporanee, in sql server, vanno create come crei una normale tabella e possono essere di due tipi o cioè iniziare con due suffissi # o ##
ad esempio #miatabella oppure ##miatabella
la differenza tra esse sta che nel caso di #miatabella è visibile dall'utente che l'ha creata e distrutta alla chiusura della connessione.
Nel caso invece di ##miatabella è visibile a tutti gli utenti e distrutta quando più nessun utente fa riferimento ad essa e quindi tutte le connessioni che la usano vengono chiuse.
però adesso ricercando ho visto che anche un declare di tipo table crea una tabella temporanea (sinceramente non l'ho mai usato) c'è da vedere se scrive in tempdb o come agisce..
se il problema era la lentezza con un DELCARE @table as table puoi provare invece a fare una CREATE TABLE #TABELLA ...
dompa72
Profilo
| Senior Member
245
messaggi | Data Invio:
lun 9 mag 2016 - 21:06
>Ho dovuto ricredermi..
>
>Le tabelle temporanee, in sql server, vanno create come crei
>una normale tabella e possono essere di due tipi o cioè iniziare
>con due suffissi # o ##
>ad esempio #miatabella oppure ##miatabella
>la differenza tra esse sta che nel caso di #miatabella è visibile
>dall'utente che l'ha creata e distrutta alla chiusura della connessione.
>Nel caso invece di ##miatabella è visibile a tutti gli utenti
>e distrutta quando più nessun utente fa riferimento ad essa e
>quindi tutte le connessioni che la usano vengono chiuse.
>
>però adesso ricercando ho visto che anche un declare di tipo
>table crea una tabella temporanea (sinceramente non l'ho mai
>usato) c'è da vedere se scrive in tempdb o come agisce..
>
>se il problema era la lentezza con un DELCARE @table as table
>puoi provare invece a fare una CREATE TABLE #TABELLA ...
>
Non conoscevo questa possibilità
sul database ufficiale eseguo la query con il livello di isolamento snapshot, se permetto lo snaphot anche per il database tempdb, questa impostazione resta anche dopo il riavvio?
è conveniente utilizzare questo livello sul tempdb?
Grazie
Torna su
Stanze Forum
Elenco Threads
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 !