moyen plus rapide de limiter les loggings entre plage dans le server sql

J'ai un grand nombre d'loggings dans ma table, et je veux des records de pages entre les limites, mais pour cela nous n'avons qu'une seule solution

WITH data AS ( SELECT ID ,YourColumn ,ROW_NUMBER() OVER (ORDER BY ID) AS RowNum FROM YourTable ) SELECT * FROM data WHERE RowNum BETWEEN 5 AND 10 

mais pour cela, nous avons besoin d'une requête externe et cela va bash la table deux fois, comme dans mysql nous pouvons faire comme suit

 select * from employee limit 2,4 

Donc, y a-t-il un moyen d'get les records entre la scope et le coup unique? bcoz si c'est le problème, nous ne pouvons jamais get le résultat plus rapide de cette requête dans MSSQL

Celui que vous avez est le meilleur dans SQL Server 2008

Voici une autre façon:

 --skip first 5 records and display next 5 records SELECT TOP 5 * FROM data WHERE ID NOT IN(SELECT TOP 5 ID FROM data ORDER BY ID) ORDER BY ID 

Si vous avez Microsoft SQL Server 2012 :

 SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; 

offset -> # de lignes ignorées

suivant -> nombre de lignes nécessaires

Bien que la syntaxe puisse changer entre les versions de SQL Server, elle ne supprime pas le problème de performances d'origine. Même avec la syntaxe SQL Server 2012 si vous voulez une page à partir de la fin de la table, la table entière (ou l'index en fonction de l'ordre de sorting) doit être analysée, ce qui est très inefficace.

Si je suppose que l'ordre des données dans le tableau concernant vos pages ne change pas souvent, vous pouvez créer votre propre tableau "index de page". Une table qui a des colonnes "numéro de page", "start id" et "end id". De cette façon, vous pouvez get la plage d'identification pour une page donnée très rapidement.

Maintenant, bien sûr, vous avez le problème de maintenance pour cette table d'index. Si les pages sont basées sur votre index clusterisé et que cet index est une identité automatique, vous devez uniquement prendre en count les suppressions. Si vous n'avez pas DELETE, tant mieux. Si vous supprimez uniquement des blocs (via une procédure stockée) ou des partitions, vous pouvez dans ces cas rebuild l'index de la page. Si vous avez des suppressions simples, vous devez écrire un triggersur de suppression.

Une telle table d'aide peut même vous aider avec des tailles de page variables, le cas échéant. Prenez juste une taille de page arbitraire (comme 100) et utilisez la table pour limiter en plus la plage de requête dans votre requête de page. Tout ce dont vous avez besoin est un mappage statique entre l'identifiant de ligne et sa position dans la table pour un certain nombre de lignes.

Edit: Bien sûr, vous devez également prendre soin des insertions. La meilleure chose à faire est de garder un countur de combien d'loggings sont dans la dernière page et de générer une nouvelle input de page quand elle dépasse la limite de la page.