in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Ordinamento con gli indici cluster di SQL Server 2005

Last post 03-31-2008 16.59 by marcomin. 14 replies.
Page 1 of 1 (15 items)
Sort Posts: Previous Next
  • 03-28-2008 9.46

    • marcomin
    • Top 150 Contributor
    • Joined on 03-28-2008
    • Posts 6
    • Points 135

    Ordinamento con gli indici cluster di SQL Server 2005

    Ciao a tutti!

    Ieri, nel mio blog, all'indirizzo http://blogs.ugidotnet.org/marcom/archive/2008/03/27/91901.aspx, ho inserito una piccola riflessione in merito agli indici clustered di SQL Server 2005 e al tipo di ordinamento che inducono sui dati. Su consiglio di Davide Mauri, sposto la discussione qui, confidando nella vostra disponibilità a fugare i miei dubbi Smile

    In un commento al post, Davide mi ha detto che i dati sono ordinati fisicamente solo quando l'indice viene ricostruito, altrimenti l'ordinamento è solo logico. Però questo mi fa nascere un altro quesito: dal momento che l'indice è mantenuto ordinato e che, nel caso di indici clustered, le foglie contengono proprio i dati, da questo non deriva che i dati sono sempre ordinati anche fisicamente?

    Grazie in anticipo per l'attenzione!

    --

    Marco Minerva, marco.minerva@gmail.com

    Filed under: , ,
    • Post Points: 35
  • 03-28-2008 10.15 In reply to

    Re: Ordinamento con gli indici cluster di SQL Server 2005

     Ciao,

    io su due piedi ti risponderei: si e no, e mi spiego:

    è pur vero (come tu dici) che le foglie contengono i dati che sono ordinati ma, al livello fisico, le foglie sono salvate come pagine sul disco. Subito dopo una ricostruzione si ha una corrispondenza 1:1 tra ordine logico ed ordine fisico ed ordine delle pagine (la prima pagina contiene il primo dato, la seconda pagina contiene come primo dato il successivo all'ultimo della prima pagina etc...) ma, durante il lavoro, supponi di trovarti di fronte ad una situazione simile: una pagina piena sulla quale devi effettuare un inserimento (un record "nel mezzo"). Quello che mi immagino succeda è che la pagina venga "splittata" in almeno due pagine per permetterti l'inserimento (fisico, all'interno della pagina) del nuovo record. Ciò che non è a questo punto garantito (secondo me) è che la nuova pagina che viene allocata alla tabella sia nell'ordine (fisico) rispetto alle altre, ma presumibilmente sarà nel primo "posto libero" che riesce a trovare.

     

    mi scuso per il maccheronismo, e prego tutti di segnalare eventuali bestialità in quanto ho scritto.

     

    Mauro 

    • Post Points: 20
  • 03-30-2008 12.35 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.907
    • Points 24.955

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Ciao Mauro

    Tutto corretto :-)

     

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 5
  • 03-30-2008 15.51 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.907
    • Points 24.955

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Ciao Marco

    Dunque, facciamo un passo indietro: un indice è una struttura in cui dati sono ordinati. Senza questa caratteristica l'indice non ha nessuna utilità.

    L'ordinamento dei dati deve quindi essere mantenuto, ma questo non può essere fatto a scapito delle performance. Per quasto motivo è stato introdotto un livello di astrazione per cui si parla di ordinamento logico ed ordinamento fisico.

    L'ordinamento logico ci permette di sapere in quale ordine dobbiamo leggere le pagine (1, 2, 3 e via dicendo), in quanto tale ordinamento potrebbe non essere quello in cui le pagine si trovano fisicamente (l'ordinamento fisico potrebbe essere infatti 2, 3, 1...).

    Per capire per quale motivo questo accade, è possibile pensare a questa situazione: supponiamo di avere un indice composto da dieci pagine. Dobbiamo ora inserire un nuovo dato e, per mantenere l'utilità dell'indice dobbiamo inserirlo nella posizione corretta, seguendo l'ordinamento imposto dall'indice stesso. Nel nosotro caso ipotizziamo di dover inserire un dato nella pagina 5. La pagina 5, però, è già piena. Se dovessimo mantere l'ordinamento fisico, dovremmo quindi creare una nuova pagina alla fine di quelle già presenti, diciamo la pagina 11. In questa pagina dovremmo copiare i dati della pagina 10, nella pagina 10 copieremmo i dati della pagina 9, e via dicendo fino a quando non arriviamo a fare sufficente spazio nella pagina 5 che a questo punto può contenere il dato che dobbiamo inserire.

    Il tutto è perfettamente funzionante ma, come potrai immaginare, molto molto lento.

    Potremmo quindi trovare un modo più furbo per ottenere la stessa cosa. Nel momento in cui ci troviamo a dover inserire un nuovo dato nella pagina 5 e questa è piena, potremmo creare una nuova pagina, diciamo la 11, e copiarci dentro i dati della pagina 5 in modo da far spazio alla nuova riga che dobbiamo inserire. Fatto ciò, dovremmo semplicemente ricordarci che la sequenza in cui dobbiamo leggere le nostre pagine in modo che l'ordinamento sia preservato è

    1 2 3 4 5 11 6 7 8 9 10

    In pratica abbiamo un ordinamento logico che differisce dall'ordinamento fisico.

    Questo è quello che accade proprio in SQL Server, che può quindi accedere ai dati sempre in modo ordinato anche se tale ordine non è fisicamente replicato sul disco.

    L'esempio che ti ho fatto è quello più evidente, ma tieni anche conto che anche nel caso in cui noi dovessimo invece inserire un dato in fondo alla nostra sequenza, ossia inserire qualcosa dopo la pagina 10, andando quindi a creare la pagina 11, non è detto che questa sia fisicamente allocata nella giusta sequenza, in quanto la scelta di quale pagina libera utilizzare dipende dalla dimensione della tabella. Se la tabella è più grossa di 64Kb (quindi di 8 pagine) SQL Server sta utilizzando degli Uniform Extent e quindi è possibile (ma non è detto) che la pagina sia messa nella sequenza giusta (a meno che non sia necessario allocare un nuovo extent), ma se la tabella è più piccola di 64Kb SQL Server utilizza dei mixed extent, e quindi - in pratica - la pagina viene presa da dove c'è posto senza troppe preoccupazioni (questo perchè la tabella è talmente piccola che non ha praticamente senso preoccuparsi di ottimizzare l'accesso sequenziale alle pagine della stessa).

    L'ordinamento logico delle pagine è gestito sia dal b-tree dell'indice (quando un indice esiste) sia dall'header posto nelle pagine stesse, dove ogni pagina memorizza il numero della pagina precedente e di quella successiva (questa struttura si chiama double-linked list).

    La posizione fisica delle pagine è invece memorizzata nelle pagine IAM (index allocation map, che a scapito del nome, servono anche per tabelle senza indici) che permettono di sapere in quali extent (e quindi in quali pagine) è memorizzato un oggetto.

    Un discorso molto simile avviene per le righe nelle singole pagine, dove la sequenza in cui le righe devono essere lette per risultare nell'ordine corretto è definita nella sezione dedicata ai Row-Offset, posta in fondo alla pagina.

    Ovviamente più l'ordine logico differisce da quello fisico, più le performance di accesso ai dati (in particolare per le operazioni di "scan") sono compromesse. Quando un indice viene manutenuto (ALTER INDEX REBUILD, ad esempio), l'indice viene distrutto e ricreato, facendo quindi in modo che ordinamento logico e fisico siano indentici, in modo da avere le performance ottimali.

    Come vedi il discorso è complesso :-), quindi un esempio che replichi la situazione descritta in precedenza credo che possa essere di aiuto:

    USE [SolidQCourseDemo]
    GO

    /*

        Tabella di prova fatta in modo tale che in una pagina ci possa stare una sola riga

    */
    IF (OBJECT_ID('dbo.TestLP') IS NOT NULL) DROP TABLE dbo.TestLP;
    GO

    CREATE TABLE dbo.TestLP
    (
        id INT NOT NULL,
        bigcolumn CHAR(8000) NOT NULL 
    )
    GO

    CREATE CLUSTERED INDEX IXC ON dbo.TestLP(id);
    GO

    /*

        Inserimento valori di prova.
        Notare il "buco" tra i valori 4 e 6. La riga con id=5 è assente.
       
    */
    INSERT INTO dbo.TestLP VALUES (1, 'A')
    INSERT INTO dbo.TestLP VALUES (2, 'B')
    INSERT INTO dbo.TestLP VALUES (3, 'C')
    INSERT INTO dbo.TestLP VALUES (4, 'D')
    INSERT INTO dbo.TestLP VALUES (6, 'F')
    INSERT INTO dbo.TestLP VALUES (7, 'G')
    INSERT INTO dbo.TestLP VALUES (8, 'H')
    INSERT INTO dbo.TestLP VALUES (9, 'I')
    INSERT INTO dbo.TestLP VALUES (10, 'L')
    INSERT INTO dbo.TestLP VALUES (11, 'M')
    GO


    /*

        Analisi dell'indice: è fatto esattamente da 10 pagine (a livello foglia)

    */
    SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('dbo.TestLP'), NULL, NULL, 'DETAILED') WHERE index_level = 0
    GO

    /*
       
        Inseriamo il valore "mancante"

    */
    INSERT INTO dbo.TestLP VALUES (5, 'Z')
    GO


    /*

        Facciamo una semplice select.
        Siccome esiste un indice cluster, SQL Server restituisce i dati utilizzando le informazioni
        presenti nella double-linked list, e quindi restituisce i dati ordinati (questa assunzione è valida solamente
        se SQL Server non parallelizza la scansione dell'indice.)

    */
    SELECT * FROM dbo.TestLP
    GO

    /*

        Distruggiamo l'indice cluster

    */
    DROP INDEX IXC ON dbo.TestLP
    GO


    /*

        Rifacciamo la select.
        Siccome NON esiste un indice cluster, SQL Server restituisce i dati utilizzando le informazioni
        presenti nella IAM e quindi i dati vengono restituiti nella sequenza fisica in cui si trovano

    */
    SELECT * FROM dbo.TestLP
    GO

    /*

        Ricreiamo l'indice e distruggiamolo immediatamente per verificare che
        la creazione di un'indice faccia in modo che l'ordine logico e quello
        fisico siano lo stesso

    */
    CREATE CLUSTERED INDEX IXC ON dbo.TestLP(id);
    DROP INDEX IXC ON dbo.TestLP;
    GO

    /*

        Rifacciamo la select.
        Siccome NON esiste un indice cluster, SQL Server restituisce i dati utilizzando le informazioni
        presenti nella IAM e quindi i dati vengono restituiti nella sequenza fisica in cui si trovano che,
        ora, sono nella stessa sequenza dell'ordine logico

    */
    SELECT * FROM dbo.TestLP
    GO


    Un tool molto bello per mettere il naso in modo grafico nell'architettura dello storage di SQL Server è SQL Internals Viewers:

    http://www.sqlinternalsviewer.com

    Questo tool utilizza delle funzioni non documentate di SQL Server che permettono di mettere "a nudo" l'intera architettura di storage.

    Volendo è possibile anche arrivare a queste informazioni a mano. Questa query ci da le informazioni fisiche sulla locazione delle pagine ROOT, IAM e sulla prima pagina della tabella TestLP:

    SELECT
        *
    FROM
        sys.system_internals_allocation_units au
    INNER JOIN
        sys.partitions p ON au.container_id = p.hobt_id
    WHERE
        au.[type] = 1
    AND
        p.[object_id] = OBJECT_ID('dbo.TestLP')



    nel mio caso alla colonna "first_page" trovo il valore 0xA80600000100.

    Questo valore va letto cosi: i primi due byte partendo da destra rappresentano il numero di file di riferimento, i successivi il numero di pagina. Anche la lettura dei valori dei byte deve essere fatta partendo da destra:

    File:
    0100 -> 0001 = 1

    Pagina
    A8060000 -> 000006A8 = 1704

    si può ora utilizzare il comando DBCC PAGE (rigorosamente non documentato nè supportato) per vedere il contenuto della pagina:

    DBCC PAGE(21, 1, 1704, 2) WITH TABLERESULTS

    21 = ID Del database
    1 = Numero del file
    1704 = Numero della pagina
    2 = Modalità di funzionamento di DBCC PAGE

    Il risultato è il DUMP della pagina 1:1704, che poi contiene la riga con id=1 e bigcolum='A' della nostra tabella.

    E' possibile notare sia le informazioni utilizzate per costruire la double-linked list (righe con Field = m_prevPage e m_nextPage) e, come ultime righe, il Row-Offset.

    Ovviamente il tool Sql Internals Viewer rende tutto più comodo :-)

    I riferimenti sui BOL per quanto riguarda tutto questo discorso sono:

    http://msdn2.microsoft.com/en-us/library/ms188270.aspx

    http://msdn2.microsoft.com/en-us/library/ms189051.aspx

    http://msdn2.microsoft.com/en-us/library/ms190969.aspx

    http://msdn2.microsoft.com/en-us/library/ms175195.aspx  

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 5
  • 03-30-2008 16.10 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.907
    • Points 24.955

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Ah già dimenticavo: nei libri della collanna "Inside SQL Server" è possibile avere tutti i dettagli, in particolare il libro di Itzik:

    Inside Microsoft® SQL Server™ 2005: T-SQL Querying

    http://www.microsoft.com/MSPress/books/9615.aspx  

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 03-31-2008 9.23 In reply to

    • marcomin
    • Top 150 Contributor
    • Joined on 03-28-2008
    • Posts 6
    • Points 135

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Grazie Davide, sei stato chiarissimo! Ho ancora un dubbio sull'argomento, che ti espongo subito. Supponiamo che io abbia un indice non clustered, ad esempio sulla colonna "Nome" della tabella "Utenti". L'indice è ordinato, dunque i nomi all'interno del B-Tree sono in ordine alfabetico. Supponiamo, inoltre, che sulla tabella non sia definito alcun indice clustered: in questo caso, nelle foglie dell'indice è memorizzato il RID alla pagina che contiene i dati. Se ora faccio una query, ad esempio una semplice

    SELECT * FROM Utenti

    Se viene utilizzato l'indice per la scansione, poiché i valori delle colonne "Nome" nell'indice sono ordinate, la SELECT mi restituisce i record ordinati secondo il nome, giusto?

    --

    Marco Minerva [MCPD], marco.minerva@gmail.com

    • Post Points: 20
  • 03-31-2008 9.29 In reply to

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Mi permetto di intervenire perché questa volta la risposta è breve!

    Se in una SELECT non metti ORDER BY, i dati possono arrivare in qualsiasi ordine. L'intervento del parallelismo (tanto per dirne una) o della cache (per dirne un'altra) potrebbe darti dei dati che non sono in ordine, benché siano letti da un indice ordinato che copre la query. Il fatto che funzioni una volta non significa che funzionerà sempre su tutte le macchine e su tutte le versioni passate, presenti e future di SQL Server. Se non c'è ORDER BY, non puoi fare alcuna assunzione sull'ordine dei risultati.

    Marco Russo
    http://www.sqlbi.com
    http://blogs.devleap.com/marco
    http://sqlblog.com/blogs/marco_russo
    • Post Points: 35
  • 03-31-2008 10.33 In reply to

    • marcomin
    • Top 150 Contributor
    • Joined on 03-28-2008
    • Posts 6
    • Points 135

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    E quindi, da quello che mi dici, una delle cose che mi avevano insegnato all'Università non è vera... Mi avevano sempre detto che, se in una query si vuole un risultato ordinato sulla base di un campo su cui è definito un indice clustered, non c'è bisogno di utilizzare l'ORDER BY!

    Detto questo, mi puoi confermare che, se non ci sono di mezzo parallelismo e cache, utilizzando un indice per una query i risultati sono sempre ordinati sul valore dell'indice, indipendentemente dal fatto che esso sia clustered o non clustered?

    --

    Marco Minerva [MCPD], marco.minerva@gmail.com

    • Post Points: 20
  • 03-31-2008 10.38 In reply to

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Mi pare strano che ti abbiano insegnato qualcosa di simile: SQL (almeno a livello di standard ANSI) è un linguaggio che è totalmente astratto dall'implementazione fisica dei dati. Il fatto che esistano indici è solo un "dettaglio implementativo" che assume rilevanza solo rispetto ai concetti di "constraint" (vincoli di univocità, per esempio).

    Comunque no, non te lo posso confermare. L'implementazione del motore può fare quello che gli pare. Se non metti ORDER BY lui è libero di restituirti i dati come vuole.I motivi sono i più vari. Per esempio, se c'è un indice clustered frammentato, è facile che i dati non arrivino in ordine. Quindi l'unico momento in cui sei sicuro che ciò non avvenga (e che comunque non garantirebbe nulla di per sé, il motore può essere implementato come si vuole) è il tempo tra la ricostruzione di un indice e la modifica di un dato nella tabella.

    Marco Russo
    http://www.sqlbi.com
    http://blogs.devleap.com/marco
    http://sqlblog.com/blogs/marco_russo
    • Post Points: 20
  • 03-31-2008 14.25 In reply to

    • marcomin
    • Top 150 Contributor
    • Joined on 03-28-2008
    • Posts 6
    • Points 135

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Perdonami, ho riletto il post di Davide, che in un esempio ha scritto questo commento:

    Siccome esiste un indice cluster, SQL Server restituisce i dati utilizzando le informazioni presenti nella double-linked list, e quindi restituisce i dati ordinati (questa assunzione è valida solamente se SQL Server non parallelizza la scansione dell'indice.)

    Quindi sull'argomento ci sono due pareri discordanti... Davide, mi puoi chiarire quest'altro dubbio? Perché vorrei capire bene la differenza tra indici clustered e non clustered...

    --

    Marco Minerva [MCPD], marco.minerva@gmail.com

    • Post Points: 35
  • 03-31-2008 14.46 In reply to

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Marco, solo un chiarimento: se SQL funziona "spesso" in un modo, non significa che lo faccia sempre. Quindi un conto è chiedere "SQL Server versione XYZ come risolve una query?" (e la risposta è: basta guardare il piani di esecuzione), ma se chiedi "Una query SQL usa l'indice clustered?" la risposta è "dipende" (per inciso: anche ove ci fosse un indice clustered, lui potrebbe deciderlo di non usarlo se ha un piano più efficiente, per es. un indice che copre la query, pur non essendo ordinato, su una tabella molto grande potrebbe risultare conveniente se richiedi pochi campi).

    Marco Russo
    http://www.sqlbi.com
    http://blogs.devleap.com/marco
    http://sqlblog.com/blogs/marco_russo
    • Post Points: 20
  • 03-31-2008 15.42 In reply to

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    mettici pure che se un indice e' molto frammentato potrebbe essere ignorato bellamente e trovarti al posto di un atteso Index Seek una bellissima table scan.

    Big Smile

     Ciao

    Ale

    • Post Points: 5
  • 03-31-2008 16.43 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.907
    • Points 24.955

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Ciao Marco

    Il commento che ho messo nel codice è in effetti molto stringato (in quanto legato alla spiegazione del post) e preso da solo può essere frainteso.

    Quello che dice l'amico Marco Russo è corretto: senza una clausola ORDER BY non è possibile sapere in modo determinisitico in quale ordine verrano restituiti i dati da SQL Server (sottolineo anche io che SQL prevende un'astrazione totale dall'implementazione fisica....quindi in università ti hanno detto una cosa assolutamente errata).

    Dato che SQL Server non ha nessun obbligo circa l'ordinamento da rispettare (visto che stiamo ipotizzando di non usare la clausola ORDER BY), per rispondere alla query ha due possibilità: utilizzare la IAM per accedere alle pagine utilizzando l'ordine fisico, oppure utilizzare la linked-list per accedere alle pagine utilizzando l'ordine logico (la scelta tra i due dipende sia da necessità di performance sia dalle necessità legate al mantenimento della consistenza dei dati).

    In quest'ultimo caso, quindi, SQL Server ci restituirà i dati nell'ordine dell'indice cluster...ma è, appunto, un caso (sempre ipotizzando che SQL Server non stia parallelizzando, altrimenti anche questo ordine potrebbe non essere rispettato). E' probabilmente più facile capire questa cosa leggendo l'assenza della clausola ORDER BY in modo opposto rispetto al normale. Al posto di pensare che il risultato ci verrà restituito senza alcun ordine, possiamo pensare che il risultato vi verrà restituito con un ordine qualsiasi. Ma a questo punto l'ordine dell'indice cluster è - appunto - un ordine qualsiasi, e quindi lecito Smile

    Tornando al mio commento nel codice, sta a significare che in quel preciso caso, SQL Server ci avrebbe restituito i dati utilizzando la linked list (effettuando quello che si chiama un index-order scan) e non utilizzando la IAM (effettuando un allocation-order scan).

    Questo, nell'esempio, accade perchè la tabella è molto piccola e relativamente poco frammentata.

    marcomin:
    Perché vorrei capire bene la differenza tra indici clustered e non clustered...

    In questo caso sono io a non capire Smile. Fino ad ora abbiamo sempre parlato di ordinamento fisico o logico della tabella e quindi - implicitamente - dell'indice cluster posto sulla stessa. Un indice non-cluster è una struttura dati a parte che non tocca le pagine dei dati della tabella.

    Nell'esempio che porti:

    "Supponiamo che io abbia un indice non clustered, ad esempio sulla colonna "Nome" della tabella "Utenti". L'indice è ordinato, dunque i nomi all'interno del B-Tree sono in ordine alfabetico. Supponiamo, inoltre, che sulla tabella non sia definito alcun indice clustered: in questo caso, nelle foglie dell'indice è memorizzato il RID alla pagina che contiene i dati.

    SELECT * FROM Utenti"

    ipotizzi che SQL Server utilizzi l'indice non-cluster per risolvere la query, ma non è così. In questo caso è possibile essere sicuri che SQL Server non utilizzerà mai un indice non-cluster per risolvere la query, in quanto è troppo dispendioso rispetto ad un table-scan, quindi la risposta alla tua domanda

    "Se viene utilizzato l'indice per la scansione, poiché i valori delle colonne "Nome" nell'indice sono ordinate, la SELECT mi restituisce i record ordinati secondo il nome, giusto?"

    è "no", perchè NON viene usato nessun indice per la scansione (a meno che non lo forzi...ma non stiamo ovviamente prendendo in considerazione questa ipotesi) Smile Anche nell'ipotesi cmq che l'indice fosse utilizzato (cosa impossibile, lo ricordo), la query non avrebbe comunque un ordinamento "garantito" in quanto non presenta la clausola ORDER BY.

    Ricordati che puoi vedere come SQL Server ha deciso di risolvere la query visualizzando il piano di esecuzione della stessa.

    Dubbi chiariti? Smile

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 5
  • 03-31-2008 16.44 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.907
    • Points 24.955

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    marco.russo:
    Mi permetto di intervenire perché questa volta la risposta è breve!

    ehi ma non vale rispondere solo se la risposta è breve Big SmileBig SmileBig SmileBig SmileBig SmileBig Smile

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 03-31-2008 16.59 In reply to

    • marcomin
    • Top 150 Contributor
    • Joined on 03-28-2008
    • Posts 6
    • Points 135

    Re: Ordinamento con gli indici cluster di SQL Server 2005

    Grazie mille, ora è tutto chiaro!

    --

    Marco Minerva [MCPD], marco.minerva@gmail.com

    • Post Points: 5
Page 1 of 1 (15 items)
(C) 2007 User Group Italiano di SQL Server