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