Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle组的时间过长_Sql_Oracle_Group By_Ora 00979 - Fatal编程技术网

Sql Oracle组的时间过长

Sql Oracle组的时间过长,sql,oracle,group-by,ora-00979,Sql,Oracle,Group By,Ora 00979,我有一个疑问: SELECT B.BILL_BALANCE, B.PRIME_UID, home.IDENT, PRESENT.ACC_LOGIN, PRESENT.ACCOUNT_NAME2, eq .ACCESS_NO AS PHONE, adres.DISP_STREET_NAME, B.BILL_DT FROM addresses adres , BILL_HI

我有一个疑问:

  SELECT B.BILL_BALANCE,
       B.PRIME_UID,
       home.IDENT,
       PRESENT.ACC_LOGIN,
       PRESENT.ACCOUNT_NAME2,
       eq .ACCESS_NO AS PHONE,
           adres.DISP_STREET_NAME,
           B.BILL_DT
FROM addresses adres ,
     BILL_HISTORY B
LEFT JOIN eq eq ON eq.ACCOUNT_NO = B.ACCOUNT_NO
JOIN sec PRESENT ON B.ACCOUNT_NO = PRESENT.ACCOUNT_NO
JOIN sec_text home ON home.ACCOUNT_NO = B.ACCOUNT_NO
WHERE eq.STATUS_CD = 'CU'
  AND (B.BILL_TP_CD='CB'
       OR B.BILL_TP_CD='FB')
  AND (PRESENT.bill_addr_UID=adres.PRIME_UID
       OR PRESENT.COMPANY_REG_ADDR_UID=adres.PRIME_UID)
  AND B.BILL_PAID_DT IS NULL
  AND B.BILL_DT >= to_date('2011-07-01')
  AND B.BILL_DT <= to_date('2011-07-02')
  AND rownum <=1000
GROUP BY B.PRIME_UID,
         B.BILL_BALANCE,
         home.IDENT,
         PRESENT.ACC_LOGIN,
         PRESENT.ACCOUNT_NAME2,
         eq .ACCESS_NO,
             adres.DISP_STREET_NAME,
             B.BILL_DT
我将所有列添加到“分组依据”中,它可以正常工作

此查询仅适用于“rownum”。当我尝试删除“rownum”时-接近的数据太长..超过50分钟

如何在不使用行计数的情况下重写sql?
谢谢

表中的近似数据超过100000。

更新*
“解释计划”不起作用

