Newsgroup: it.comp.lang.visual-basic
Titolo: OT SQL 2000

Ragazzi e' assurdo ... questa query e' un po incasinata ok ma non capisco
perche se come data di inizio e data di fine le metto diverse ci mette 10
secondi a essere eseguita .. se le due date corrispondono quindi mi
riferisco ad un giorno solo ci mette 5 minuti .... e' assurdo,avete qualche
idea???
il Db e' sql server 2000
SELECT MINRITPERTRRS.AGG_CODICE AS AGGNOMEB, (COUNT(MINRITPERTRRS.NUMTRE) -
SUM(TRENIESCD)) AS MIN5
FROM PPOTRENOCIRC INNER JOIN MINRITPERTRRS ON PPOTRENOCIRC.TRR_ID =
MINRITPERTRRS.NUMTRE INNER JOIN (
SELECT *
FROM REP4
WHERE TIPOAGG = 'S') A ON DBO.MINRITPERTRRS.NUMTRE = A.TRENI
AND DBO.MINRITPERTRRS.AGG_CODICE = A.COMP_NOMEB
WHERE (MINRITPERTRRS.MINUTI <= 5)
AND (PPOTRENOCIRC.TRR_CLT_ID IN (
SELECT CLT_ID
FROM PPOCLASSTRENO
WHERE PPOCLASSTRENO.CLT_ID_AGG = 30
OR PPOCLASSTRENO.CLT_ID_AGG = 31))
AND (PPOTRENOCIRC.TRR_DAT BETWEEN CONVERT(DATETIME, '24/07/2002', 103)
AND CONVERT(DATETIME, '24/07/2002', 103))
AND (PPOTRENOCIRC.TRR_TIPO = 'PO') GROUP BY MINRITPERTRRS.AGG_CODICE,
MINRITPERTRRS.AGG_DESCR
UNION
SELECT 'IR' AS AGGNOMEB, COUNT(RITADESPERTRR.
AND_TRR_ID) AS MIN5
FROM RITADESPERTRR INNER JOIN PPOTRENOCIRC ON RITADESPERTRR.
AND_TRR_ID = PPOTRENOCIRC.TRR_ID
WHERE TRR_OPE_COD='001'
AND (RITADESPERTRR.EXPR1 <= 5)
AND (PPOTRENOCIRC.TRR_TIPO = 'PO')
AND (PPOTRENOCIRC.TRR_CLT_ID IN (
SELECT CLT_ID
FROM PPOCLASSTRENO
WHERE PPOCLASSTRENO.CLT_ID_AGG = 30
OR PPOCLASSTRENO.CLT_ID_AGG = 31))
AND (TRR_DAT BETWEEN CONVERT(DATETIME, '24/07/2002', 103)
AND CONVERT(DATETIME, '24/07/2002', 103))
UNION
SELECT 'TT' AS AGGNOMEB, (COUNT(MINRITPERTRRS.NUMTRE) - SUM(TRENIESCD)) AS
MIN5
FROM PPOTRENOCIRC INNER JOIN MINRITPERTRRS ON PPOTRENOCIRC.TRR_ID =
MINRITPERTRRS.NUMTRE INNER JOIN (
SELECT *
FROM REP4
WHERE TIPOAGG = 'S') A ON DBO.MINRITPERTRRS.NUMTRE = A.TRENI
AND DBO.MINRITPERTRRS.AGG_CODICE = A.COMP_NOMEB
WHERE (MINRITPERTRRS.MINUTI <= 5)
AND (PPOTRENOCIRC.TRR_CLT_ID IN (
SELECT CLT_ID
FROM PPOCLASSTRENO
WHERE PPOCLASSTRENO.CLT_ID_AGG = 30
OR PPOCLASSTRENO.CLT_ID_AGG = 31))
AND (PPOTRENOCIRC.TRR_DAT BETWEEN CONVERT(DATETIME, '24/07/2002', 103)
AND CONVERT(DATETIME, '24/07/2002', 103))
AND (PPOTRENOCIRC.TRR_TIPO = 'PO')

 idea???
Non mi ci metto neanche a spulciare un 'mostro' come quello.
Prova a mettere UNION ALL anzichč UNION e vediamo se cambia qualcosa (sempre
che Union All sia compatibile con quello che vuoi ottenere).
Poi posta l'esito.
Ciao
Alberto

Prova anche ad indicizzare il pių possibile i campi che usi nel where

con union all il tempo e' aumentato :-) pero' grazie lo stesso... ora provo
ad indicizzare vediamo che succede....

 AND CONVERT(DATETIME, '24/07/2002', 103))
<SNIP>
Ho notato che nelle condizioni di WHERE converti le date come riportato
sopra.
Se i campi che contengono le date (come PPOTRENOCIRC.TRR_DAT) hanno DATETIME
come datatype, potresti migliorare le performances utilizzando il formato
YYYYMMDD senza alcuna operazione di CAST/CONVERT.
Es:
USE Northwind
SELECT *
FROM Employees
WHERE BirthDate BETWEEN '19500101' AND '19601231'
Estraggo tutti gli impiegati nati tra il 1 gennaio 1950 ed il 31 dicembre
1960 compreso.
Ciao!
--
Lorenzo Benaglia
UGIdotNET - 
http://www.ugidotnet.org
P.S.: Ad ogni modo cerca di semplificare la tua query, magari scomponendola
in n stored procedures...

Ti ringrazio... ci ho provato ma manco morto ... vaffaaaaaaaaaaaa e' assurdo
... se lo faccio con la stessa data di inizio e fine ci mette un botto...
con due date diverse va una scheggia....

 con due date diverse va una scheggia....
Non ti rimane altra strada che semplificare la query.
Scriviti la logica su un foglio di carta, butta via la query e ricomincia da
zero.
Utilizza il Query Analyzer per visualizzare l'Execution Plan, in modo da
individuare le operazioni che causano il maggior consumo di risorse..
Inoltre cerca di scomporre l'intero problema in n procedure più semplici.
Se ti può essere utile, valuta l'utilizzo delle User Defined Functions...
