Sql Oracle—需要关于多个计数、具有大量数据的表的建议

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子句设置为

有大数据的表,有人知道如何优化count语句吗

例如:表格预订(id、电子邮件、手机等)(大约30个字段)

最终选择:

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好吧,我不是从问题中推断出来的。在你的情况下,这是最好的办法。