Domanda

Ho una tabella con almeno un milione di dischi in esso. Queste righe sono stati creati da un'applicazione personalizzata che legge diverse raccolte siti di SharePoint e memorizza i URL elemento nella tabella. Ora, dal momento che abbiamo letto le raccolte siti in maniera seriale, prime migliaia di righe appartengono alla collezione primo sito, prossimi migliaia appartengono alla collezione secondo sito, e così via.

Ho un'altra app che legge questo tavolo in modo sequenziale. Tuttavia, in questo modo ho finiscono per l'invio di richieste HTTP per la stessa raccolta siti per un tempo più lungo.

Lo so ho potuto ottenere risultati casuali dalla tabella nel mio secondo app. Ma, che non è un'opzione. Non posso cambiare il modo in cui il secondo lavora app.

Ora, la domanda è: come posso prendere tutte le righe della tabella, li shuffule e memorizzarlo di nuovo nella tabella

Aggiornamento: SQL Server 2008 R2 è il mio server di database

È stato utile?

Soluzione

Se l'applicazione chiama sta creando in modo esplicito un ordine particolare nella sua interrogazione (se si esegue MSSQL è possibile controllare questo avendo una sessione di profiler in esecuzione mentre l'applicazione fa la sua cosa, altri DMBSs avranno opzioni di registrazione simili) allora non c'è nulla si può fare e se non lo è non è possibile garantire completamente un ordine particolare.

Se non ORDER BY esplicito è dato quindi i dati usciranno in un ordine che è ufficialmente "indefinito" - sarà quello di sempre ordinare i reperti server più convineint. Per una singola query tabella di questo sarà molto probabilmente l'ordine della chiave primaria. In MSSQL se si dispone di un indice cluster i risultati saranno molto probabilmente uscirà in questo ordine per una singola query tavolo. Per le query multi-tavolo è tagliato ancora meno chiaro in quanto dipende da che parte intorno alle choses interrogazione pianificatore di andare per ottenere i risultati (che senza hint per l'indice esplicite potrebbero variare nel tempo come l'equilibrio dei dati nelle tabelle, come stimato dalla Indice stats del server continua, cambia).

Se la tabella non ha alcun cluster indice o chiave primaria quindi i dati è probabile che venga fuori in un ordine simile arbitrario l'ordine i dati sono stati inseriti. In questo caso si potrebbe provare:

SELECT * INTO temp_table FROM table_to_be_reordered
DELETE table_to_be_reordered
INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()

o questo può essere più veloce

INSERT table_to_be_reordered SELECT * FROM temp_table ORDER BY NEWID()
DROP TABLE table_to_be_reordered
EXEC sp_rename 'temp_table', 'table_to_be_reordered'

Nel sopra NEWID () è la funzione di MSSQL per restituire un UUID e utilizza casuale piuttosto che ID sequenziali di default - in altre DMBSs si dovrebbe trovare una funzione simile che è possibile utilizzare. Fate attenzione con la vostra scelta della funzione: per esempio sotto MSSQL la funzione RAND () viene evaulated una volta per query, non una volta per riga, quindi SELECT * FROM somewhere ORDER BY RAND() non avrebbe l'effetto desited (si può vedere perché eseguendo qualcosa come SELECT RAND(), * FROM some_table)

Se si utilizza MSSQL (la tua domanda non ha precisato quale DBMS si prendono di mira) e non già di un indice cluster sul tavolo, e sia avere una colonna sufficientemente casuale (una colonna UUID per esempio) o potrebbe aggiungere uno senza stravolgere l'applicazione di chiamata, è possibile creare un indice cluster su quel che sarebbe più veloce del SELECT INTO / DELETE / SELECT INTO sopra. Ma ancora una volta:. Questo avrà alcun effetto a tutti se l'applicazione è esplicitamente chiede i risultati in un ordine particolare e non può avere alcun effetto in ogni caso altrimenti

Altri suggerimenti

Non si specifica quale database ma in Oracle si potrebbe fare questo:

CREATE TABLE RAND_TABLE AS (SELECT * FROM ORIG_TABLE ORDER BY DBMS_RANDOM.RANDOM());

Si avrà bisogno di abbastanza spazio nel vostro tablespace TEMP di far fronte con l'ordinamento. Poi, se lo si desidera è possibile rinominare il tabelle ORIG_TABLE e RAND_TABLE a scambiarlo sopra. Non credo sia possibile mescolare un tavolo "in-place".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top