标签: paging

SQL Server 中的分页:是否需要 order by 子句?(目前,行被遗漏)

我们有一些代码可以分页查看 SQL 结果。(目前在 SQL Server 2008 上运行)

我们注意到当分页完成时,一些行没有返回。让我澄清一下:

nHibernate 生成 SQL 查询。我们正在做分页。如果我们按 100 页,nHibernate 生成连续 SQL 查询的方式是:

  • TOP 100 // 给我们前 100 个
  • TOP 200 // 给我们这个块的第二个 100
  • 等等

以上,在 nHibernate 级别没有 ORDER BY / 排序,最终结果是某些行永远不会出现在 nHibernate 中。我们推测这是由于 SQL 的任意排序造成的,因此行在页面内“移动”(从而从我们的应用程序代码中“隐藏”)。

如果我们单次执行 nHibrate 查询(返回所有行),我们会看到所有数据。(下面的这个查询是由 nhibernate 生成的。)

添加 order by 子句(又名 nHibernate 排序)有帮助吗?

SELECT top 33 
 ... <field list> 
FROM 
  salesOrder this_ left outer join [Item] Item2_ on this_.ItemId=Item2_.ItemId 
WHERE this_.AccountId = @p0 
and this_.ModifiedAt > @p1 
and this_.ModifiedAt <= @p2
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server paging nhibernate

4
推荐指数
1
解决办法
2303
查看次数

fetch 中的隐式转换

在研究不同的查询计划以提高性能时,我注意到 FETCH 正在隐式转换为bigint.

示例表和查询:

CREATE TABLE checkPagintion
(
    Id INT NOT NULL PRIMARY KEY CLUSTERED,
    Name NVARCHAR(100)
 )

 DECLARE @paramPageNumber AS INT,
         @paramPageSize AS INT;

 SELECT *
 FROM checkPagintion
 ORDER BY Id
 OFFSET @paramPageNumber ROWS
 FETCH NEXT @paramPageSize ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

此查询的执行计划:

隐式转换

我的问题:我应该对所有分页查询使用 bigint 吗?如果我使用 int 会不会有问题,因为implict_conversion 以性能低下着称?

sql-server type-conversion offset-fetch paging sql-server-2014

4
推荐指数
1
解决办法
149
查看次数

减少查询时间以获得更高的 sql server 偏移量

目前,我有一个base_voter包含大约 100M 虚拟数据的数据表。我有如下存储过程:

CREATE Procedure [dbo].[spTestingBaseVoter]    
   @SortColumn    NVARCHAR(128) = N'name_voter',    
   @SortDirection VARCHAR(4)    = 'asc',    
   @offset INT,      
   @limit INT    
As    
Begin    
  SET NOCOUNT ON;    

  -- reject any invalid sort directions:    
  IF LOWER(@SortDirection) NOT IN ('asc','desc')    
  BEGIN    
    RAISERROR('Invalid parameter for @SortDirection: %s', 11, 1, @SortDirection);    
    RETURN -1;    
  END     

  -- reject any unexpected column names:    
  IF LOWER(@SortColumn) NOT IN (N'name_voter', N'home_street_address_1', N'home_address_city')    
  BEGIN    
    RAISERROR('Invalid parameter for @SortColumn: %s', 11, 1, @SortColumn);    
    RETURN -1;    
  END     

  --SET @SortColumn = QUOTENAME(@SortColumn);    

  DECLARE @sql NVARCHAR(MAX); …
Run Code Online (Sandbox Code Playgroud)

performance sql-server offset-fetch paging query-performance

4
推荐指数
1
解决办法
4886
查看次数

在 MySQL 中,以块为单位查询整个表的最有效方法是什么?

如果我有一张桌子User,做这样的事情会更快:

SELECT * FROM user WHERE id > ? ORDER BY id LIMIT 10000

(每个后续查询都使用前最后一行的 id 作为参数)

或者使用带有偏移量的 LIMIT,如下所示:

SELECT * FROM user ORDER BY id LIMIT ?, 10000

(到目前为止检索到的记录总数是偏移量)。

作为一个额外的复杂因素,如果我想基于链接表连接执行类似的查询怎么办?就像说一个user可以属于多个角色,所以我想要一个查询

SELECT u.* FROM user u INNER JOIN user_roles ur ON ur.user_id = u.id WHERE ur.role_name IN ('Admin', 'SuperUser', 'etc.') LIMIT ?, 10000

连接是否会影响关于首选哪种样式查询的决定?

mysql performance limits paging

2
推荐指数
1
解决办法
3439
查看次数