SELECT

venerdì 24 novembre 2006 - 11.00

ANNA79 Profilo | Junior Member

S.O.S
Altro problemino
Devo fare una select sul DB(SQL SERVER) e devo prendere tutti i campi che hanno come
Descrizione TS oppure se questo dato nn esiste nella colonna descrizione utilizzo come condizione i campi presenti nella colonna descizioneBreve.
Io ho scritto questa sinitassi qui ma non so se è giusta perchè in esecuzione non ho problemi di errori ma la select eseguita dura tantissimo tempo per poi darmi un messaggio di
sessione scaduta.


AND (Sigla.descrizione LIKE 'TS%')OR(Sigla.descrizioneBreve LIKE 'TS%')


grazie Anna

lbenaglia Profilo | Guru

>S.O.S
>Altro problemino
>Devo fare una select sul DB(SQL SERVER) e devo prendere tutti
>i campi che hanno come
>Descrizione TS oppure se questo dato nn esiste nella colonna
>descrizione utilizzo come condizione i campi presenti nella colonna
>descizioneBreve.

Ciao Anna,

devi prendere LE RIGHE o LE COLONNE? C'è una differenza abissale tra le due cose.

>Io ho scritto questa sinitassi qui ma non so se è giusta perchè
>in esecuzione non ho problemi di errori ma la select eseguita
>dura tantissimo tempo per poi darmi un messaggio di
>sessione scaduta.
>
>
>AND (Sigla.descrizione LIKE 'TS%')OR(Sigla.descrizioneBreve LIKE
>'TS%')

Questo argomento di ricerca restituisce tutte le righe che hanno le colonne Descrizione oppure DescrizioneBreve che iniziano con la stringa "TS".
E' questo il risultato che vuoi ottenere?

Per quanto concerne le prestazioni non possiamo aiutarti date le pochissime informazioni che ci hai fornito. Posta un esempio completo con la struttura della tabella (CREATE TABLE...), alcune righe di prova (INSERT INTO...), il result set che vuoi ottenere e vedremo il da farsi.

>grazie Anna
Prego.

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

ANNA79 Profilo | Junior Member

Questo argomento di ricerca restituisce tutte le righe che hanno le colonne Descrizione oppure DescrizioneBreve che iniziano con la stringa "TS".
E' questo il risultato che vuoi ottenere?


è proprio questo quello che voglio ottenere..prendere tutte le righe che hanno le colonne Descrizione o descrizione breve che iniziano con la "TS"

ora posto tutta la select che faccio:

select distinct utente.id, utente.cognome, utente.nome, utente.notericerca, sedeimmobile.sedeimmobile, sigla.descrizione, numero.numero
from utente, sedeimmobile, sigla, relutentenumero, numero, azienda, gruppoazienda
where utente.sedeimmobile = sedeimmobile.id
and utente.sigla=sigla.id
and utente.id=relutentenumero.utente
and relutentenumero.numero=numero.id
and gruppoazienda.id=azienda.gruppoazienda
and utente.azienda=azienda.id
and Utente.DataCancellazione is null
and CodiceVisualizzazione in (1,2,3)
AND (Sigla.Descrizione like 'TS%') OR (Sigla.DescrizioneBreve like 'TS%')
and relutentenumero.flgPrimoNumero=1



La cosa che non capisco è che se faccio questa OR sulla tabella Sigla mi da i risultati desiderati, invece con questa select e con queste join mi si incanta l'esecuzione
Purtroppo scrivere la struttura di tutte queste tabelle è impossibile e sono consapevole che non puoi aiutermi sulle prestazioni...pensavo fosse un problema di impostazione della select ma provandola sulla singola tabella ho visto che mi funzionava....vabbè ti ringrazio
Anna



lbenaglia Profilo | Guru

>select distinct utente.id, utente.cognome, utente.nome, utente.notericerca,
>sedeimmobile.sedeimmobile, sigla.descrizione, numero.numero
>from utente, sedeimmobile, sigla, relutentenumero, numero, azienda,
>gruppoazienda
>where utente.sedeimmobile = sedeimmobile.id
>and utente.sigla=sigla.id
>and utente.id=relutentenumero.utente
>and relutentenumero.numero=numero.id
>and gruppoazienda.id=azienda.gruppoazienda
>and utente.azienda=azienda.id
>and Utente.DataCancellazione is null
>and CodiceVisualizzazione in (1,2,3)
>AND (Sigla.Descrizione like 'TS%') OR (Sigla.DescrizioneBreve
>like 'TS%')
>and relutentenumero.flgPrimoNumero=1
>
>
>
>La cosa che non capisco è che se faccio questa OR sulla tabella
>Sigla mi da i risultati desiderati, invece con questa select
>e con queste join mi si incanta l'esecuzione

Ehm...non ho capito quello che hai scritto
Quella OR appesantisce tantissimo il piano di esecuzione della query (già pesante di suo visto il numero di JOIN e dell'aggregazione causata dalla DISTINCT).

>Purtroppo scrivere la struttura di tutte queste tabelle è impossibile
>e sono consapevole che non puoi aiutermi sulle prestazioni...
Qua sbagli di grosso. Conoscere la struttura delle tabelle, i constraint, gli indici potrebbe portare ad un tuning più efficace.
Comunque vista la complessità del discorso, bisognerebbe trovarsi sulla macchina per sperimentare con calma...

>pensavo
>fosse un problema di impostazione della select ma provandola
>sulla singola tabella ho visto che mi funzionava....vabbè ti
>ringrazio
Eseguila da Query Analyzer e guarda il piano di esecuzione. In base a quello intervieni a reindicizzare opportunamente le tabelle (ad esempio definendo un indice su tutte le FK che di default non lo sono, inoltre sperimenta con indici di copertura, ecc..), scomponi la query in 2 query distinte che filtrino per Descrizione e per DescrizioneBreve unendole con una UNION e raggruppando il tutto eliminando quella bruttissima OR, e confronta il piano di esecuzione con il precedente.

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

marcovivio Profilo | Expert

Hai controllato se hai messo tutte le condizioni per fare la join esatta tra le tabelle. Può essere che si incanti perché ha una quantità enorme di record da elaborare, oppure perché, mancandogli una condizione fondamentale, si ritrova ad eseguire una query che genera un risultato 1000 volte più grande.
Una volta io ho fatto una cosa simile e pensa, in una query che legava insieme 2 tabelle (solo 2!) di circa 30000 record l'uno, ho dovuto sospendere l'esecuzione della select perché si era inchiodato dopo aver selezionato quasi 2 MILIONI (!!!) di record.
Così mi sono accorto che mancava una condizione alla where..-
Prova a dare un'occhiata.
Ciao ciao
MV

ANNA79 Profilo | Junior Member

Ho risolto impostando la condizione in questa maniera:



AND (Sigla.Descrizione like 'TC%' OR Sigla.DescrizioneBreve like 'TC%')


cioè mettendo la OR all'interno delle parentesi poichè esterna e come se facesse il doppio del lavoro nella ricerca dei campi



grazie a tutti
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