Sql Oracle—需要关于多个计数、具有大量数据的表的建议
有大数据的表,有人知道如何优化count语句吗 例如:表格预订(id、电子邮件、手机等)(大约30个字段) 最终选择:Sql Oracle—需要关于多个计数、具有大量数据的表的建议,sql,oracle,performance,plsql,Sql,Oracle,Performance,Plsql,有大数据的表,有人知道如何优化count语句吗 例如:表格预订(id、电子邮件、手机等)(大约30个字段) 最终选择: Select GetBookingCount(email, mobile) as BookingCount , GetBookingStatus3Count(email, mobile) as BookingStatus3Count , ... From Booking where .... 解决方案1:将字段列索引what in where子句设置为
Select GetBookingCount(email, mobile) as BookingCount
, GetBookingStatus3Count(email, mobile) as BookingStatus3Count
, ...
From Booking
where ....
解决方案1:将字段列索引what in where子句设置为电子邮件列、手机列和状态列
解决方案2:创建一个新表,其中包含很少的要计数的列。
新表:预订统计(id、电子邮件、手机、状态)
谢谢你的建议。预订表应该有一个关于电子邮件、手机和状态的索引。您应该使用此选项来选择:
WITH B1 AS
(
SELECT ID,
COUNT(ID) CNT1,
STATUS
FROM BOOKING
WHERE EMAIL = P_EMAIL
AND MOBILE = P_MOBILE
)
SELECT CNT1,
COUNT(ID) CNT2
FROM B1
WHERE STATUS = 3;
预订表应该有一个关于电子邮件、手机和状态的索引。您应该使用此选项来选择:
WITH B1 AS
(
SELECT ID,
COUNT(ID) CNT1,
STATUS
FROM BOOKING
WHERE EMAIL = P_EMAIL
AND MOBILE = P_MOBILE
)
SELECT CNT1,
COUNT(ID) CNT2
FROM B1
WHERE STATUS = 3;
//注意:查询是从head编写的,未经测试
你会考虑创建一个索引(电子邮件,移动)或在(电子邮件,移动,状态)取决于你给多少(电子邮件,移动)线,你会支付更新状态改变指数的成本(如果允许的话)。如果同一行的状态有许多更新,您可能更喜欢仅索引(电子邮件、移动)[读/写成本权衡]
电子邮件可能具有很强的区分性(一个值过滤掉大部分列)。如果不是这样的话,如果手机栏目是更好的候选人,可以考虑改变订单(手机、电子邮件)。
//注意:查询是从head编写的,未经测试
你会考虑创建一个索引(电子邮件,移动)或在(电子邮件,移动,状态)取决于你给多少(电子邮件,移动)线,你会支付更新状态改变指数的成本(如果允许的话)。如果同一行的状态有许多更新,您可能更喜欢仅索引(电子邮件、移动)[读/写成本权衡]
电子邮件可能具有很强的区分性(一个值过滤掉大部分列)。如果不是这样的话,如果手机列是更好的候选者,考虑改变顺序(移动、电子邮件)。 看起来所有那些<代码> GooBoogBulaBRAH()/Case>函数都是无用的,实际上对性能是有害的。 您还没有发布一套完整的需求(什么是
…
?),因此很难确定,但似乎沿着这些思路的解决方案更具执行力:
with bk as (
select *
from booking
where email = p_email
or mobile = p_mobile
)
select count(*) as BookingCount
, count(case when bk.status = 3 then 1 end) as BookingStatus3Count
, ...
from bk
其思想是查询一次基表,获取计算所有计数所需的所有数据,并在尽可能小的结果集上处理聚合
关于
预订(电子邮件、手机)
的索引可能有用,但可能没有。更好的解决方案是对每个p_email
和p_mobile
进行不同的查询,并使用单列索引支持每个查询。似乎所有这些GetBookingBlahBlah()
函数都没有帮助,实际上对性能有害
您还没有发布一套完整的需求(什么是…
?),因此很难确定,但似乎沿着这些思路的解决方案更具执行力:
with bk as (
select *
from booking
where email = p_email
or mobile = p_mobile
)
select count(*) as BookingCount
, count(case when bk.status = 3 then 1 end) as BookingStatus3Count
, ...
from bk
其思想是查询一次基表,获取计算所有计数所需的所有数据,并在尽可能小的结果集上处理聚合
关于
预订(电子邮件、手机)
的索引可能有用,但可能没有。更好的解决方案是对p\u email
和p\u mobile
中的每一个都有不同的查询,并使用单列索引支持每个查询。谢谢,但您的sql可能错误,不起作用,请在Oracle中查看sql谢谢,但您的sql可能错误,不起作用,请在Oracle中查看sql谢谢您的详细知识,但您的sql也与我的解决方案相同1@hungudgm好吧,我不是从问题中推断出来的。这将是在您的情况下最好的方法。感谢您提供详细的知识,但您的sql也是我的解决方案1@hungudgm好吧,我不是从问题中推断出来的。在你的情况下,这是最好的办法。