簡體   English   中英

SELECT * FROM 的小數據庫表 (Oracle) 的執行時間仍然很長

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM