2017-08-29 104 views
0

我有一些我認爲是一個奇怪的問題。通常情況下,我認爲如果我放置一個限制(以便處理更少的行),Query應該會持續更少的時間。但我不知道爲什麼,事實並非如此。也許我錯了,但我沒有得到錯誤;該查詢似乎運行到'無限'。查詢時間比'沒有'更高

這是查詢

SELECT 
    A.ENTITYID AS ORG_ID, 
    A.ID_VALUE AS LEI, 
    A.MODIFIED_BY, 
    A.AUDITDATETIME AS LAST_DATE_MOD 
FROM (
SELECT 
    CASE WHEN IFE.NEWVALUE IS NOT NULL 
     then EXTRACTVALUE(xmltype(IFE.NEWVALUE), '/DocumentElement/ORG_IDENTIFIERS/ID_TYPE') 
     ELSE NULL 
    end as ID_TYPE, 
    case when IFE.NEWVALUE is not null 
     then EXTRACTVALUE(xmltype(IFE.NEWVALUE), '/DocumentElement/ORG_IDENTIFIERS/ID_VALUE') 
     ELSE NULL 
    END AS ID_VALUE, 
    (select u.username from admin.users u where u.userid = ife.analystuserid) as Modified_by, 
    ife.* 
FROM ife.audittrail ife 
WHERE 
    --IFE.AUDITDATETIME >= '01-JUN-2016' AND 
    attributeid = 499 
    AND ROWNUM <= 10000 
    AND (CASE WHEN IFE.NEWVALUE IS NOT NULL then EXTRACTVALUE(xmltype(IFE.NEWVALUE), '/DocumentElement/ORG_IDENTIFIERS/ID_TYPE') ELSE NULL end) = '38') A 
--WHERE A.AUDITDATETIME >= '01-JUN-2016'; 

所以我評論說這兩個子句嘗試(當然每一次每一個)。 而且他們兩個發生相同的;該查詢運行很長時間,我不得不放棄它。

你知道爲什麼會發生這種情況嗎?我怎麼可能用不同的方式來限制?

例如,AUDITDATETIME字段的值是'06 -MAY-2017'。以那種格式。

非常感謝你提前

+0

有時更多的限制意味着更多的表掃描或更多的連接,這是非常耗時的。 – Lamar

+0

必須有一個'索引'適用於你在更短的時間內獲得結果的列 –

+0

更不用說EXTRACTVALUE關於性能的expriive。 – Lamar

回答

1

我想你可能會誤解數據庫是如何工作的。

首先,請閱讀EXPLAIN - 通過學習閱讀EXPLAIN語句,您可以準確找出需要花費的時間以及原因。其次 - 任何給定查詢的性能特徵都是由一系列事物決定的,但通常最大的努力不是處理行,而是發現它們。

如果沒有索引,數據庫必須查看數據庫中的每一行並將其與where子句進行比較。這相當於在電話簿中搜索電話號碼,而不是姓名(電話簿以「姓氏」爲索引)。

您可以通過creating indexes來改進 - 例如,在「AUDITDATETIME」和「attributeid」列上。

與電話簿不同,數據庫服務器可以支持多個索引 - 如果這些索引與您的where子句匹配,您的查詢將會(快得多)。

最後,在where子句中使用XML字符串提取進行比較可能會非常緩慢,除非在該XML數據上有index

這相當於搜索電話簿並將街道地址從一種語言翻譯爲另一種語言 - 不僅要檢查每個地址,還必須爲每個項目執行昂貴的翻譯步驟。

+0

嘿,謝謝你的回答。我會閱讀那篇文章。 另一方面,我不明白你的意思是什麼: 「你可以通過創建索引來改善它 - 例如,在」AUDITDATETIME「和」attributeid「列上。 通過索引我瞭解對象在向量中的位置。在這種情況下你是什麼意思? –

+0

嗨,我已經添加了一個鏈接到「創建索引」的文檔。在解決這個問題之前,你可能想閱讀一本關於數據庫和SQL的更通用的書 - 這不是你通過試驗和錯誤發現的東西.... –

0

你可能需要指數(ES)......我們都可以讓你已經有了哪些索引猜測,並需要增加,但大多數DBMS有內置的查詢優化。 如果您使用的是MS SQL Server,則可以使用查詢計劃執行查詢,該查詢會告訴您需要添加哪個索引來優化此特定查詢。它甚至可以讓你複製/粘貼命令來創建它。