【问题标题】:Querying time higher with 'Where' than without it使用 'Where' 的查询时间比没有它的时间长
【发布时间】:2018-02-06 15:57:48
【问题描述】:

我有一些我认为很奇怪的问题。通常,我认为如果我施加限制,查询应该持续更少的时间(以便处理更少的行)。但我不知道为什么,事实并非如此。也许我说错了,但我没有出错;查询似乎运行“直到无穷大”。

这是查询

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”。采用那种格式。

非常感谢您

【问题讨论】:

  • 有时更多的限制意味着更多的表扫描,或者更多的连接,这很耗时。
  • 必须在列上应用index,以便在更短的时间内获得结果
  • 更不用说 EXTRACTVALUE 在性能方面是昂贵的。
  • 想必它不会很快找到符合条件的10,000行。

标签: sql oracle constraints where restriction


【解决方案1】:

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

首先,阅读EXPLAIN - 通过学习阅读 EXPLAIN 语句,您可以准确了解什么需要时间,以及为什么。

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

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

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

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

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

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

【讨论】:

  • 您好,感谢您的回答。我会读那篇文章。另一方面,我不太明白您的意思是什么:“您可以通过创建索引来改进这一点 - 例如,在列“AUDITDATETIME”和“attributeid”上。通过索引,我了解对象在向量中的位置。在这种情况下你是什么意思?
  • 您好,我添加了“创建索引”文档的链接。在解决这个问题之前,您可能想阅读一本关于数据库和 SQL 的更通用的书——这不是您通过反复试验发现的那种东西......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多