Array
(
    [error] => 1
    [error text] => not found
    [sql] => EXPLAIN PLAN FOR
SELECT  B.BILL_BALANCE,B.PRIME_UID,home.IDENT,PRESENT.ACC_LOGIN,PRESENT.ACCOUNT_NAME2,eq .ACCESS_NO as PHONE,adres.DISP_STREET_NAME,B.BILL_DT
FROM addresses adres ,BILL_HISTORY B 
     LEFT JOIN eq eq ON eq.ACCOUNT_NO = B.ACCOUNT_NO 
     JOIN   sec PRESENT
         ON B.ACCOUNT_NO = PRESENT.ACCOUNT_NO
     JOIN sec_text home
         ON home.ACCOUNT_NO = B.ACCOUNT_NO



WHERE  
eq.STATUS_CD = 'CU'  AND
 (B.BILL_TP_CD='CB' OR B.BILL_TP_CD='FB') 
AND  (PRESENT.bill_addr_UID=adres.PRIME_UID OR PRESENT.COMPANY_REG_ADDR_UID=adres.PRIME_UID) 
AND B.BILL_PAID_DT IS NULL 
 AND B.BILL_DT >= to_date('2011-07-01') 
 AND B.BILL_DT <= to_date('2011-07-02') 

AND rownum <=10
GROUP BY B.PRIME_UID,B.BILL_BALANCE,home.IDENT,PRESENT.ACC_LOGIN,PRESENT.ACCOUNT_NAME2,eq .ACCESS_NO,adres.DISP_STREET_NAME,B.BILL_DT
)
数组
(
[错误]=>1
[错误文本]=>未找到
[sql]=>解释计划
选择B.BILL\u余额、B.PRIME\u UID、home.IDENT、PRESENT.ACC\u登录、PRESENT.ACCOUNT\u NAME 2、eq.ACCESS\u NO as PHONE、address.DISP\u STREET\u NAME、B.BILL\u DT
来自地址adres,BILL_历史B
左连接等式上的等式。帐户号=B。帐户号
加入证券交易委员会
在B.账户上(无)=当前账户(无)
加入sec_文本主页
ON home.ACCOUNT\u NO=B.ACCOUNT\u NO
哪里
等式状态\u CD=‘CU’和
(B.BILL_TP_CD='CB'或B.BILL_TP_CD='FB')
和(PRESENT.bill\u addr\u UID=adres.PRIME\u UID或PRESENT.COMPANY\u REG\u addr\u UID=adres.PRIME\u UID)
B.BILL_PAID_DT为空
B.截至日期(2011年7月1日)

B.BILL_DT如果没有一个解释计划,很难说清楚,但我认为问题与此有关:

FROM latrep.ADDRESSES adres ,
     BILL_HISTORY B
这里有一个笛卡尔乘积。如果没有连接条件,它会将地址中的每一行连接到BILL_历史记录中的每一行,再加上所有其他连接。这将花费很长的时间。您稍后会尝试缩小它的范围,但我怀疑OR导致它必须进行完整的表扫描和笛卡尔乘积,然后才能访问符合以下任何标准:

  AND (SUB.bill_addr_UID=adres.PRIME_UID
       OR SUB.COMPANY_REG_ADDR_UID=adres.PRIME_UID)

尝试将BILL_历史记录完全从查询中删除,看看性能是否有显著提高。如果有,这可能就是您的问题所在。(然后去见DBA,让EXPLAIN PLAN开始工作,解决这样的问题确实是必要的。)如果没有解释计划,很难说清楚,但我认为问题与此有关:

FROM latrep.ADDRESSES adres ,
     BILL_HISTORY B
这里有一个笛卡尔乘积。如果没有连接条件,它会将地址中的每一行连接到BILL_历史记录中的每一行,再加上所有其他连接。这将花费很长的时间。您稍后会尝试缩小它的范围,但我怀疑OR导致它必须进行完整的表扫描和笛卡尔乘积,然后才能访问符合以下任何标准:

  AND (SUB.bill_addr_UID=adres.PRIME_UID
       OR SUB.COMPANY_REG_ADDR_UID=adres.PRIME_UID)

尝试将BILL_历史记录完全从查询中删除,看看性能是否有显著提高。如果有,这可能就是您的问题所在。(然后去见您的DBA,让解释计划发挥作用,解决这样的问题确实是必要的。)

我认为加入有一个被遗忘的条件

latrep.ADDRESSES adres 

这就是为什么要花很长时间

并且您只能在select子句(查询的一部分)中直接包含group by子句中包含的内容。如果您不想/不需要按其他列进行分组,则不应将它们包含在其中。您应酌情使用max、min、avg等聚合函数来计算它们的值

e、 g


我认为加入有一个被遗忘的条件

latrep.ADDRESSES adres 

这就是为什么要花很长时间

并且您只能在select子句(查询的一部分)中直接包含group by子句中包含的内容。如果您不想/不需要按其他列进行分组,则不应将它们包含在其中。您应酌情使用max、min、avg等聚合函数来计算它们的值

e、 g


不仅latrep.ADDRESSES和BILL_HISTORY之间存在笛卡尔乘积,这很可能会影响查询的性能,而且还忽略了为to_date函数指定日期格式 代替:和B.比尔截至日期('2011-07-01')

用法:和B.BILL\u DT>=截止日期('2011-07-01','YYYY-MM-DD'))


通过指定rownum来限制返回的记录不仅会使latrep.ADDRESSES和BILL_HISTORY之间存在笛卡尔积,这很可能会降低查询的性能,而且还忽略了为to_date函数指定日期格式 代替:和B.比尔截至日期('2011-07-01')

用法:和B.BILL\u DT>=截止日期('2011-07-01','YYYY-MM-DD'))


通过指定rownum来限制返回的记录您的估计执行计划是什么样子的?将
EXPLAIN plan FOR
放在SQL语句前面。我更新了我的问题。“EXPLAIN plan FOR”不起作用。请与DBA讨论向架构中添加解释计划表的问题,该错误与没有计划表有关。此外,他们也应该能够帮助您完成计划,以便您了解从何处开始查找查询中的问题。您估计的执行计划是什么样的?Put
EXPLAIN PLSQL语句前面有一个FOR
。我更新了我的问题。“解释计划”不起作用。请与DBA讨论向架构中添加解释计划表的问题,该错误与没有计划表有关。此外,他们也应该能够帮助您完成计划,以便您了解从何处开始查找查询中的问题。感谢您的评论,这对我来说是必要的。@Oyeme-我理解,but您能否出于测试目的删除它?如果查询通过删除一个表而大大加快了速度,那么这就是您的问题所在,我们知道如何解决它。:)谢谢您的评论,这对我来说是必要的。@Oyeme-我理解,但您能否出于测试目的删除它?如果通过删除一个表,查询速度急剧加快,那么这就是您的问题所在,我们知道在哪里解决它。:)