这里有8张表,每张表的数据量都是百万级。表间关系确定,但是存在1对1和1对N的情况。用户可以选择查看任意表的任意列,可以将任何一个或多个字段设为where条件。具体场景如下:
一共是A、B、C、D、E、F、G、H表,用户先选择查看A表的a1、a2和B表的b1、b2字段,where条件是a3='1',b3='2'.将查询结果分页显示给客户。客户此基础上,要再看看D表的d1字段,于是增加条件d3='4'。如此分步查询,最后可能将8张表的数据都查出来,分页显示。
因为这里没有主次表之分,所以不存在左、右连接的问题。每条数据都必须满足所有的where条件。
索引之类的都已建好,常说的不用like、in之类的方法是不行的,有没有方法在sql上进行优化。
一共是A、B、C、D、E、F、G、H表,用户先选择查看A表的a1、a2和B表的b1、b2字段,where条件是a3='1',b3='2'.将查询结果分页显示给客户。客户此基础上,要再看看D表的d1字段,于是增加条件d3='4'。如此分步查询,最后可能将8张表的数据都查出来,分页显示。
因为这里没有主次表之分,所以不存在左、右连接的问题。每条数据都必须满足所有的where条件。
索引之类的都已建好,常说的不用like、in之类的方法是不行的,有没有方法在sql上进行优化。
我做过的一个分页
CREATE OR REPLACE PROCEDURE pro_Pagination(
Pindex in number,
Psql in string,
Psize in number,
Pcount out number,
outCursor out SYS_REFCURSOR
)
AS v_sql string(32000);
v_count number;
v_Plow number;
v_Phei number;
-- v_string varchar2(1000);
-- v_col string(8000);
-- v_col_mid string(40);
-- v_col_count int;
Begin
------------------------------------------------------------取分页总数
v_sql := 'select count(*) from (' || replace(Psql,chr(38),'') || ')';
execute immediate v_sql into v_count;
--解析表名
/* select substr(''|| Psql ||'',instr(''|| Psql ||'','from')+4,
length(''|| Psql ||'')-instr(''|| Psql ||'','from')-5) into v_string from dual;
select count(*) into v_col_count from user_col_comments where table_name=''||upper(trim(v_string))||'';
for i in 1..v_col_count loop
select col into v_col_mid from (
select t.column_name||',' col,rownum rm from user_col_comments t where table_name=''||upper(trim(v_string))||'')
where rm=i;
v_col:=v_col||v_col_mid;
end loop;
v_col:=substr(v_col,1,length(v_col)-1);*/
------------------------------------------------------------显示任意页内容
Pcount := ceil(v_count/Psize);
v_Phei := Pindex * Psize + Psize;
v_Plow := v_Phei - Psize + 1;
--Psql := 'select rownum rm,t.* from gridh_pole t' ; --要求必须包含rownum字段
v_sql := 'select * from (' || Psql || ') where rm between ' || v_Plow || ' and ' || v_Phei ;
--'||v_col||' open outCursor for v_sql; End pro_Pagination; --**************************************************************************************