作为我的标题,我困惑于我是否应该将我的代码从静态重写到DBMS。以下是我的代码
Declare
p_Int number;
p_SchoolId number;
p_Result varchar2;
v_Exist number;
BEGIN
IF v_Exist = 0 THEN
SELECT SUM(Students) INTO p_Result
FROM SCHOOL sch
WHERE
CASE
WHEN p_SchoolId IS NULL THEN 1
WHEN sch.SchoolId = p_SchoolId THEN 1
ELSE 0 END = 1
AND
(
CASE
WHEN p_ClassId IS NULL THEN 1
WHEN sch.classid <> p_ClassId THEN 1
ELSE 0 END = 1
)
AND District IN ('NA','YB','NT') ;
END IF;
END; 据我所知,在不能使用索引的情况下,最近我有近10.000条记录,但将来可能会达到1000万条以上。
我的问题是:我使用参数作为列来过滤是很好的,有什么方法可以让它更好吗?以及我是否应该从静态重写到DBMS以确保将来的性能(我不会创建任何基于函数的索引)。
我使用的是Oracle-12c。
谢谢!
发布于 2019-09-05 13:06:48
除非我错了,否则你可以像下面这样去掉CASE:
SELECT SUM (Students)
INTO p_Result
FROM SCHOOL sch
WHERE ( sch.schoolid = p_schoolid
OR p_schoolid IS NULL)
AND ( sch.classid <> p_classid
OR p_classid IS NULL)
AND district IN ('NA', 'YB', 'NT');看看它是如何运行的,比较解释计划。
https://stackoverflow.com/questions/57798172
复制相似问题