查询数据库时,使用索引来排序遇到的问题

jishiping 2003-07-13 08:37:38
有一个表image1,使用下面的SQL语句创建的:
CREATE TABLE image1
(
instance_uid VARCHAR(64) NOT NULL,
image_file VARCHAR(255) NOT NULL,
rcvd_date INTEGER NULL,
rcvd_time INTEGER NULL,
file_size INTEGER NULL,
transaction_uid VARCHAR(64) NULL,
deleted VARCHAR(1) DEFAULT 'F',
key_image VARCHAR(1) DEFAULT 'F',
PRIMARY KEY (instance_uid)
)

CREATE INDEX image_delete ON image1(deleted,rcvd_date,rcvd_time)

从上面的SQL语句可以看出,字段instance_uid是主键,另外创建了一个索
引image_delete。现在程序中,我用下面的SQL语句查询,想要查询的结果
按照 deleted, rcvd_date, rcvd_time 排序,于是我使用下面的SQL语句
查询:
SELECT * FROM image1(INDEX=image_delete)

结果却发现(使用的是SQL Server 2000个人版),查询到的数据,并没有
按照deleted, rcvd_date, rcvd_time 排序。请问一下如何使用索引(INDEX)
让查询结果排序?或者SQL语句本身没有问题,而是SQL Server本身的问题?

直接使用 SELECT * FROM image1 order by deleted,rcvd_date,rcvd_time
当然可以直接排序,但是这样没有使用索引,速度很慢。所以我想在查询时
使用索引来达到快速排序的目的。如果查询时不使用索引,就没有必要去建
立image_delete这个索引了。不知道大家有没有遇到过这个问题?又如何解
决这个问题?
...全文
89 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2003-07-16
  • 打赏
  • 举报
回复
没有想到,SQL语句里需要同时指定INDEX和ORDER BY语句才行。就是:
select * from image1(INDEX=image_delete) order by deleted,rcvd_date,rcvd_time
这样才可以。本来一直以为使用了INDEX就会自动排序了,哪知道还是需要指定ORDER BY
语句才行。单独使用ORDER BY(不使用INDEX)的话,SQL不会自动使用索引,速度会很慢。
yingyys 2003-07-16
  • 打赏
  • 举报
回复
To JSP老大:

其实我也只是一知半解而已,可以查看SQL SERVER 联机丛书,从网上抄了一段

索引有两种类型,一种是聚簇索引,另一种是非聚簇索引。在一个表中,最多只能有一个聚簇索引。在聚簇索引中,表中数据的物理顺序和索引的顺序相同,都是有序的,这种结构可以大大提高数据检索的速度。在非聚簇索引中,表中数据的物理顺序与数据的插入顺序相同,是紊乱的,而与索引的顺序是不相同的。

见http://www.chinaitlab.com/www/special/sql05.asp
jishiping 2003-07-15
  • 打赏
  • 举报
回复
To yingyys(鹰):
什么叫“聚簇索引”,什么叫“非聚簇索引”?这个概念我还不知道呢。
yingyys 2003-07-15
  • 打赏
  • 举报
回复
在我这边
SELECT * FROM image1(INDEX=image_delete)
select * from image1 order by deleted,rcvd_date,rcvd_time
的查询结果也是不一样的,是不是image_delete是非聚簇索引的原故,使用

SELECT deleted,rcvd_date,rcvd_time FROM image1(INDEX=image_delete)结果是正常的
可以这样使用看看

select * from image1(INDEX=image_delete) order by deleted,rcvd_date,rcvd_time


Libran 2003-07-14
  • 打赏
  • 举报
回复
你有没有试试
SELECT * FROM image1 ORDER BY deleted, rcvd_date, rcvd_time
看看结果是怎么样的?
Libran 2003-07-14
  • 打赏
  • 举报
回复
也是没问题嘛:
SELECT * FROM image1(INDEX(image_delete))
----------------------------------------------------------------
1 1 20010710 NULL NULL NULL F F
5 5 20010710 NULL NULL NULL F F
2 2 20011001 NULL NULL NULL F F
6 6 20011001 NULL NULL NULL F F
3 3 20011018 NULL NULL NULL F F
4 4 20030711 NULL NULL NULL F F

编译失败 2003-07-14
  • 打赏
  • 举报
回复
哇!!!我都懵了,全是帶星的,高手提的問題當然要高手來回答.我沒碰到過.
jishiping 2003-07-14
  • 打赏
  • 举报
回复
SELECT * FROM image1(INDEX(image_delete)) 和
SELECT * FROM image1(INDEX=image_delete) 的结果是一样的。
查到的结果不是完全没有按照顺序排序,而是部分数据没有排序!!!在查询的结果里,可
以将查询到的结果分成很多块,在每一块里,数据是排序的,但是块与块之间,数据又是没
有排序的。现在在我的机器上,所有的 deleted 都是'F',所以就不用看 deleted 的值了,
只需要看rcvd_date,rcvd_time的值。前2笔记录是20010710的,然后是20011001的(很多笔
记录),然后是20011018的(很多笔),然后是20030711的(3笔记录),然后是1笔
20010710的,然后是20011001的(很多笔)。
jishiping 2003-07-14
  • 打赏
  • 举报
回复
SELECT * FROM image1(INDEX(image_delete)) 和
SELECT * FROM image1(INDEX=image_delete) 的结果是一样的。
查到的结果不是完全没有按照顺序排序,而是部分数据没有排序!!!在查询的结果里,可
以将查询到的结果分成很多块,在每一块里,数据是排序的,但是块与块之间,数据又是没
有排序的。现在在我的机器上,所有的 deleted 都是'F',所以就不用看 deleted 的值了,
只需要看rcvd_date,rcvd_time的值。前2笔记录是20010710的,然后是20011001的(很多笔
记录),然后是20011018的(很多笔),然后是20030711的(3笔记录),然后是1笔
20010710的,然后是20011001的(很多笔)。
jishiping 2003-07-14
  • 打赏
  • 举报
回复
使用 SELECT * FROM image1 ORDER BY deleted, rcvd_date, rcvd_time 得到的结果是
排序的,没有问题。

我已经删除过索引image_delete,重新创建索引后还是一样的结果。相同的数据,在另一
个Server版的SQL Server上,得到的也是相同的结果,真的是邪门了。
runnerrunning 2003-07-14
  • 打赏
  • 举报
回复
建议搂住这样看看:
每次执行select前,先drop掉image_delete,然后再create image_delete,然后再select,这样结果怎么样?sql server的index有page的概念,不知是否有影响?
RomanticProgrammer 2003-07-13
  • 打赏
  • 举报
回复
同意楼上!

我用过SELECT * FROM image1(INDEX(image_delete))这种语法,没有问题的。
但你说的那种格式我没有用过。计算机上也没有SQL Server,所以不知道是否也存在你说的那种问题。

Libran 2003-07-13
  • 打赏
  • 举报
回复
我的运行结果:
SELECT * FROM image1
----------------------------------------------------------------
1 1 5 NULL NULL NULL F F
2 2 4 NULL NULL NULL F F
3 3 3 NULL NULL NULL F F
4 4 2 NULL NULL NULL F F
5 5 1 NULL NULL NULL F F

SELECT * FROM image1(INDEX(image_delete))
----------------------------------------------------------------
5 5 1 NULL NULL NULL F F
4 4 2 NULL NULL NULL F F
3 3 3 NULL NULL NULL F F
2 2 4 NULL NULL NULL F F
1 1 5 NULL NULL NULL F F

我用的SQL2000个人开发版
Libran 2003-07-13
  • 打赏
  • 举报
回复
我这里可以的啊
不行你改成下面试一下:
SELECT * FROM image1(INDEX(image_delete))

摘自SQL帮助:
INDEX = 语法指定用于表提示的一个或多个索引。
仅为保持向后兼容性。 考虑删除所有对 INDEX = 的引用,并替换为(当使用多个索引提示时)对 INDEX(index, index...) 的引用,如 SELECT 中所示。
jishiping 2003-07-13
  • 打赏
  • 举报
回复
这个问题,本来是在“数据库开发”下面的“MS-SQL Server”下提问的,没有想到竟然没有
得到满意的答案。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