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
)当记录非常多的时候(几万条),检索速度非常慢,如何提高查询速度呢,请各位老大帮助,感激不尽!!!

解决方案 »

  1.   

    哥们你的表加索引了吗?
    你可以参考这个建立索引的文章了解一下
    http://cio.ccw.com.cn/research/program/htm2005/20050120_21JXS.asp
      

  2.   

    1,a,b表建索引;
    2,用exists代替in
      

  3.   

    小弟初学能否请大虾帮我改一下SQL语句呢
      

  4.   

    我改了SQL语句:
       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.用户单位
    但是这个视图依然很慢啊,请问索引如何使用啊
      

  5.   

    (1)建立索引
    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.用户单位 
      

  6.   

    有个地方写错了
    (3)   这里...   FROM       beijian.v_plantotal       a,       beijian.planpart     b... 
            比较小的表放在 后面   
      

  7.   

    对了,老大,V_PLANTOTAL是视图不是表
      

  8.   

    学习一下使用执行计划吧 使用autotrace工具的方法 
    首先创建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   
    再执行你的查询语句,把执行计划贴出来看看 
      

  9.   

    生成视图 v_plantotal的SQL语句是什么?
      

  10.   

    /* Formatted on 2008/01/07 21:24 (Formatter Plus v4.8.8) */
    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
      

  11.   

    /*   Formatted   on   2008/01/07   21:24   (Formatter   Plus   v4.8.8)   */ 
    CREATE   OR   REPLACE   VIEW   v_plantotal   ("计划来源", 
                                                                            "序号", 
                                                                            "备件描述", 
                                                                            "请购计划号", 
                                                                            "计划状态", 
                                                                            "处理情况", 
                                                                            "专业", 
                                                                            "备件代码", 
                                                                            "备件名称", 
                                                                            "备件类型", 
                                                                            "英文名称", 
                                                                            "规格图号", 
                                                                            "主机名称", 
                                                                            "单价", 
                                                                            "请购数量", 
                                                                            "计量单位", 
                                                                            "交货日期", 
                                                                            "供应商", 
                                                                            "专业代码", 
                                                                            "生产厂商", 
                                                                            "用户单位", 
                                                                            "材质", 
                                                                            "单重", 
                                                                            "装机数量", 
                                                                            "计划说明", 
                                                                            "时间标记", 
                                                                            "分类代码", 
                                                                            "修改人", 
                                                                            "修改日期", 
                                                                            "计划受理日期", 
                                                                            "备注", 
                                                                            "自动编号" 
                                                                          ) 
    AS 
          SELECT   "计划来源",   "序号",   "备件描述",   "请购计划号",   "计划状态", 
                        "处理情况",   "专业",   "备件代码",   "备件名称",   "备件类型",   "英文名称", 
                        "规格图号",   "主机名称",   "单价",   "请购数量",   "计量单位",   "交货日期", 
                        "供应商",   "专业代码",   "生产厂商",   "用户单位",   "材质",   "单重", 
                        "装机数量",   "计划说明",   "时间标记",   "分类代码",   "修改人", 
                        "修改日期",   "计划受理日期",   "备注",   "自动编号" 
              FROM   beijian.plantotal   a 
            WHERE     NOT   EXISTS   (SELECT   自动编号 
                                                              FROM   beijian.plantocontract   a.自动编号=自动编号) 上面写错了