新聞中心
為了加快你的查詢,增加正確的索引是必不可少的。 但是過(guò)了一段時(shí)間,當(dāng)你的系統(tǒng)增長(zhǎng)了,你可能會(huì)發(fā)現(xiàn)自己大量的索引導(dǎo)致數(shù)據(jù)庫(kù)的寫(xiě)操作變慢 -- 由于每一次對(duì)表的寫(xiě)操作,都需要在事務(wù)中更新索引。

我們擁有十載網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站建設(shè)經(jīng)驗(yàn),從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁(yè)設(shè)計(jì)師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、手機(jī)網(wǎng)站制作、H5開(kāi)發(fā)、等業(yè)務(wù)。無(wú)論您有什么樣的網(wǎng)站設(shè)計(jì)或者設(shè)計(jì)方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計(jì)服務(wù)并滿足您的需求。
也許,五年后, 你的數(shù)據(jù)庫(kù)(和你的查詢)在某種方式中進(jìn)化,不再需要一些索引了。例如,有一些明顯的情況下,這兩個(gè)索引是多余的:
- -- 原設(shè)計(jì)
- CREATE INDEX ON customer (first_name);
- -- 5年后
- CREATE INDEX ON customer (first_name, last_name);
但在許多其他情況下,事情并沒(méi)有那么明顯。例如…
- 你可能添加了一個(gè)在外鍵上的索引,但隨著表的增長(zhǎng),你的數(shù)據(jù)庫(kù)開(kāi)始運(yùn)行更多的哈希聯(lián)接,而不是嵌套循環(huán)聯(lián)接,這種情況下索引并沒(méi)有被使用。
- 或者,你已經(jīng)完全停止查詢姓/名。
- 或者你已經(jīng)開(kāi)始使用一個(gè)比實(shí)際名稱更具選擇性的謂詞。
- 或者你的客戶突然都叫史密斯。
每個(gè)人都叫史密斯-倒霉的索引!
如果你的索引不再被使用,你可以(并且應(yīng)該)刪除它們。
但如何找到未使用的索引
如果你使用的是Oracle數(shù)據(jù)庫(kù),并且你訪問(wèn)的是生產(chǎn)系統(tǒng),實(shí)際上有一個(gè)非常好的方法來(lái)查詢?cè)\斷表,以便知道在游標(biāo)緩存中是否有任何查詢,當(dāng)前正在使用你的索引。只要運(yùn)行:
- SELECT sql_fulltext
- FROM v$sql
- WHERE sql_id IN (
- SELECT sql_id
- FROM v$sql_plan
- WHERE (object_owner, object_name)
- = (('OWNER', 'IDX_CUSTOMER_FIRST_NAME'))
- )
- ORDER BY sql_text;
這個(gè)查詢做了什么?它運(yùn)行游標(biāo)緩存中的所有SQL語(yǔ)句(V$SQL)并檢查他們每一個(gè)是否在游標(biāo)緩存(v$sql_plan)訪問(wèn)索引中存在任何執(zhí)行計(jì)劃元素。完成。
當(dāng)然,如果上述查詢沒(méi)有返回任何結(jié)果,這并不意味著沒(méi)有人使用你的索引。可能還有一個(gè)非常罕見(jiàn)的查詢,一年只會(huì)發(fā)生一次,它被游標(biāo)緩存清除了。
但是如果你將上述查詢作為一個(gè)工作運(yùn)行一段時(shí)間,你就可以得出這樣的結(jié)論:如果這個(gè)查詢不返回任何行,你的索引可能將不再需要了。
我能發(fā)現(xiàn)不需要的索引嗎?
當(dāng)然!運(yùn)行一個(gè)類似的查詢,列出沒(méi)有引用V $ sql_plan表的所有引用:
- SELECT owner, index_name
- FROM all_indexes
- WHERE owner = 'OWNER'
- AND (owner, index_name) NOT IN (
- SELECT object_owner, object_name
- FROM v$sql_plan
- WHERE object_owner IS NOT NULL
- AND object_name IS NOT NULL
- )
- ORDER BY 1, 2
同樣,這并不是說(shuō)你的索引將永遠(yuǎn)不會(huì)被使用,只是它們最近還沒(méi)有被使用過(guò)?,F(xiàn)在,我不會(huì)真的給你展示使用上述語(yǔ)句的查詢,在PL/SQL循環(huán)中運(yùn)行其結(jié)果和使用EXECUTE IMMEDIATE刪除所有的索引,因?yàn)槟憧赡茉谀愕纳a(chǎn)環(huán)境中嘗試。但是,以防萬(wàn)一你想嘗試,這里有一個(gè)提示BEGIN
- BEGIN
- FOR i IN (/* above query here */) LOOP
- EXECUTE IMMEDIATE
- 'DR0P INDEX "' || i.owner || '"."' || i.index_name || '"';
- END LOOP;
- END;
- /
但正如我說(shuō)的。不要真的這樣做!
分享標(biāo)題:你的數(shù)據(jù)庫(kù)索引是否真的起作用了?
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/cccdeji.html


咨詢
建站咨詢
