Pregunta

Tengo una tabla con al menos un millón de discos en el mismo. Estas filas fueron creados por una aplicación personalizada que lee varias colecciones de sitios de SharePoint y almacena las direcciones URL elemento de la tabla. Ahora, puesto que leemos las colecciones de sitios de una manera en serie, primeros miles de filas pertenecen a la primera colección de sitios, próximos miles pertenecen a la segunda colección de sitios, y así sucesivamente.

Tengo otra aplicación que lee esta mesa de una manera secuencial. Sin embargo, de esta manera termino el envío de peticiones HTTP a la misma colección de sitios para un tiempo más largo.

Sé que podría obtener resultados al azar de la mesa de mi segunda aplicación. Sin embargo, esa no es una opción. No puedo cambiar la forma en la segunda funciona la aplicación.

Ahora, la pregunta es: ¿Cómo puedo tomar todas las filas de la tabla, shuffule ellos y almacenar de nuevo en la tabla

Actualización: SQL Server 2008 R2 es mi base de datos del servidor

¿Fue útil?

Solución

Si la aplicación llamando está estableciendo explícitamente un orden en particular en su consulta (si está ejecutando MSSQL se puede comprobar esto por tener una sesión de perfiles se ejecuta mientras que la aplicación hace su cosa, otros DMBSs tendrán opciones de registro similares), entonces hay no puedes hacer nada y si no es que no se puede garantizar por completo cualquier orden en particular.

Si no se da ninguna cláusula ORDER BY explícita a continuación, los datos van a salir en un orden que es oficialmente "indefinido" - será lo que jamás ordenar los hallazgos de servidor más convineint. Para una sola consulta de tabla esto será más probable es que el orden de la clave principal. En MSSQL si tiene un índice agrupado los resultados más probable va a salir en ese orden para una sola consulta de tabla. Para consultas multi-mesa es recorte aún menos clara, ya que depende de qué manera alrededor de los choses planeador de consultas para ir a conseguir sus resultados (que sin sugerencias de índice explícitas podrían variar con el tiempo que el saldo de los datos en las tablas, según las estimaciones de la índice estadísticas del servidor guarda, cambia).

Si la tabla no se ha agrupado índice o clave principal a continuación, es probable que los datos que salga en un orden arbitrario similar a la orden se insertan los datos. En este caso, usted podría intentar:

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 esto puede ser más rápido

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'

En lo anterior NEWID () es la función de MSSQL para devolver un UUID y utiliza al azar en lugar de ID secuenciales por defecto - en otras DMBSs que debe encontrar una función similar que se puede utilizar. Tenga cuidado con su elección de la función: por ejemplo, bajo MSSQL la función RAND () se evaulated una vez por consulta, no una vez por fila, por lo SELECT * FROM somewhere ORDER BY RAND() no tendría el efecto desited (se puede ver por qué ejecutando algo como SELECT RAND(), * FROM some_table)

Si está utilizando MSSQL (su pregunta no tenía estado que DBMS que se dirigen) y no ya tiene un índice agrupado en la tabla, y, o bien tener una columna suficientemente aleatoria (una columna UUID por ejemplo) o podría añadir uno sin alterar la aplicación de llamadas, se puede crear un índice agrupado en lo que sería más rápido que el SELECT INTO / ELIMINAR / SELECT INTO anteriormente. Pero de nuevo:. Esto tendrá ningún efecto en absoluto si la aplicación está pidiendo explícitamente los resultados en un orden determinado y no puede tener ningún efecto de todos modos de lo contrario

Otros consejos

No se especifica qué base de datos, pero en Oracle se podía hacer esto:

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

tendrá suficiente espacio en su espacio de tabla TEMP para hacer frente a la clasificación. Entonces, si lo desea, puede cambiar el nombre de tablas y ORIG_TABLE RAND_TABLE a intercambiarlos por. Creo que no es posible mezclar una mesa "en el lugar".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top