黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

order by 使用索引的情況

系統 2838 0
order by使用索引 要保證那個列設置為非空

以下只在oracle10g中測試:

order by 使用索引是有條件的(只包括在有選擇的此列上,不一定適應*的情況):

1)ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序.
2)ORDER BY中所有的列必須定義為非空.

請看下面的測試:

id為PK,a上有一般索引,b列沒有索引

執行下面兩條語句,結果是先order by ,再執行rownum<20

(1)select * from tb where rownum<20 order by id;

但如果是這樣:

(2)select * from tb where rownum<20 order by b;

(3) select * from tb where rownum<20 order by a;

結果是先執行rownum<7,再order by

這是為什么呢,跟主健及其上面的索引有關系:

再看看下面的測試:----------------------------------------------------------------------------------------------------------

ID是主健.

SQL> select * from t;

??????? ID??????? ID1
---------- ----------
???????? 1????????? 2
???????? 2????????? 4
???????? 4????????? 3


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? TABLE ACCESS (FULL) OF 'T'

SQL> select * from t where rownum<3 order by id desc;

??????? ID??????? ID1
---------- ----------
???????? 4????????? 3
???????? 2????????? 4


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? COUNT (STOPKEY)
?? 2??? 1???? TABLE ACCESS (BY INDEX ROWID) OF 'T'
?? 3??? 2?????? INDEX (FULL SCAN DESCENDING) OF 'PK' (UNIQUE)
'因為是主健,先進行索引的排序全表掃描,然后在count 2'

SQL> select * from t where rownum<3 order by id1;

??????? ID??????? ID1
---------- ----------
???????? 1????????? 2
???????? 2????????? 4


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? SORT (ORDER BY)
?? 2??? 1???? COUNT (STOPKEY)
?? 3??? 2?????? TABLE ACCESS (FULL) OF 'T'
'沒有使用索引,先進行全表掃描,然后再count 2,再排序'

為什么會使用pk的索引呢?一般的索引行嗎?
我們看看:

1)在id1上創建索引


SQL> create index id1idx on t(id1);

索引已創建。
SQL> select * from t where rownum<3 order by id1;

??????? ID??????? ID1
---------- ----------
???????? 1????????? 2
???????? 2????????? 4


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? SORT (ORDER BY)
?? 2??? 1???? COUNT (STOPKEY)
?? 3??? 2?????? TABLE ACCESS (FULL) OF 'T' '還是全表掃描'

SQL> select * from t where id1>0 and rownum<3 order by id1;
'加了id1>0 ,這樣會使用到id1的索引'

??????? ID??????? ID1
---------- ----------
???????? 1????????? 2
???????? 4????????? 3


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? COUNT (STOPKEY)
?? 2??? 1???? TABLE ACCESS (BY INDEX ROWID) OF 'T'
?? 3??? 2?????? INDEX (RANGE SCAN) OF 'ID1IDX' (NON-UNIQUE)


2)pk的索引是因為有order by 而使用的。order by 使用索引是有條件的:
ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序.
ORDER BY中所有的列必須定義為非空.

因為id1是可以為空的,所以order by 不會使用它。而pk的索引是非空的,所以order by 會使用。

我們將id1設為非空看看。


SQL> alter table t
2 modify (id1 int not null);

表已更改。

SQL> select * from t where rownum<3 order by id1;

??????? ID??????? ID1
---------- ----------
???????? 1????????? 2
???????? 4????????? 3


Execution Plan
----------------------------------------------------------
?? 0????? SELECT STATEMENT Optimizer=CHOOSE
?? 1??? 0?? COUNT (STOPKEY)
?? 2??? 1???? TABLE ACCESS (BY INDEX ROWID) OF 'T'
?? 3??? 2?????? INDEX (FULL SCAN) OF 'ID1IDX' (NON-UNIQUE)
'這次,order by id1 使用了id1上的索引!'

說明 如果該表上尚未創建聚集索引,且在創建 PRIMARY KEY 約束時未指定非聚集索引,PRIMARY KEY 約束會自動創建聚集索引。

order by 使用索引的情況


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論