Livelli di isolmento annidati su due database diversi

mercoledì 04 maggio 2016 - 16.44
Tag Elenco Tags  C#  |  SQL Server 2008 R2

dompa72 Profilo | Senior Member

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

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

>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

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

>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
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5