2010-05-17 14 views
9

Supongamos que tengo una tabla con el campo de tipo VARCHAR. Y necesito obtener datos de esa tabla ordenados alfabéticamente por ese campo.Pros y contras de ordenar datos en DB?

¿Cuál es la mejor forma (para el rendimiento): agregar order by field a la consulta SQL u ordenar los datos cuando ya se han obtenido?

Estoy usando Java (con Hibernate), pero no puedo decir nada sobre el motor de DB. Podría ser cualquier base de datos relacional popular (como MySQL o MS Sql Server u Oracle o HSQL DB o cualquier otro).

La cantidad de registros en la tabla puede variar mucho, pero supongamos que hay 5k registros.

UPD: ¿qué tan bien soporta la memoria caché de hibernación de segundo nivel (EHCache por ejemplo) los datos ordenados?

Respuesta

9

Si este campo está indexado, la base de datos promedio sería mucho más eficiente en esta tarea que Java. También tenga en cuenta que normalmente no recuperará todas esas filas a la vez si es para visualización pura, sino que recuperará un subconjunto para que se pueda mostrar por paginación. Puedes hacer esto en el nivel DB también. La ordenación de los datos en Java requeriría que toda la tabla sea arrastrada a la memoria de Java, no desea hacer eso.


En Hibernate puede ordenar los resultados usando Criteria#addOrder() y paginate usando Criteria#setFirstResult() y Criteria#setMaxResults(). P.ej.

List users = session.createCriteria(User.class) 
    .addOrder(Order.asc("username")) 
    .setFirstResult(0) // Index of first row to be retrieved. 
    .setMaxResults(10) // Amount of rows to be retrieved. 
    .list(); 
+0

gracias por este punto. Desafortunadamente no está indexado, pero lo recordaré en los siguientes casos. – Roman

+1

Incluso entonces, hacer esto en un DB decente es más eficiente que hacer esto en Java. Es un hecho. El DB está diseñado para exactamente los propósitos de organización y agrupación de datos. Benefíciate de sus poderes. – BalusC

5

Ordene los datos en la base de datos, eso es (parte de) lo que está ahí. El motor de la base de datos es probablemente mejor al ordenar estos datos que usted.

0

Mi solución sería crear el índice para la columna de clasificación y escribir la consulta con la orden por la cláusula.

1

¿Cuál es la mejor manera (para el rendimiento): agregar ordenación por campo a la consulta SQL u ordenar los datos cuando ya se han obtenido?

Es ORDER BY, no ordena por.

Es una cuestión de compensación: la distribución por el lado del cliente se distribuye lo que significa menos impacto en el servidor. Sin embargo, puede requerir más recursos de cliente.

Si el campo no está indexado, para devolver el conjunto ordenado, conjunto de registros del servidor tendrá que hacer las siguientes cosas:

  1. Fetch todo el conjunto de registros
  2. Ordenar que
  3. enviarlos a través de la red al cliente

, mientras que la clasificación en el cliente requiere sólo señala 1 y 3 (que son las menos intensivas en recursos).

Si su servidor necesita atender a cientos de clientes simultáneamente y sus clientes necesitan todo el conjunto de registros, lo más probable es que la clasificación por el lado del cliente sea más eficiente.

Si el campo está indexado, la base de datos puede devolver los datos ya ordenados de ese índice. Sin embargo, esto requerirá búsquedas adicionales de tablas para obtener los otros campos.

Además, si no desea todo el conjunto de registros, pero solo algunos campos superiores (como en ORDER BY LIMIT o SELECT TOP … ORDER BY), no será necesario buscar y transmitir todo el conjunto de receptores a través de la red. En este caso, ordenar en el lado de la base de datos probablemente será más eficiente.

+0

Gracias, mi mal, corregirá. La última vez que lo hice hace casi 2 años. – Roman

0

Por tan solo 5 mil registros, realmente no hace mucha diferencia, pero la ordenaría en la base de datos; incluso si no hay un índice en el campo, es probablemente al menos tan rápido como hacerlo después.

2

Pro clasificación en la base de datos:

  1. velocidad. Si tiene un índice en el orden por condición, las bases de datos no deberían tener que ordenar en absoluto, y para obtener el máximo rendimiento, podría usar un índice agrupado.
  2. Facilidad de uso. Un order by en la consulta sql es más fácil de escribir y mantener que un Java Comparator.

Pro clasificación en la aplicación:

  1. de personalización. Tal vez desee ordenar por criterios más elaborados, luego un ordenamiento personalizado en Java será más flexible.
  2. Reproducibilidad. Si codifica diferentes bases de datos, su Collating rules probablemente difiera. Tal vez eso sea un problema, y ​​quieres un odering en particular. En Java, puede escribir un Custom Collator para asegurarse de que la salida de todas las bases de datos se ordena de la misma manera.
0
  • ¿Sueles extraer solo un subconjunto de esos datos? -> un buen diseño de fondo (indexación y/o partición) lo ayuda a extraer ese subconjunto ordenado más rápido; entonces una "orden por" en el DB es cuestión de instantes.
  • tablas siempre contienen algunas filas de datos? entonces un "orden por" en el db es cuestión de instantes

e incluso si no (no puede) optimizar su base de datos usted debe (casi) siempre prefiere dejar ese tipo de operaciones a el ser

0

si usted está dispuesto a tirar de todos sus datos en la memoria y trabajar con él en la memoria, aquí es una biblioteca que va a funcionar muy bien para su caso de uso

http://casperdatasets.googlecode.com

opera efectivamente como una en la tabla de memoria, y le permite realizar búsquedas, filtrar y CLASIFICAR en datos, todo en la memoria (y en java). funciona muy rápido para la cantidad de registros con los que está tratando de trabajar, y no necesita integrarse con un marco ORM pesado.