我读过的所有内容都说这不应该发生,但它会发生。我的数据库大小约为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]
)
答案 0 :(得分:9)
这应该是不可能的,假设您订购的列实际上是LocInfo_ID
,它确实是INT
,并且您确实有ORDER BY
条款到位当问题发生时。
如果您可以在这三个条件成立的情况下生成有效的复制品,那么您手上就会有一个错误(可能是由于腐败造成的)。
我怀疑这里还有其他变量我们不知道。我的猜测是你正在检查的列不是你订购的列,或者它不是你认为的数据类型,或者当你观察到这个随机的无序结果时,实际上并没有订单使用
向下投票即可,但这非常科学和合乎逻辑 - 除非(a)您没有定义它,否则SQL Server不会弄乱您定义的ORDER BY
或(b )你没有以产生预期顺序的方式定义它。鉴于你坚持认为这是一个非常简单的表和一个非常简单的顺序,它只是间歇性地发生,我必须同意JNK并说你在SQL Server中发现错误的机会非常小确实
答案 1 :(得分:0)
你试过ORDER BY LocInfo_ID desc
吗?只是为了确保它正在被排序的LocInfo_ID?那么3会不会是不合适的?似乎有一些想法(包括我的)将此查询嵌入到其他内容中或作为CTE或TVF的一部分包含在内 - 您还没有上传执行计划。