使用 '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 书并将街道地址从一种语言翻译成另一种语言 - 您不仅必须检查每个地址,还必须为每个项目执行昂贵的翻译步骤.
我有一些我认为很奇怪的问题。通常,我认为如果我施加限制(以便处理更少的行),查询应该持续更短的时间。但是不知道为什么,并不是这样的。也许我说错了,但我没有出错;查询似乎 运行 '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 书并将街道地址从一种语言翻译成另一种语言 - 您不仅必须检查每个地址,还必须为每个项目执行昂贵的翻译步骤.