Come sql server ordina i tuoi dati?

Mi chiedevo come sql server i tipi di dati.
Ho notato che se ho una tabella che non contiene la colonna “Id” e selezionare dati senza “ORDINE” di sql server non ordinare automaticamente sulla colonna principale.

Qualcuno sa che regola sql server segue per ordinare i dati?

  • +1 bella domanda
InformationsquelleAutor | 2010-01-11

 

4 Replies
  1. 20

    Anche se è bene interrogarsi su come potrebbe essere spiegato che spesso si vede lo stesso ordine, e vorrei sottolineare che non è mai una buona idea fare affidamento su ordine implicito causato dalla particolare implementazione del motore di database sottostante. In altre parole, è bello sapere perché, ma non si dovrebbe mai fare affidamento su di essa. Per MS SQL, l’unica cosa che adabilit ‘ a delle righe in un certo ordine, è un esplicito ORDER BY clausola.

    Non solo diversi RDMBS-es si comportano in modo diverso, un caso particolare potrebbe comportarsi in modo diverso a causa di un aggiornamento (patch). Non solo, anche lo stato di RDBMS software potrebbe avere un impatto: un “caldo” database si comporta in modo diverso rispetto a un “freddo”, è un piccolo tavolo si comporta in modo diverso rispetto a una grande.

    Anche se si dispone di informazioni di base circa l’attuazione (ex: “non c’è un indice cluster, quindi è probabile che i dati saranno restituiti dall’ordine di indice cluster”), c’è sempre una possibilità che c’è un altro meccanismo che non si conoscono che causa le righe da restituire in un ordine diverso (ex1: “se un’altra sessione appena fatto una scansione completa con un esplicito ORDER BY il gruppo di risultati potrebbe essere stato memorizzato nella cache; una successiva scansione completa tenterà di restituire le righe dalla cache”; ex2: “un GROUP BY può essere attuato mediante la classificazione dei dati, influendo ordine vengono restituite le righe”; ex3: “Se le colonne sono tutte in un indice secondario che è già memorizzato nella cache in memoria, il motore di scansione l’indice secondario invece della tabella, più probabile il ritorno delle righe di ordine di indice secondario”).

    Ecco un test molto semplice che illustra alcuni dei miei punti.

    Primo, di avvio di SQL server (sto usando 2008). Creare la tabella:

    create table test_order (
        id int not null identity(1,1) primary key
    ,   name varchar(10) not null 
    )

    Esaminare la tabella e la testimonianza che un clusted indice è stato creato per supportare il primary key sul id colonna. Per esempio, in sql server management studio, è possibile utilizzare la visualizzazione struttura e passare alla cartella indici sotto il tavolo. Ci si dovrebbe vedere un indice, con un nome come: PK__test_ord__3213E83F03317E3D (Clustered)

    Inserire la prima riga con l’istruzione:

    insert into test_order(name)
    select RAND()

    Inserire più righe da ripetere in questa dichiarazione di 16 volte:

    insert into test_order(name)
    select RAND()
    from   test_order

    Si dovrebbe ora avere 65536 righe:

    select COUNT(*) 
    from   test_order

    Ora, selezionare tutte le righe senza l’utilizzo di un ordine:

    select *
    from   test_order

    Più probabile, i risultati saranno restituiti dall’ordine della chiave primaria (anche se non vi è alcuna garanzia). Ecco il risultato che ho ottenuto (che è davvero in ordine di chiave primaria):

    #      id    name
    1      1     0.605831
    2      2     0.517251
    3      3     0.52326
    .      .     .......
    65536  65536 0.902214

    (il # non è una colonna, ma la posizione ordinale della riga del risultato)

    Ora, creare un indice secondario sulla name colonna:

    create index idx_name on test_order(name)

    Selezionare tutte le righe, ma recuperare solo il name colonna:

    select name
    from   test_order

    Più probabile che i risultati saranno restituiti dall’ordine dell’indice secondario idx_name, poiché la query può essere risolto solo la scansione dell’indice (i.o.w. idx_name è un copertura indice). Ecco il risultato che ho ottenuto, che è proprio ordine di name.

    #      name
    1      0.0185732
    2      0.0185732
    .      .........
    65536  0.981894

    Ora, selezionare tutte le colonne e le righe di nuovo:

    select * 
    from test_order

    Ecco il risultato che ho ottenuto:

    #      id    name
    1      17    0.0185732
    2      18    0.0185732
    3      19    0.0185732
    ...    ..    .........

    come si può vedere, molto diverso dal primo tempo abbiamo fatto questa query. (Sembra che le righe sono ordinati in base all’indice secondario, ma non ho una spiegazione del perché che dovrebbe essere così).

    Comunque, la linea di fondo è – non si basano su ordine implicito. Si può pensare di spiegazioni perché un ordine particolare può essere osservato, ma anche allora non si può sempre prevedere (come nel secondo caso) senza avere una conoscenza intima di attuazione e dello stato di esecuzione.

  2. 4

    Se non si specifica una clausola ORDER BY, in modo esplicito, non c’è un ordine garantito che i risultati verranno ordinati in. Non è nemmeno garantita in base all’indice cluster.

    Si può vedere un esempio di questo questo articolo.

  3. 0

    COME l’SQL è basato sul Set thoery e non garantisce un ordine, quindi se non si specifica un particolare ordine explicityly, l’ordine non sarà garantita.

  4. 0

    Ho avuto una simile esperienza con SQL Server restituisce risultati ordinati in modo diverso di quanto mi aspettassi. Ho scoperto che se si specifica un hint di tabella nell’istruzione select, dando il nome di indice cluster, si ottengono i risultati ordinati come si desidera:

    select * from test_order WITH (INDEX([ClusteredIndexName]))

Lascia un commento