2017-08-29 57 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,则可以使用查询计划执行查询,该查询会告诉您需要添加哪个索引来优化此特定查询。它甚至可以让你复制/粘贴命令来创建它。