Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle顶级优化_Sql_Oracle_Query Optimization_Database Performance_Top N - Fatal编程技术网

Sql Oracle顶级优化

Sql Oracle顶级优化,sql,oracle,query-optimization,database-performance,top-n,Sql,Oracle,Query Optimization,Database Performance,Top N,我无法优化语句。Corresponding table INTERVAL_TBL包含大约11.000.000行,这导致在我的测试系统上该语句大约需要8秒。即使在专用的Oracle服务器24gb RAM、17gb DB大小上,也需要大约4-5秒的时间 SELECT ID, STATUS_ID, INTERVAL_ID, BEGIN_TS, END_TS, PT, DISPLAYTEXT, RSC FROM ( SELECT INTERVAL_TBL.ID, INTERVAL_TBL.

我无法优化语句。Corresponding table INTERVAL_TBL包含大约11.000.000行,这导致在我的测试系统上该语句大约需要8秒。即使在专用的Oracle服务器24gb RAM、17gb DB大小上,也需要大约4-5秒的时间

SELECT 
ID, STATUS_ID, INTERVAL_ID, BEGIN_TS, END_TS, PT, DISPLAYTEXT, RSC
FROM 
(
SELECT 
    INTERVAL_TBL.ID, INTERVAL_TBL.INTERVAL_ID, INTERVAL_TBL.STATUS_ID, INTERVAL_TBL.BEGIN_TS, INTERVAL_TBL.END_TS, INTERVAL_TBL.PT, ST_TBL.DISPLAYTEXT, ST_TBL.RSC,
    RANK() OVER (ORDER BY BEGIN_TS DESC) MY_RANK
FROM INTERVAL_TBL
INNER JOIN ST_TBL ON ST_TBL.STATUS_ID = INTERVAL_TBL.STATUS_ID
WHERE ID = '<id>'
)
WHERE MY_RANK <= 10
间隔中的行\u TBL:10.673.122 ST_TBL中的行数:46 联接子集中的行:10.673.122 ID为530.073的筛选器的联接子集中的行
理想情况下,它将下降到大约几毫秒。这就是MS SQL Server中10.000.000行的语句。

首先,我将在外部范围内执行到ST_TBL的内部联接,我得到了一个加速。在我的执行计划中,通过比较两种变体,它降低了成本,IO成本减少了一个字节。 我假设PT、DISPLAYTEXT和RSC列是表ST_TBL的一部分

SELECT 
    ID, STATUS_ID, INTERVAL_ID, BEGIN_TS, END_TS, SRESULT.PT, SRESULT.DISPLAYTEXT, SRESULT.RSC
FROM 
(
    SELECT 
        ID, INTERVAL_ID, INTERVAL_TBL.STATUS_ID, BEGIN_TS, END_TS,
        RANK() OVER (ORDER BY BEGIN_TS DESC) MY_RANK
    FROM INTERVAL_TBL
    WHERE ID = '<id>'
) SRESULT
INNER JOIN ST_TBL ON ST_TBL.STATUS_ID = SRESULT.STATUS_ID
WHERE MY_RANK <= 10

调整就是关于细节。每个表有多少行?在合并的结果集中有多少是1100万?按ID过滤时有多少个,它属于哪个表?此外,在没有看到其解释计划的情况下,很难对查询性能进行任何具体的观察。时间到哪里去了?老实说,4-5秒对于1100万行的排序来说并不太糟糕。您想在什么时候开始?您是否尝试只使用fetch first 10 rows而不是window函数?很遗憾,这不是一个选项,因为我需要支持较旧的Oracle版本。interval_tbl.id的数据类型是什么?根据您的sql,您正在传递一个字符串,但作为一个ID,我希望这是一个数字,通过传递一个字符串,您将导致列值的隐式类型转换,并且不允许Oracle对列使用可能的索引。
SELECT 
    ID, STATUS_ID, INTERVAL_ID, BEGIN_TS, END_TS, SRESULT.PT, SRESULT.DISPLAYTEXT, SRESULT.RSC
FROM 
(
    SELECT 
        ID, INTERVAL_ID, INTERVAL_TBL.STATUS_ID, BEGIN_TS, END_TS,
        RANK() OVER (ORDER BY BEGIN_TS DESC) MY_RANK
    FROM INTERVAL_TBL
    WHERE ID = '<id>'
) SRESULT
INNER JOIN ST_TBL ON ST_TBL.STATUS_ID = SRESULT.STATUS_ID
WHERE MY_RANK <= 10