[英]Small DB table (Oracle) still huge execution time for SELECT * FROM
我在Oracle 12c
有一個很小的表。 它有大約 45K 條記錄,大小為 12MB(在最近收集統計數據之后)。 但是運行需要 30 秒到 1 分 30 秒
SELECT * FROM table_name;
另外如果我跑
SELECT * FROM TABLE WHERE ID = 123
(其中 id 是索引列)它也需要大約 45 秒。
可能有什么問題?
更新:按要求解釋計划。
SELECT * FROM {table_name}
SELECT STATEMENT ALL_ROWSCost: 410 Bytes: 14,733,600 Cardinality: 43,850
1 TABLE ACCESS FULL TABLE {table_name} Cost: 410 Bytes: 14,733,600 Cardinality: 43,850
SELECT * FROM {table_name} WHERE id = 123
SELECT STATEMENT ALL_ROWSCost: 2 Bytes: 672 Cardinality: 2
2 TABLE ACCESS BY INDEX ROWID BATCHED TABLE {table_name} Cost: 2 Bytes: 672 Cardinality: 2
1 INDEX RANGE SCAN INDEX {index_name} Cost: 1 Cardinality: 2
抱歉隱藏對象名稱以符合組織政策
聯系DBA后,我們發現上面的查詢主要是在等待library cache lock和library cache pin等待事件。 該表有超過 10 萬個視圖(具有 VW_TABLE_12345、VW_TABLE_12346 等動態名稱)作為依賴對象在其上創建,這顯然是一個非常糟糕的設計。 當我們更改代碼並清除所有視圖時,該表已達到應有的速度
很多事情可能是錯誤的,但有兩個是我想到的。
首先是WHERE ID = 123
查詢返回了大量行。 超過某個閾值,數據庫將決定全表掃描比使用索引更有效。 這與索引中值的基數的想法有關。
其次, ID
不是數字。 如果它是一個字符串,那么該列將被轉換為一個數字,這可能會妨礙使用索引。
還有其他可能性,但這些似乎是最有可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.