Maison  >  Article  >  base de données  >  Un test simple de l'efficacité de trois méthodes de pagination

Un test simple de l'efficacité de trois méthodes de pagination

巴扎黑
巴扎黑original
2017-05-01 10:40:071359parcourir

Je viens de faire une comparaison de pages avec une plus grande quantité de données et des emplacements différents.

Créer un tableau :

CREATE TABLE [TestTable] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO

Insérer des données : (1 million)

SET IDENTITY_INSERT TestTable ON
declare @i int
set @i=1
while @i<=1000000
begin
    insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, &#39;FirstName_XXX&#39;,&#39;LastName_XXX&#39;,&#39;Country_XXX&#39;,&#39;Note_XXX&#39;)
    set @i=@i+1
end
SET IDENTITY_INSERT TestTable OFF

Première solution de pagination : (Utilisez Not In et SELECT TOP pour la pagination)

Formulaire de relevé :

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 页大小*页数 id
         FROM 表
         ORDER BY id))
ORDER BY ID

Solution de pagination deux : (Utilisez un ID supérieur à et une pagination SELECT TOP)

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 页大小*页数 id
                 FROM 表
                 ORDER BY id) AS T))
ORDER BY ID

Troisième solution de pagination : (Utilisation de la pagination de procédures stockées par curseur SQL)

create  procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
 @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1
set nocount off

Résultats des tests :

Les tests comportent tous 10 éléments par page, et les trois chiffres représentent le temps nécessaire aux trois solutions pour produire des résultats, en secondes :

Page 2 : 18, 10, 29

Page 500 : 12, 8, 21

Page 50000 : 16, 18, 22

Page 500000 : 24, 16, 22

L'objectif principal de ce test est de tester l'efficacité de rotation des pages de différentes parties de gros volumes de données. Je pensais que cela devrait être un résultat linéaire, mais j'ai trouvé que le changement était étrange. Après plusieurs tests, l'erreur se produit en 1 ou 2 secondes. On estime que SQL Server est également optimisé pour tourner les pages selon différentes positions. Après avoir examiné l'analyse de la requête, le coût principal est toujours trié par, qui est toujours la clé primaire, ou s'il s'agit d'une chaîne, ce sera probablement plus lent.

Parce qu'il y a d'autres choses à faire, aucun test supplémentaire n'a été effectué. Les amis intéressés peuvent continuer à faire divers tests avec 100 000 éléments, sans index et sans contenu de chaîne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn