Le tabelle temporanee hanno qualche forma di indice in SQL?

0

Considera una query semplice come questa:

SELECT * FROM DATA
JOIN
(
SELECT * FROM DATA
)TEMPORARY_DATA
ON TEMPORARY_DATA.DATA_IDN = DATA.DATA_IDN

Qual è la performance di questo? È O(n2) perché TEMPORARY_DATA non ha indici rispetto alle normali tabelle. I join normali penso che avvenga in O(nlogn) time perché è indicizzato giusto?

Questo cambia se la query interna è leggermente complessa e così diretta? Voglio dire è possibile l'ottimizzazione non è in grado di indovinare che non è la tabella DATI indicizzata!

Sono novizio di queste cose, per favore fatemi sapere se questo appartiene ad un altro posto sulla rete SO.

    
posta Nishant 19.05.2015 - 14:22
fonte

1 risposta

4

(La seguente risposta utilizza SQL Server RDBMS per spiegare)

Prima di tutto, non ci sono tabelle temporanee nella tua domanda . Le tabelle temporanee (in SQL Server) sono tabelle reali che vivono in tempdb e sono definiti con segni di una o due sterline ( # ) che lo precedono. Quello che hai è un semplice alias ( temporary_data ). Due cose estremamente diverse.

Questo è un modo estremamente lungo e prolisso di scrivere un join su un tavolo a se stesso. Prendi questa struttura tabella:

create table dbo.Data
(
    Id int not null
);
go

Inserirò alcune righe:

insert into dbo.Data
values (1), (2), (3);
go

Il set di risultati di:

select *
from dbo.Data
join
(
    select *
    from dbo.Data
) temporary_data
on temporary_data.Id = Data.Id;

È ...

Id  Id
1   1
2   2
3   3

Esaminando il piano di post post di questa operazione, SQL Server esegue semplicemente un join su queste due tabelle:

Logicamente questa è la esatta stessa query (risultati e piano di esecuzione) come segue:

select *
from dbo.Data d1
inner join dbo.Data d2
on d1.Id = d2.Id;

È solo un modo estremamente lungo per scriverlo. Il primo non guadagna nulla e l'unica cosa persa è la leggibilità.

    
risposta data 19.05.2015 - 15:23
fonte

Leggi altre domande sui tag