我的部门最近被我们的IT部门谴责(很好地)以非常高的成本运行查询,前提是我们的查询有可能破坏数据库的稳定和/或崩溃.我们都不是DBA的; 只是研究人员编写和执行对数据库的查询,我可能是唯一一个在谴责之前查看过解释计划的人.
我们被告知超过100的查询成本应该是非常罕见的,并且永远不应该运行成本超过1000的查询.我遇到的问题是成本似乎与执行时间无关,而且在尝试优化查询时我会失去工作效率.
作为一个例子,我有一个查询,在5秒内执行,成本为10844.我重写了查询以使用包含我需要的大部分信息的视图,并将成本降低到109,但新查询,它检索相同的结果,需要40秒才能运行.我在这里找到了一个可能的解释:
那个问题让我得到了并行性的暗示.我尝试/*+ no_parallel*/在成本10884查询中使用,但成本没有改变,也没有执行时间,所以我不确定并行性是解释更快的执行时间但更高的成本.然后,我尝试使用/*+ parallel(n)*/提示,发现值越高n,查询的成本就越低.在成本为10844查询的情况下,我发现/*+ parallel(140)*/将成本降低到97,执行时间略有增加.
这似乎是满足我们IT部门提出的要求的理想"作弊",但后来我读到了这个:
这篇文章包含这句话:
并行执行可以使单个操作利用所有系统资源.
所以,我的问题是:
我实际上是通过使用/*+ parallel(n)*/具有高度并行性的提示来增加服务器资源的压力,即使我降低了成本?
假设没有并行性,执行速度是否比成本更好地衡量所使用的资源?
我有一个看起来像这样的查询:
SELECT 'FY2000' AS FY, COUNT(DISTINCT SGBSTDN_PIDM) AS CHEM_MAJORS
FROM SATURN.SGBSTDN, SATURN.SFRSTCR
WHERE SGBSTDN_PIDM = SFRSTCR_PIDM
AND SGBSTDN_TERM_CODE_EFF = (SELECT MAX(SGBSTDN_TERM_CODE_EFF)
FROM SATURN.SGBSTDN
WHERE SGBSTDN_TERM_CODE_EFF <= '200002'
AND SGBSTDN_PIDM = SFRSTCR_PIDM)
AND SGBSTDN_MAJR_CODE_1 = 'CHEM'
AND SFRSTCR_TERM_CODE BETWEEN '199905' AND '200002'
AND (SFRSTCR_RSTS_CODE LIKE 'R%' OR SFRSTCR_RSTS_CODE LIKE 'W%')
AND SFRSTCR_CREDIT_HR >= 1
Run Code Online (Sandbox Code Playgroud)
它返回48的计数,我认为是正确的.但是,我不明白为什么SATURN.SFRSTCR子句在FROM子句中不需要引用SFRSTCR_PIDM.我认为子查询是自包含的,无法看到查询的其余部分?
但是,如果我将SATURN.SFRSTCR添加到子查询中,则计数更改为22.如果我取出AND SGBSTDN_PIDM = SFRSTCR_PIDM子查询,计数也会更改为22.有人可以向我解释这个吗?