起因:有个老程序,源代码版本也不知道是哪个了,有个界面的数据排序有客户反映自动变。
用事件探查器查询发现没有用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后面的条件字段有没有非聚集索引。