使用 'Where' 的查询时间比没有它的时间长

Querying time higher with 'Where' than without it

我有一些我认为很奇怪的问题。通常,我认为如果我施加限制(以便处理更少的行),查询应该持续更短的时间。但是不知道为什么,并不是这样的。也许我说错了,但我没有出错;查询似乎 运行 'till infinity'.

这是查询

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';

所以我尝试使用注释的两个子句(当然每次一个)。 他们两个都发生了同样的事情;查询 运行s 太久了,我不得不中止它。

你知道为什么会这样吗?我该怎么做,也许以不同的方式,来设置限制?

例如,字段 AUDITDATETIME 的值为“06-MAY-2017”。以那种格式。

非常感谢您

您可能需要索引...我们都可以猜测您已经拥有和需要添加的索引,但大多数 dbms 都内置了查询优化器。 如果您使用的是 MS SQL 服务器,您可以使用查询计划执行查询,这将告诉您需要添加什么索引来优化此特定查询。它甚至可以让您复制/粘贴命令来创建它。

我想你可能误解了数据库的工作原理。

首先,阅读 EXPLAIN - 通过学习阅读 EXPLAIN 语句,您可以准确地找出什么是耗时的,以及为什么。

其次 - 任何给定查询的性能特征都由一系列因素决定,但通常最大的努力不是处理行,而是找到它们。

没有索引,数据库必须查看数据库中的每一行并将其与您的 where 子句进行比较。这相当于在 phone 书中搜索 phone 编号,而不是名称(phone 书在 "last name" 上索引)。

您可以通过 creating indexes 改进这一点 - 例如,在 "AUDITDATETIME" 和 "attributeid" 列上。

与 phone 书中不同的是,数据库服务器可以支持多个索引 - 如果这些索引与您的 where 子句匹配,您的查询将会(快)得多。

最后,在 where 子句中使用 XML 字符串提取进行比较可能会非常慢,除非您对该 XML 数据进行了 index

这相当于搜索 phone 书并将街道地址从一种语言翻译成另一种语言 - 您不仅必须检查每个地址,还必须为每个项目执行昂贵的翻译步骤.