2009-07-10 13 views
6

¿Hay una tabla clasificada intrínsecamente por su clave principal? Si tengo una tabla con la clave principal en una columna de identidad de BigInt, puedo confiar en que las consultas siempre devolverán los datos ordenados por la clave o que explícitamente necesito agregar el "ORDER BY". La diferencia de rendimiento es significativa.Clasificación de clave principal

Respuesta

11

Los datos se almacenan físicamente por índice agrupado, que suele ser la clave principal pero no tiene que ser así.

No se garantiza que los datos en SQL tengan orden sin una cláusula ORDER BY. Siempre debe especificar una cláusula ORDER BY cuando necesite que los datos estén en un orden particular. Si la tabla ya está ordenada de esa manera, el optimizador no hará ningún trabajo adicional, por lo que no hay ningún problema en tenerlo allí.

Sin una cláusula ORDER BY, el RDBMS puede devolver las páginas almacenadas en caché que coinciden con su consulta mientras espera la lectura de los registros del disco. En ese caso, incluso si hay un índice en la tabla, es posible que los datos no entren en el orden del índice. (Tenga en cuenta que esto es sólo un ejemplo - no sé ni siquiera considera que un mundo real RDBMS va a hacer esto, pero es un comportamiento aceptable para una aplicación SQL.)

EDITAR

Si tiene un impacto en el rendimiento al ordenar frente a cuándo no está ordenando, probablemente esté ordenando en una columna (o conjunto de columnas) que no tiene un índice (agrupado o no). Dado que se trata de una serie temporal, es posible que esté ordenando según el tiempo, pero el índice agrupado está en el bigint principal. SQL Server no sabe que ambos aumentan de la misma manera, por lo que tiene que recurrir a todo.

Si la columna de la hora y la columna de la clave principal están relacionadas por orden (una aumenta si y solo si la otra aumenta o permanece igual), ordene por la clave principal. Si no están relacionados de esta manera, mueva el índice agrupado de la clave principal a las columnas por las que esté ordenando.

+1

El primer párrafo debe decir "Los datos se almacenan físicamente por índice agrupado ...". Todo lo demás que dice Welbog se aplica: el hecho de que esté almacenado físicamente [dentro de cada página] en un pedido no significa que lo recuperarás en ese orden. La fragmentación del disco físico también puede tener un impacto en esto. –

+0

@Philip Kelley: Se ha modificado para reflejar su mejor fraseo. Gracias. – Welbog

+0

En realidad estoy ordenando en la clave principal (que es la BigInt). Los datos se han insertado de forma ordenada (por fecha). –

0

En SQL Server: no, por su clave de clúster - que por defecto es la clave principal, pero no tiene que ser la misma.

La función principal de la tecla principal es identificar de forma única cada fila en la tabla, pero no implica ninguna clasificación (física) per se.

No estoy seguro acerca de los otros sistemas de bases de datos.

Marc

0

Esto puede ser específico de la implementación, pero parece MySQL para ordenar por la clave principal por defecto. Sin embargo, en cualquier momento en que necesite una garantía de que las filas se ordenarán de cierta manera, debe agregar ORDER BY.

+0

solo si la clave principal es también CLUSTERING KEY - que es por defecto, pero NO TIENE que ser ....... –

+0

Ah gracias, es bueno saberlo. –

1

Una tabla predeterminada no está 'agrupada', es decir, organizada por PK. Usted tiene la opción de especificarlo como tal. Por lo tanto, el valor predeterminado es "HEAP" (sin ningún orden en particular), y la opción que está buscando es "CLUSTERED" (SQL Server, en Oracle se llama IOT).

  • Una tabla sólo puede tener un clúster (que tiene sentido)
  • Use la tecla PRIMARIA sintaxis agrupado en la Orden DDL
  • por PK todavía tiene que ser emitida en sus selecciona, el hecho de que sea agrupado hará que la consulta se ejecute más rápido, ya que el plan optimizador sabrá que no es necesario hacer la clasificación en un índice agrupado

el cartel anterior es correcta, SQL (y la base teórica de la misma) define específicamente una seleccione como un conjunto/tupla desordenado.

SQL generalmente intenta permanecer en el ámbito lógico y no hacer suposiciones sobre la organización física/ubicaciones, etc. de los datos. La opción CLUSTERED nos permite hacer eso para situaciones prácticas de la vida real.

0

Casi siempre se ordenarán por las tablas Identity. Se ordena por el índice agrupado como y no siempre se puede ordenar por la identidad, pero nunca he visto que no esté ordenado por el ID de identidad al seleccionar *. ¿Cuál es la razón detrás de no especificar un pedido? No veo por qué causa una diferencia en el rendimiento.

+0

El motivo se basa puramente en el rendimiento (ver comentario arriba). –

2

Sin un ORDER BY explícito, no hay un orden de clasificación predeterminado. Una pregunta muy común. Como tal, no es una respuesta enlatada: "La diferencia de rendimiento es significativa"

Without ORDER BY, there is no default sort order.

¿Podría explicar por qué?

+0

Los datos son series de tiempo y las consultas están retirando meses de datos. Sin orden El procedimiento almacenado puede comenzar a devolver filas en segundos. Con Order By transcurre un minuto hasta que regrese la primera fila. –

+0

Puede probar OPCIÓN (FAST 1) http://msdn.microsoft.com/en-us/library/ms181714.aspx –

1

Debe aplicar el ORDER BY para garantizar un pedido. Si observa una diferencia en el rendimiento, es probable que sus datos no se hayan ordenado sin el ORDER BY en el lugar —; de lo contrario, SQL-Server se debe comportar mal ya que no se está dando cuenta de que los datos ya están ordenados. Agregar el ORDER BY en los datos ya ordenados no debe incurrir en una penalización de rendimiento ya que el RDBMS debe ser lo suficientemente inteligente como para realizar el orden de los datos.

Cuestiones relacionadas