日期:2014-05-18  浏览次数:20722 次

sql server 2005 单表查询 不加order by时记录顺序
起因:有个老程序,源代码版本也不知道是哪个了,有个界面的数据排序有客户反映自动变。
用事件探查器查询发现没有用order by
:select * from EMR_Record_Content
我把原来的标识列bm的聚集索引去了,加了列rowindex的聚集索引,这样以后是否能保证 select * from EMR_Record_Content
+ where 条件后的且只有这1个表的查询的顺序是按rowindex的顺序输出记录吗?
SQL code


CREATE TABLE [dbo].[EMR_Record_Content](
    [bm] [bigint] IDENTITY(1,1) NOT NULL,
    [TempletKey] [bigint] NOT NULL,
    [UserID] [bigint] NOT NULL,
    [RecordID] [bigint] NOT NULL,
    [RowIndex] [bigint] NOT NULL CONSTRAINT [DF_EMR_Record_Content_Order]  DEFAULT ((0)),
    [FiledValue] [varchar](max) NOT NULL CONSTRAINT [DF_EMR_Content_Record_FiledValue]  DEFAULT (''),
    [FieldData] [varchar](max) NOT NULL CONSTRAINT [DF_EMR_Content_Record_FieldData]  DEFAULT (''),
    [isprint] [bit] NULL,
    [type] [tinyint] NULL,
    [isdelete] [bit] NULL,
 CONSTRAINT [PK_EMR_Record_Content] PRIMARY KEY NONCLUSTERED 
(
    [bm] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 30) ON [PRIMARY]
) ON [PRIMARY]


CREATE CLUSTERED INDEX IX_EMR_Record_Content ON dbo.EMR_Record_Content
    (
    RowIndex
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

go



------解决方案--------------------
最好改程序啊
------解决方案--------------------
可以,不加排序的聚集表应该就是按聚集索引顺序输出的。
------解决方案--------------------
我建议你更改sql语句,最好是由客户加入的字段来做排序,其实是个嵌入式SQL的问题.
------解决方案--------------------
如果能改的话,楼主应该早就改了,开始就说源代码不知道哪去了。
------解决方案--------------------
改sql吧 唯一的办法。
------解决方案--------------------
1,最好是找到原程序来修改.

2,把聚集索引建在rowindex列上.
------解决方案--------------------
不加排序默认是按聚集索引排序的吗
------解决方案--------------------
探讨
不加排序默认是按聚集索引排序的吗

------解决方案--------------------
探讨
引用:
不加排序默认是按聚集索引排序的吗

是的。

------解决方案--------------------
探讨
引用:
不加排序默认是按聚集索引排序的吗

是的。

------解决方案--------------------
我觉得就是13楼说的原因,要么楼主你干脆把该表上其他索引都删除,只保留聚集索引再试试。否则你没有ORDER BY,谁知道WHERE后面的条件字段有没有非聚集索引。