2017-12-18 255 views
0

爲什麼Yii2使用ALL_OBJECTS掃描架構,然後通過OWNER =「owner_name」進行篩選,而不是隻掃描USER_OBJECTS?Yii2模式掃描ALL_OBJECTS而不掃描USER_OBJECTS?

由於某些原因,掃描ALL_OBJECTS時執行查詢需要很長的執行時間(45秒),查詢USER_OBJECTS時需要大約2秒。 (生產環境)

SELECT 
    A.COLUMN_NAME, 
    A.DATA_TYPE, 
    A.DATA_PRECISION, 
    A.DATA_SCALE, 
    A.DATA_LENGTH, 
    A.NULLABLE, 
    A.DATA_DEFAULT, 
    COM.COMMENTS AS COLUMN_COMMENT 
FROM ALL_TAB_COLUMNS A 
    INNER JOIN ALL_OBJECTS B ON B.OWNER = A.OWNER AND LTRIM(B.OBJECT_NAME) = LTRIM(A.TABLE_NAME) 
    LEFT JOIN ALL_COL_COMMENTS COM ON (A.OWNER = COM.OWNER AND A.TABLE_NAME = COM.TABLE_NAME AND A.COLUMN_NAME = COM.COLUMN_NAME) 
WHERE 
    A.OWNER = 'owner_name' 
    AND B.OBJECT_TYPE IN ('TABLE', 'VIEW', 'MATERIALIZED VIEW') 
    AND B.OBJECT_NAME = 'object_name' 
ORDER BY A.COLUMN_ID 

由於

回答

0

有訪問ALL_*視圖/同義詞和USER_*視圖/同義詞之間的差。

ALL_OBJECTS描述了當前可用的所有對象,而USER_OBJECTS僅列出了屬於當前用戶的對象。

+0

但是,由於它已經作爲特定用戶連接,爲什麼不能訪問USER_ *?,我不太關心數據庫和特定的oracle,只是試圖理解這個框架邏輯背後的原因。 – Dunams