select $ from tablename by tablenameID desc是什么意思,不明白有谁建完索引后,select * from tablename是按索引排序的吗?要是这样的话,那select * from tablename不是要换成select * from tablename order by rownum才和原来一样了?
谢谢 sasacat(傻傻猫) 我也觉得有疑问,这本书是《Sams Teach Yourself SQL In 21 Days》,应该好多人都看过的。我在机器上试过是不行的,没有按索引排序。不知道大家的怎么样,要是都不按索引排序,可能书上说的就是错的,或者在oracle上不适用。
to liuyi8903(好好学习) 书上给了例子,还有复合索引排序的例子,现在想起来,可能是SQL SERVER的例子。例子如下:例如要对BILLS 表中的ACCOUNTID 字段创建索引其CREATE INDEX 语句如下 INPUT SQL> SELECT * FROM BILLS OUTPUT NAME AMOUNT ACCOUNT_ID Phone Company 125 1 Power Company 75 1 Record Club 25 2 Software Company 250 1 Cable TV Company 35 3 Joe's Car Palace 350 5 S.C. Student Loan 200 6 Florida Water Company 20 1 U-O-Us Insurance Company 125 5 Debtor's Credit Card 35 4 INPUT/OUTPUT SQL> CREATE INDEX ID_INDEX ON BILLS( ACCOUNT_ID ); SQL> SELECT * FROM BILLS NAME AMOUNT ACCOUNT_ID Phone Company 125 1 Power Company 75 1 Software Company 250 1 Florida Water Company 20 1 Record Club 25 2 Cable TV Company 35 3 Debtor's Credit Card 35 4 Joe's Car Palace 350 5 U-O-Us Insurance Company 125 5 S.C. Student Loan 200 6 直至索引被DROP INDEX 语句删除之前BILLS 表是按照ACCOUNT_ID 的顺序进行 排序的DROP INDEX 语句是非常清楚的 SYNTAX SQL> DROP INDEX index_name; 当索引被删除以后的结果是什么样呢 INPUT/OUTPUT SQL> DROP INDEX ID_INDEX Index dropped. SQL> SELECT * FROM BILLS NAME AMOUNT ACCOUNT_ID Phone Company 125 1 Power Company 75 1 Record Club 25 2 Software Company 250 1 Cable TV Company 35 3 Joe's Car Palace 350 5 S.C. Student Loan 200 6 Florida Water Company 20 1 U-O-Us Insurance Company 125 5 Debtor's Credit Card 35 4 分析 现在的BILLS 表是它原本的形态使用索引不会对表中的物理存储造成影响 你也许想知道为什么数据库提供了索引而又允许你使用ORDER BY 子句吧 INPUT/OUTPUT SQL> SELECT * FROM BILLS ORDER BY ACCOUNT_ID; NAME AMOUNT ACCOUNT_ID Phone Company 125 1 Power Company 75 1 Software Company 250 1 Florida Water Company 20 1 Record Club 25 2 Cable TV Company 35 3 Debtor's Credit Card 35 4 Joe's Car Palace 350 5 U-O-Us Insurance Company 125 5 S.C. Student Loan 200 6 分析 它与使用ID_INDEX 语句的结果是一样的不同之处在于当你使用ORDER BY 子句 时每次运行它都需要重新进行排序而当你使用索引的时候数据库会建立一个物理索引 对象就是前边提到的树结构而在你每次运行查询时都访问同一个索引 警告当表被删除时所有与表相关的索引也将被删除 使用索引的技巧 这里给出了几个在使用索引时需要记住的技巧 l 对于小表来说使用索引对于性能不会有任何提高 l 当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高 l 当查询要返回的数据很少时索引可以优化你的查询比较好的情况是少于全部数据的 25% 如果你要返回的数据很多时索引会加大系统开销 l 索引可以提高数据的返回速度但是它使得数据的更新操作变慢在对记录和索引进 行更新时请不要忘记这一点如果要进行大量的更新操作在你执行更新操作时请不 要忘记先删除索引当执行完更新操作后只需要简单的恢复索引即可对于一次特 定的操作系统可以保存删除的索引18 个小时在这个时间内数据更新完后你可以恢 复它 l 索引会占用你的数据库的空间如果你的数据库管理系统允许你管理数据库的磁盘空 间那么在设计数据库的可用空间时要考虑索引所占用的空间 l 对字段的索引已经对两个表进行了归并操作这一技术可以极大地提高归并的速度 l 大多数数据库系统不允许你对视图创建索引如果你的数据库系统允许这样做那么 可以使用这种方法来在SELECT 语句中对视图的数据进行排序很不巧一些数据库 系统中也不允许在视图中使用ORDERY BY 子句 l 不要创建对经常需要更新或修改的字段创建索引更新索引的开销会降低你所期望获 得的性能 l 不要将索引与表存储在同一个驱动器上分开存储会去掉访问的冲突从而使结果返回 得更快 对更多的字段进行索引 SQL 也允许你对多个字段进行索引这种索引被称为复合索引下边的代码是一个简 单的复合索引的例子注意虽然是对两个字段进行索引但索引在物理结构上只有一个 INPUT/OUTPUT SQL> CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID, AMOUNT ); Index created. SQL> SELECT * FROM BILLS; NAME AMOUNT ACCOUNT_ID Florida Water Company 20 1 Power Company 75 1 Phone Company 125 1 Software Company 250 1 Record Club 25 2 Cable TV Company 35 3 Debtor's Credit Card 35 4 U-O-Us Insurance Company 125 5 Joe's Car Palace 350 5 S.C. Student Loan 200 6to rigye(瑞杰) 可能你的说法是对的
我也觉得有疑问,这本书是《Sams Teach Yourself SQL In 21 Days》,应该好多人都看过的。我在机器上试过是不行的,没有按索引排序。不知道大家的怎么样,要是都不按索引排序,可能书上说的就是错的,或者在oracle上不适用。
在SQL SERVER中,如果建立CLUSTER索引,表中的记录会按索引进行排序
其实指的排序只是说索引列内码的排序.
比如说现在有内码1.3.4.
现在插入了一条数据的索引码为2.
那么索引码就形成1.2.3.4了.是这个道理.
而非你的列的本身的order by排序.
可能我说的也不清楚.
书上给了例子,还有复合索引排序的例子,现在想起来,可能是SQL SERVER的例子。例子如下:例如要对BILLS 表中的ACCOUNTID 字段创建索引其CREATE INDEX 语句如下
INPUT
SQL> SELECT * FROM BILLS
OUTPUT
NAME AMOUNT ACCOUNT_ID
Phone Company 125 1
Power Company 75 1
Record Club 25 2
Software Company 250 1
Cable TV Company 35 3
Joe's Car Palace 350 5
S.C. Student Loan 200 6
Florida Water Company 20 1
U-O-Us Insurance Company 125 5
Debtor's Credit Card 35 4
INPUT/OUTPUT
SQL> CREATE INDEX ID_INDEX ON BILLS( ACCOUNT_ID );
SQL> SELECT * FROM BILLS
NAME AMOUNT ACCOUNT_ID
Phone Company 125 1
Power Company 75 1
Software Company 250 1
Florida Water Company 20 1
Record Club 25 2
Cable TV Company 35 3
Debtor's Credit Card 35 4
Joe's Car Palace 350 5
U-O-Us Insurance Company 125 5
S.C. Student Loan 200 6
直至索引被DROP INDEX 语句删除之前BILLS 表是按照ACCOUNT_ID 的顺序进行
排序的DROP INDEX 语句是非常清楚的
SYNTAX
SQL> DROP INDEX index_name;
当索引被删除以后的结果是什么样呢
INPUT/OUTPUT
SQL> DROP INDEX ID_INDEX
Index dropped.
SQL> SELECT * FROM BILLS
NAME AMOUNT ACCOUNT_ID
Phone Company 125 1
Power Company 75 1
Record Club 25 2
Software Company 250 1
Cable TV Company 35 3
Joe's Car Palace 350 5
S.C. Student Loan 200 6
Florida Water Company 20 1
U-O-Us Insurance Company 125 5
Debtor's Credit Card 35 4
分析
现在的BILLS 表是它原本的形态使用索引不会对表中的物理存储造成影响
你也许想知道为什么数据库提供了索引而又允许你使用ORDER BY 子句吧
INPUT/OUTPUT
SQL> SELECT * FROM BILLS ORDER BY ACCOUNT_ID;
NAME AMOUNT ACCOUNT_ID
Phone Company 125 1
Power Company 75 1
Software Company 250 1
Florida Water Company 20 1
Record Club 25 2
Cable TV Company 35 3
Debtor's Credit Card 35 4
Joe's Car Palace 350 5
U-O-Us Insurance Company 125 5
S.C. Student Loan 200 6
分析
它与使用ID_INDEX 语句的结果是一样的不同之处在于当你使用ORDER BY 子句
时每次运行它都需要重新进行排序而当你使用索引的时候数据库会建立一个物理索引
对象就是前边提到的树结构而在你每次运行查询时都访问同一个索引
警告当表被删除时所有与表相关的索引也将被删除
使用索引的技巧
这里给出了几个在使用索引时需要记住的技巧
l 对于小表来说使用索引对于性能不会有任何提高
l 当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高
l 当查询要返回的数据很少时索引可以优化你的查询比较好的情况是少于全部数据的
25% 如果你要返回的数据很多时索引会加大系统开销
l 索引可以提高数据的返回速度但是它使得数据的更新操作变慢在对记录和索引进
行更新时请不要忘记这一点如果要进行大量的更新操作在你执行更新操作时请不
要忘记先删除索引当执行完更新操作后只需要简单的恢复索引即可对于一次特
定的操作系统可以保存删除的索引18 个小时在这个时间内数据更新完后你可以恢
复它
l 索引会占用你的数据库的空间如果你的数据库管理系统允许你管理数据库的磁盘空
间那么在设计数据库的可用空间时要考虑索引所占用的空间
l 对字段的索引已经对两个表进行了归并操作这一技术可以极大地提高归并的速度
l 大多数数据库系统不允许你对视图创建索引如果你的数据库系统允许这样做那么
可以使用这种方法来在SELECT 语句中对视图的数据进行排序很不巧一些数据库
系统中也不允许在视图中使用ORDERY BY 子句
l 不要创建对经常需要更新或修改的字段创建索引更新索引的开销会降低你所期望获
得的性能
l 不要将索引与表存储在同一个驱动器上分开存储会去掉访问的冲突从而使结果返回
得更快
对更多的字段进行索引
SQL 也允许你对多个字段进行索引这种索引被称为复合索引下边的代码是一个简
单的复合索引的例子注意虽然是对两个字段进行索引但索引在物理结构上只有一个
INPUT/OUTPUT
SQL> CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID, AMOUNT );
Index created.
SQL> SELECT * FROM BILLS;
NAME AMOUNT ACCOUNT_ID
Florida Water Company 20 1
Power Company 75 1
Phone Company 125 1
Software Company 250 1
Record Club 25 2
Cable TV Company 35 3
Debtor's Credit Card 35 4
U-O-Us Insurance Company 125 5
Joe's Car Palace 350 5
S.C. Student Loan 200 6to rigye(瑞杰)
可能你的说法是对的