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