OTTIMIZZAZIONE QUERY - SQL SERVER 2000

giovedì 26 ottobre 2006 - 12.47

gmt Profilo | Junior Member

Salve,

solita domanda da 10 milioni di euro

(luca guarda che bravo che sono stato.. ho messo tutto per fare la prova..)

USE tempdb;
GO

CREATE TABLE dbo.tab1 (Campo1 int, Campo2 int);
CREATE TABLE dbo.tab2 (Campo1 int, Campo2 int, Campo3 int);
GO

INSERT INTO dbo.tab1 VALUES (10, 1003);
INSERT INTO dbo.tab1 VALUES (20, 1123);
INSERT INTO dbo.tab1 VALUES (30, 1345);
INSERT INTO dbo.tab1 VALUES (40, 1456);

INSERT INTO dbo.tab2 VALUES (10, 2322, 11);
INSERT INTO dbo.tab2 VALUES (10, 2112, 22);
INSERT INTO dbo.tab2 VALUES (30, 2563, 33);
INSERT INTO dbo.tab2 VALUES (20, 2879, 44);

GO

SELECT tab1.campo1, tab1.campo2, tab2.campo3 FROM tab1 LEFT OUTER JOIN tab2 ON
tab1.CAMPO1 = tab2.CAMPo1 AND tab2.campo2 = (select max(campo2) from tab2 where tab2.campo1 = tab1.campo1)

GO

DROP TABLE tab1;
DROP TABLE tab2;

GO

Il risultato che ottengo è esatto.. dalla tabella 2 prendo il valore del campo 3 considerando la riga in cui il campo2 della tabella 2 è il maggiore.. (per il codice = 10 --- prendo 11 -- perche 2322 è > di 2112)

DOMANDA:
Per ogni riga di tab1 SQL fa una query su tab2... se tab1 ha 1.400.000 record.. addio!
Ho vie di scampo?

La mia soluzione è salvarmi ogni volta che scrivo su tab2, in una tabella di appoggio il codice e il valore massimo.. in maniera da poter fare una query con una join normale..

Sto migliorando? E' l'unica soluzione..

Grazie

us01739 Profilo | Expert

>Per ogni riga di tab1 SQL fa una query su tab2... se tab1 ha 1.400.000 record.. addio!
>Ho vie di scampo?

Devi semplicemnte utilizzare degli indici.

Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

lbenaglia Profilo | Guru

>DOMANDA:
>Per ogni riga di tab1 SQL fa una query su tab2... se tab1 ha
>1.400.000 record.. addio!
>Ho vie di scampo?

Sempre e comunque
Prova a dare un'occhiata al seguente esempio:

USE tempdb; GO CREATE TABLE dbo.tab1 (Campo1 int, Campo2 int); CREATE TABLE dbo.tab2 (Campo1 int, Campo2 int, Campo3 int); GO INSERT INTO dbo.tab1 VALUES (10, 1003); INSERT INTO dbo.tab1 VALUES (20, 1123); INSERT INTO dbo.tab1 VALUES (30, 1345); INSERT INTO dbo.tab1 VALUES (40, 1456); INSERT INTO dbo.tab2 VALUES (10, 2322, 11); INSERT INTO dbo.tab2 VALUES (10, 2112, 22); INSERT INTO dbo.tab2 VALUES (30, 2563, 33); INSERT INTO dbo.tab2 VALUES (20, 2879, 44); GO /* Query SQL Server 2000 */ SELECT T1.*, Q2.campo3 FROM dbo.tab1 AS T1 LEFT JOIN ( SELECT T2.* FROM dbo.tab2 AS T2 JOIN ( SELECT campo1, MAX(campo2) AS campo2 FROM dbo.tab2 GROUP BY campo1 ) AS Q1 ON T2.campo1 = Q1.campo1 AND T2.campo2 = Q1.campo2 ) AS Q2 ON T1.campo1 = Q2.campo1; /* Query SQL Server 2005*/ WITH CTE_MAX_campo2 AS ( SELECT campo1, MAX(campo2) AS campo2 FROM dbo.tab2 GROUP BY campo1 ), CTE_tab2 AS ( SELECT T2.* FROM dbo.tab2 AS T2 JOIN CTE_MAX_campo2 AS CTE ON T2.campo1 = CTE.campo1 AND T2.campo2 = CTE.campo2 ) SELECT T1.*, CTE.campo3 FROM dbo.tab1 AS T1 LEFT JOIN CTE_tab2 AS CTE ON T1.campo1 = CTE.campo1; GO /* Output: campo1 campo2 campo3 ----------- ----------- ----------- 10 1003 11 20 1123 44 30 1345 33 40 1456 NULL (4 row(s) affected) */ DROP TABLE dbo.tab1, dbo.tab2;

Se preferisci, puoi sostituire le due tabelle derivate dell'esempio per SQL Server 2000 con altrettante viste.

>Grazie
Prego.

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

gmt Profilo | Junior Member

Non ce niente da fare.. sei un passo avanti..
risulta essere velocissima.. l'ho provata e va bene...

Grazie infinite..
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