用' Where'来查询更高的时间。没有它

时间:2017-08-29 09:07:20

标签: sql oracle constraints where restriction

我有一些我认为是srange问​​题的东西。通常,我认为如果我设置一个限制(以便处理更少的行),查询应该持续更少的时间。但我不知道为什么,事实并非如此。也许我说错了,但我没有得到错误;查询似乎只是运行到无穷大。

这是查询

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字段的值是&#39; 06-MAY-2017&#39;以那种格式。

非常感谢您提前

2 个答案:

答案 0 :(得分:1)

我认为您可能会误解数据库的工作原理。

首先,阅读EXPLAIN - 通过学习阅读EXPLAIN语句,您可以确切了解花时间和原因。

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

如果没有索引,数据库必须查看数据库中的每一行,并将其与where子句进行比较。这相当于在电话簿中搜索电话号码,而不是名称(电话簿以“姓氏”编号)。

您可以通过creating indexes改进此功能 - 例如,在“AUDITDATETIME”和“attributeid”列上。

与电话簿不同,数据库服务器可以支持多个索引 - 如果这些索引与您的where子句匹配,您的查询将(更快)。

最后,除非你对XML数据有index,否则在where子句中使用XML字符串提取进行比较可能会非常慢。

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

答案 1 :(得分:0)

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