Maison > Article > base de données > Un test simple de l'efficacité de trois méthodes de pagination
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, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX') 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!