Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有相同顺序的Azure SQL查询返回不同的结果集_Sql Server_Azure Sql Database - Fatal编程技术网

Sql server 具有相同顺序的Azure SQL查询返回不同的结果集

Sql server 具有相同顺序的Azure SQL查询返回不同的结果集,sql-server,azure-sql-database,Sql Server,Azure Sql Database,我希望一些SQL Server天才知道是什么导致了这种错误行为。执行以下两个查询会得到不同的记录: declare @__p_0 int = 50 declare @__p_1 int = 1 SELECT [a].[Id], [a].[DescriptionHtml], [a].[Name], [a].[SummaryHtml] FROM [Appointment] AS [a] WHERE [a].[DateDeleted] IS NULL ORDER BY [a].[Name] OFFS

我希望一些SQL Server天才知道是什么导致了这种错误行为。执行以下两个查询会得到不同的记录:

declare @__p_0 int = 50
declare @__p_1 int = 1

SELECT [a].[Id], [a].[DescriptionHtml], [a].[Name], [a].[SummaryHtml]
FROM [Appointment] AS [a]
WHERE [a].[DateDeleted] IS NULL
ORDER BY [a].[Name]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY
      
SELECT [a].[Id], [a].[Name]
FROM [Appointment] AS [a]
WHERE [a].[DateDeleted] IS NULL
ORDER BY [a].[Name]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY
这似乎与pagesize有某种关联,因为在第一次查询中删除任何其他列后,记录与第二次查询中的记录相同。正如您肯定会怀疑的那样,这种行为对于分页结果集来说纯粹是一种恐怖行为,而对于EFCore的
AsSplitQuery
,情况更糟


在my
SQL Server 2019 Developer Edition(15.0.2080.9)
上本地运行此查询不会出现此错误,在
Azure SQL Server 12.0.2000.8
上运行时,我面临此问题。如果要复制它,我可以尝试在表中隔离所需的数据。

这是故意的行为,对于非唯一列,查询的顺序不能保证相同。这可能是由许多原因(索引、物理顺序等)造成的,并且每个请求都不同。解决方案是,如果想要的顺序不是唯一的,则始终按主键最后排序。

名称听起来不像是要排序的稳定列-如果有多行具有相同的名称,则它们的顺序是不可预测的,并且各种因素可能会影响服务器以一种顺序而不是另一种顺序读取它们,包括您选择的列。您应该包含足够多的按列排序的内容,以使其与众不同。例如,名称、Id。您在代码中构建的查询是什么?顺便说一句,您可能对使用它感兴趣,它比行集分页性能好得多。尽管查询是由EFCore生成的,但您确实需要一组唯一的列来排序,因此我可能需要添加Id列。但我认为SQL Server可以确保所选列的结果集索引保持不变?我从未在“常规”SQL Server上出现过这种行为,只是第一次在Azure上遇到这种情况。我需要重构我的整个代码,因为表通常按非唯一列排序。这真的是事实吗?按非唯一列排序不可靠吗?我很确定,如果没有提供order by,或者order by不是唯一的,也不能保证恒定的order。在实践中,您可能经常会看到相当稳定的顺序,但这是由于不容易控制的因素造成的,例如它们的位置盘(可能是PK/创建顺序,但不一定)或者它决定使用的索引等。当然,Azure上的幕后I/O可能会有很大的不同,因此您会更经常地看到问题,但在常规SQL Server上这并不是不可能的。非常感谢!我告诉了EFCore团队这种可能的行为,我猜很多人可能会掉进这个巨大的坑里!