2009-07-03 14 views
7

En Sql Server 2008, hay muchas opciones disponibles para la búsqueda de bases de datos a través del procedimiento almacenado. Por ejemplo, vea here y here.¿Qué método de paginación (Sql Server 2008) ofrece el MEJOR rendimiento?

OPCIONES:

  1. ROW_NUMBER() la función
  2. rowCount
  3. CURSORS
  4. tablas temporales
  5. anidada consultas SQL
  6. OTROS

Megafonía utilizando ROW_NUMBER() es conocido por tener performance issues:

Por favor, asesorar, cuyo método de paginación tiene el mejor rendimiento (para tablas grandes con uniones)?

También proporcione enlaces a los artículos pertinentes, si es posible.

Gracias.

+0

probablemente debería añadir un poco de recompensa 300 representante para que coincida con el nivel de detalle de pedir ... –

Respuesta

3

Una pregunta que debe responder es si desea mostrar el número total de filas al usuario final. Para calcular el número de la última página, también necesita el último número de fila.

Si puede prescindir de esa información, una tabla temporal es una buena opción. Puede seleccionar la clave pirmary y usar LIMIT para recuperar claves hasta la clave que le interese. Si hace esto bien, el caso de uso típico solo recuperará las primeras páginas.

Si necesita el último número de página, puede usar ROW_NUMBER(). Usar una tabla temporal no será mucho más rápido porque no puede usar la cláusula LIMIT, lo que hace que esta estrategia sea equivalente a un cálculo ROW_NUMBER().

+0

1 Esa es una distinción importante que hacer - en la práctica siempre necesito el recuento total de fila. Las pruebas de rendimiento que no incluyen eso no son útiles para mí. – RedFilter

+0

Gracias. Se necesitará el número total de filas para generar el número de página. El método ROWCOUNT parece ser el más rápido, pero requiere una columna de clasificación única (que no es única en mi caso) – dev

0

Podemos obtener un conteo de fila utilizando la siguiente consulta.

WITH data AS 
(
     SELECT ROW_NUMBER() OVER (order by memberid) AS rowid, memberid 
     FROM Customer 
) 
SELECT *, (select count(*) from data) AS TotalCount 
FROM data 
WHERE rowid > 20 AND rowid <= 30 
+0

El OP lo sabe, pregunta cuál es la mejor manera y se vincula explícitamente a otro lugar que describe problemas (enlaces a otra solución) con este enfoque. –

Cuestiones relacionadas