SELECT a.计划来源, a.请购计划号, COUNT (a.请购计划号) 计划项数,
a.计划受理日期, b.计划分配时间, b.用户单位, b.办理业务员
FROM beijian.v_plantotal a, beijian.planpart b
WHERE a.请购计划号 = b.请购计划号
AND a.请购计划号 IN (SELECT DISTINCT (请购计划号)
FROM beijian.planworksheet)
GROUP BY a.计划来源,
a.请购计划号,
a.计划受理日期,
b.办理业务员,
b.计划分配时间,
b.用户单位
plantotal表:
CREATE TABLE PLANTOTAL
(
"计划来源" NVARCHAR2(28) NOT NULL,
"序号" NVARCHAR2(30),
"备件描述" VARCHAR2(400 BYTE),
"请购计划号" NVARCHAR2(50) NOT NULL,
"计划状态" NVARCHAR2(20),
"处理情况" NVARCHAR2(8),
"专业" NVARCHAR2(10),
"备件代码" VARCHAR2(100 BYTE),
"备件名称" VARCHAR2(180 BYTE),
"备件类型" VARCHAR2(350 BYTE),
"英文名称" VARCHAR2(50 BYTE),
"规格图号" VARCHAR2(200 BYTE),
"主机名称" VARCHAR2(50 BYTE),
"单价" NUMBER(10,1),
"请购数量" NUMBER(7),
"计量单位" CHAR(4 BYTE),
"交货日期" NVARCHAR2(40),
"供应商" NVARCHAR2(60),
"专业代码" VARCHAR2(60 BYTE),
"生产厂商" VARCHAR2(100 BYTE),
"用户单位" VARCHAR2(60 BYTE),
"材质" VARCHAR2(60 BYTE),
"单重" NUMBER(8,2),
"装机数量" NUMBER(8),
"计划说明" NVARCHAR2(80),
"时间标记" VARCHAR2(30 BYTE),
"分类代码" NVARCHAR2(20),
"修改人" NVARCHAR2(20),
"修改日期" VARCHAR2(30 BYTE),
"计划受理日期" VARCHAR2(30 BYTE),
"备注" NVARCHAR2(250),
"自动编号" NUMBER(15) NOT NULL
)planpart表:
CREATE TABLE PLANPART
(
"请购计划号" VARCHAR2(50 BYTE),
"办理业务员" VARCHAR2(30 BYTE),
"计划分配时间" VARCHAR2(50 BYTE),
"用户单位" VARCHAR2(50 BYTE)
)planworksheet表:
CREATE TABLE PLANWORKSHEET
(
"请购计划号" NVARCHAR2(50),
"序号" NVARCHAR2(30),
"名称" NVARCHAR2(180),
"型号" NVARCHAR2(350),
"数量" NUMBER(10),
"单位" CHAR(4 BYTE),
"生产厂商" VARCHAR2(100 BYTE),
"备注" VARCHAR2(250 BYTE),
"自动编号" NUMBER(15) NOT NULL
)当记录非常多的时候(几万条),检索速度非常慢,如何提高查询速度呢,请各位老大帮助,感激不尽!!!
a.计划受理日期, b.计划分配时间, b.用户单位, b.办理业务员
FROM beijian.v_plantotal a, beijian.planpart b
WHERE a.请购计划号 = b.请购计划号
AND a.请购计划号 IN (SELECT DISTINCT (请购计划号)
FROM beijian.planworksheet)
GROUP BY a.计划来源,
a.请购计划号,
a.计划受理日期,
b.办理业务员,
b.计划分配时间,
b.用户单位
plantotal表:
CREATE TABLE PLANTOTAL
(
"计划来源" NVARCHAR2(28) NOT NULL,
"序号" NVARCHAR2(30),
"备件描述" VARCHAR2(400 BYTE),
"请购计划号" NVARCHAR2(50) NOT NULL,
"计划状态" NVARCHAR2(20),
"处理情况" NVARCHAR2(8),
"专业" NVARCHAR2(10),
"备件代码" VARCHAR2(100 BYTE),
"备件名称" VARCHAR2(180 BYTE),
"备件类型" VARCHAR2(350 BYTE),
"英文名称" VARCHAR2(50 BYTE),
"规格图号" VARCHAR2(200 BYTE),
"主机名称" VARCHAR2(50 BYTE),
"单价" NUMBER(10,1),
"请购数量" NUMBER(7),
"计量单位" CHAR(4 BYTE),
"交货日期" NVARCHAR2(40),
"供应商" NVARCHAR2(60),
"专业代码" VARCHAR2(60 BYTE),
"生产厂商" VARCHAR2(100 BYTE),
"用户单位" VARCHAR2(60 BYTE),
"材质" VARCHAR2(60 BYTE),
"单重" NUMBER(8,2),
"装机数量" NUMBER(8),
"计划说明" NVARCHAR2(80),
"时间标记" VARCHAR2(30 BYTE),
"分类代码" NVARCHAR2(20),
"修改人" NVARCHAR2(20),
"修改日期" VARCHAR2(30 BYTE),
"计划受理日期" VARCHAR2(30 BYTE),
"备注" NVARCHAR2(250),
"自动编号" NUMBER(15) NOT NULL
)planpart表:
CREATE TABLE PLANPART
(
"请购计划号" VARCHAR2(50 BYTE),
"办理业务员" VARCHAR2(30 BYTE),
"计划分配时间" VARCHAR2(50 BYTE),
"用户单位" VARCHAR2(50 BYTE)
)planworksheet表:
CREATE TABLE PLANWORKSHEET
(
"请购计划号" NVARCHAR2(50),
"序号" NVARCHAR2(30),
"名称" NVARCHAR2(180),
"型号" NVARCHAR2(350),
"数量" NUMBER(10),
"单位" CHAR(4 BYTE),
"生产厂商" VARCHAR2(100 BYTE),
"备注" VARCHAR2(250 BYTE),
"自动编号" NUMBER(15) NOT NULL
)当记录非常多的时候(几万条),检索速度非常慢,如何提高查询速度呢,请各位老大帮助,感激不尽!!!
你可以参考这个建立索引的文章了解一下
http://cio.ccw.com.cn/research/program/htm2005/20050120_21JXS.asp
2,用exists代替in
SELECT a.计划来源, a.请购计划号, COUNT (a.请购计划号) 计划项数,
a.计划受理日期, b.计划分配时间, b.用户单位, b.办理业务员
FROM beijian.v_plantotal a, beijian.planpart b
WHERE a.请购计划号 = b.请购计划号
AND EXISTS (SELECT DISTINCT (请购计划号)
FROM beijian.planworksheet where a.请购计划号=请购计划号)
GROUP BY a.计划来源,
a.请购计划号,
a.计划受理日期,
b.办理业务员,
b.计划分配时间,
b.用户单位
但是这个视图依然很慢啊,请问索引如何使用啊
create index ind_v_plantotal on v_plantotal(请购计划号),
create index ind_planpart on planpart(请购计划号)
---------(对于连接,建立聚簇最好)(2)去掉"DISTINCT (请购计划号) " 应该会好些,这里没的distinct没什么作用,
但使用DISTINCT 会耗费资源在排序功能.(3) 这里... FROM beijian.v_plantotal a, beijian.planpart b...
比较小的表放在前面
基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的.
如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径.
如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM 子句中列在最后的那个表.
(4)set autot on 看看执行计划最好,看执行计划才真实知道为什么慢!!没有执行计划只能根据理论猜测SELECT a.计划来源, a.请购计划号, COUNT (a.请购计划号) 计划项数,
a.计划受理日期, b.计划分配时间, b.用户单位, b.办理业务员
FROM beijian.v_plantotal a, beijian.planpart b
WHERE a.请购计划号 = b.请购计划号
AND EXISTS (SELECT 1
FROM beijian.planworksheet where 请购计划号=a.请购计划号)
GROUP BY a.计划来源,
a.请购计划号,
a.计划受理日期,
b.办理业务员,
b.计划分配时间,
b.用户单位
(3) 这里... FROM beijian.v_plantotal a, beijian.planpart b...
比较小的表放在 后面
首先创建plan_table表,并赋予权限
(1)conn system as sysdba
(2) @[oracle_home]/rdbms/admin/utlxplan.sql
(3)create public synonym plan_table for plan_table;
(4)grant all on plan_table to public;
下一步骤是创建并授予plustrace角色
(1)conn sys as sysdba
(2)@[oracle_home]/sqlplus/admin/plustrce.sql
(3)grant plustrace to public; 完成上面步骤后
conn 用户名/****
set autot on
再执行你的查询语句,把执行计划贴出来看看
CREATE OR REPLACE VIEW v_plantotal ("计划来源",
"序号",
"备件描述",
"请购计划号",
"计划状态",
"处理情况",
"专业",
"备件代码",
"备件名称",
"备件类型",
"英文名称",
"规格图号",
"主机名称",
"单价",
"请购数量",
"计量单位",
"交货日期",
"供应商",
"专业代码",
"生产厂商",
"用户单位",
"材质",
"单重",
"装机数量",
"计划说明",
"时间标记",
"分类代码",
"修改人",
"修改日期",
"计划受理日期",
"备注",
"自动编号"
)
AS
SELECT "计划来源", "序号", "备件描述", "请购计划号", "计划状态",
"处理情况", "专业", "备件代码", "备件名称", "备件类型", "英文名称",
"规格图号", "主机名称", "单价", "请购数量", "计量单位", "交货日期",
"供应商", "专业代码", "生产厂商", "用户单位", "材质", "单重",
"装机数量", "计划说明", "时间标记", "分类代码", "修改人",
"修改日期", "计划受理日期", "备注", "自动编号"
FROM beijian.plantotal a
WHERE 自动编号 NOT EXISTS (SELECT 自动编号
FROM beijian.plantocontract a.自动编号=自动编号)这个是V_PLANTOTAL的视图,其他的同上.
gxlineji老大能否帮我看下呢,你有QQ联系方式吗?我的是150312732
CREATE OR REPLACE VIEW v_plantotal ("计划来源",
"序号",
"备件描述",
"请购计划号",
"计划状态",
"处理情况",
"专业",
"备件代码",
"备件名称",
"备件类型",
"英文名称",
"规格图号",
"主机名称",
"单价",
"请购数量",
"计量单位",
"交货日期",
"供应商",
"专业代码",
"生产厂商",
"用户单位",
"材质",
"单重",
"装机数量",
"计划说明",
"时间标记",
"分类代码",
"修改人",
"修改日期",
"计划受理日期",
"备注",
"自动编号"
)
AS
SELECT "计划来源", "序号", "备件描述", "请购计划号", "计划状态",
"处理情况", "专业", "备件代码", "备件名称", "备件类型", "英文名称",
"规格图号", "主机名称", "单价", "请购数量", "计量单位", "交货日期",
"供应商", "专业代码", "生产厂商", "用户单位", "材质", "单重",
"装机数量", "计划说明", "时间标记", "分类代码", "修改人",
"修改日期", "计划受理日期", "备注", "自动编号"
FROM beijian.plantotal a
WHERE NOT EXISTS (SELECT 自动编号
FROM beijian.plantocontract a.自动编号=自动编号) 上面写错了