我们有一些代码可以分页查看 SQL 结果。(目前在 SQL Server 2008 上运行)
我们注意到当分页完成时,一些行没有返回。让我澄清一下:
nHibernate 生成 SQL 查询。我们正在做分页。如果我们按 100 页,nHibernate 生成连续 SQL 查询的方式是:
以上,在 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) 在研究不同的查询计划以提高性能时,我注意到 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
目前,我有一个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
如果我有一张桌子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
连接是否会影响关于首选哪种样式查询的决定?