-1

我读过的所有内容都说这不应该发生,但它确实发生了。我的数据库大小大约为 15GB,有几百个表,表可以有几行到几百万不等的任何地方。

以下是发生的情况:假设我有一个名为的表orders,第一列被调用ID并且是表的主键。还有许多其他列,其中之一名为policy. 如果我运行以下查询:

SELECT * 
FROM orders 
WHERE policy = 12345 
ORDER BY ID

我希望结果看起来像这样:

1
2
3
4
5
6

但有时结果会如下所示:

1
2
4
5
3
6

就好像3被移到了不同​​的位置。这如何/为什么会发生?

实际查询是

SELECT * FROM loc_info WHERE PolInfo_ID=25634 ORDER BY LocInfo_ID

表定义为

CREATE TABLE [dbo].[loc_info]( 
    [LocInfo_ID] [int] IDENTITY(1,1) NOT NULL, 
    [PolInfo_ID] [int] NOT NULL, 
    [name] [varchar](100) NOT NULL, 
    [address1] [varchar](100) NULL, 
    [address2] [varchar](100) NULL, 
    [city] [varchar](100) NULL, 
    [state] [varchar](100) NOT NULL, 
    [zip] [char](10) NULL, 
    [county] [varchar](100) NULL, 
    [country] [varchar](100) NULL, 
    [loc_number] [varchar](20) NULL, 
    [occ_type_id] [int] NULL, 
    [occ_type] [varchar](100) NULL, 
    [flood_zone] [varchar](6) NOT NULL, 
    [coastal_zone] [varchar](20) NOT NULL, 
    [earthquake_zone] [varchar](20) NOT NULL, 
    [earthquake_group] [varchar](20) NULL, 
    [BuildingTIV] [numeric](18, 0) NULL, 
    [MachEquipTIV] [numeric](18, 0) NULL, 
    [StocksSuppliesTIV] [numeric](18, 0) NULL, 
    [OtherTIV] [numeric](18, 0) NULL, 
    [BusinessInterruptTIV] [numeric](18, 0) NULL, 
    [ExtraExpTIV] [numeric](18, 0) NULL, 
    [RentTIV] [numeric](18, 0) NULL, 
    [Property] [numeric](18, 0) NULL, 
    [IsUpload] [bit] NULL, 
    [IsMoved] [bit] NULL, 
 CONSTRAINT [PK_locations] PRIMARY KEY CLUSTERED  
( 
    [LocInfo_ID] ASC
)WITH (PAD_INDEX  = OFF
, STATISTICS_NORECOMPUTE  = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS  = ON
, ALLOW_PAGE_LOCKS  = ON
, FILLFACTOR = 90) ON [PRIMARY] 
) 
4

2 回答 2

9

这应该是不可能的,假设您订购的列实际上是LocInfo_ID,它确实是,并且当问题发生时INT您确实有一个子句。ORDER BY

如果您可以在这三个条件为真的情况下生成有效的重现,那么您手上就会有一个错误(可能是由损坏引起的)。

我怀疑这里还有其他我们不知道的变量。我的猜测是,您正在检查的列不是您订购的那一列,或者它不是您认为的数据类型,或者当您观察到这个随机无序的结果时,实际上并没有按顺序排列用过的。

否决这一切你想要的,但这是非常科学和合乎逻辑的 - SQL Server 不会弄乱ORDER BY你定义的,除非(a)你没有定义它或(b)你没有定义它一种产生您期望的顺序的方式。鉴于您坚持认为这是一个非常简单的表和一个非常简单的 order by,而且它只是间歇性地发生,我不得不同意 JNK 并说您发现 SQL Server 中的错误的机会非常小的确。

于 2013-04-12T18:54:57.350 回答
0

你试过ORDER BY LocInfo_ID desc吗?只是为了确保它确实是正在排序的 LocInfo_ID?那么这3个会不合适吗?似乎有一些想法(包括我的)认为此查询嵌入在其他内容中或作为 CTE 或 TVF 的一部分包含在内——您尚未上传执行计划。

于 2013-04-12T20:00:02.650 回答