Oracle SQL查询性能与计数

Oracle SQL查询性能与计数,oracle,oracle11g,Oracle,Oracle11g,我有两个表,公司和员工 COMPANY\u ID是COMPANY表的主键,是EMPLOYEE表的外键。公司ID是一个10位数字。我们正在生成3个数字组合并查询数据库 select语句具有正则表达式,可根据company\u ID批量加载公司。使用不同的模式多次执行查询 i、 e 现有查询看起来像这样- select * from COMPANY company where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|00

我有两个表,
公司
员工

COMPANY\u ID
COMPANY
表的主键,是
EMPLOYEE
表的外键。
公司ID
是一个10位数字。我们正在生成3个数字组合并查询数据库

select
语句具有正则表达式,可根据
company\u ID
批量加载公司。使用不同的模式多次执行查询

i、 e

现有查询看起来像这样-

select * 
from COMPANY company
where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)')
新的要求是检索公司信息以及员工数量。例如,如果一家公司有10名员工,则查询应返回
公司
表的所有列,以及员工计数,即10

这是我提出的select语句-

select 
    nvl(count_table.cont_count, 0), company.* 
from 
    COMPANY company,
    (select company.COMPANY_ID, count(company.COMPANY_ID) as cont_count 
     from COMPANY company, EMPLOYEE employee
     where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
       and company.CONTACT_ID = employee.CONTACT_ID     
     group by (company.COMPANY_ID)) count_table
 where 
     regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
     and count_table.COMPANY_ID(+)= company.COMPANY_ID
上面的查询可以工作,但与前面的语句相比,它需要两倍的时间。是否有更好的方法检索员工计数


注意:Oracle数据库正在使用。

您不需要像执行两次那样执行昂贵的REGEXP\u:

 select nvl(count_table.cont_count,0),company.* 
 from COMPANY company 
 ,( select   employee.COMPANY_ID, count(employee.COMPANY_ID) as cont_count
    from     EMPLOYEE employee
     group by (employee.COMPANY_ID)
  ) count_table
  where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
  and count_table.COMPANY_ID(+)= company.COMPANY_ID
或者可以使用标量子查询:

select company.* 
,      (select count(*)
        from   employee e
        where  e.company_id = c.company_id
       )
from COMPANY c 
where regexp_like(c.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
就我个人而言,我会抛弃缓慢的REGEXP_,比如:

where substr(c.company_id,1,3) between '000' and '009'

您不需要像执行两次那样执行昂贵的REGEXP\u:

 select nvl(count_table.cont_count,0),company.* 
 from COMPANY company 
 ,( select   employee.COMPANY_ID, count(employee.COMPANY_ID) as cont_count
    from     EMPLOYEE employee
     group by (employee.COMPANY_ID)
  ) count_table
  where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
  and count_table.COMPANY_ID(+)= company.COMPANY_ID
或者可以使用标量子查询:

select company.* 
,      (select count(*)
        from   employee e
        where  e.company_id = c.company_id
       )
from COMPANY c 
where regexp_like(c.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
就我个人而言,我会抛弃缓慢的REGEXP_,比如:

where substr(c.company_id,1,3) between '000' and '009'

您不需要像执行两次那样执行昂贵的REGEXP\u:

 select nvl(count_table.cont_count,0),company.* 
 from COMPANY company 
 ,( select   employee.COMPANY_ID, count(employee.COMPANY_ID) as cont_count
    from     EMPLOYEE employee
     group by (employee.COMPANY_ID)
  ) count_table
  where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
  and count_table.COMPANY_ID(+)= company.COMPANY_ID
或者可以使用标量子查询:

select company.* 
,      (select count(*)
        from   employee e
        where  e.company_id = c.company_id
       )
from COMPANY c 
where regexp_like(c.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
就我个人而言,我会抛弃缓慢的REGEXP_,比如:

where substr(c.company_id,1,3) between '000' and '009'

您不需要像执行两次那样执行昂贵的REGEXP\u:

 select nvl(count_table.cont_count,0),company.* 
 from COMPANY company 
 ,( select   employee.COMPANY_ID, count(employee.COMPANY_ID) as cont_count
    from     EMPLOYEE employee
     group by (employee.COMPANY_ID)
  ) count_table
  where regexp_like(company.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
  and count_table.COMPANY_ID(+)= company.COMPANY_ID
或者可以使用标量子查询:

select company.* 
,      (select count(*)
        from   employee e
        where  e.company_id = c.company_id
       )
from COMPANY c 
where regexp_like(c.COMPANY_ID, '^(000|001|002|003|004|005|006|007|008|009)') 
就我个人而言,我会抛弃缓慢的REGEXP_,比如:

where substr(c.company_id,1,3) between '000' and '009'

派生表不会增加值,因此我将去掉它并使用标量查询(因为我不知道公司表中的所有列都可以正确地执行group by):

此外,如果性能仍然是一个问题,我会考虑修改您的WHERE语句,不使用ReGEXP。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 补遗 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我看到这个问题明确地标识employee表将company_id作为外键。既然已经澄清了这一点,我将删除以下声明:

这些表的数据模型不是直观的(如果没有 公司标识(作为员工表中的外键?)


派生表不会增加值,因此我将去掉它并使用标量查询(因为我不知道公司表中的所有列都可以正确地执行group by):

此外,如果性能仍然是一个问题,我会考虑修改您的WHERE语句,不使用ReGEXP。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 补遗 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我看到这个问题明确地标识employee表将company_id作为外键。既然已经澄清了这一点,我将删除以下声明:

这些表的数据模型不是直观的(如果没有 公司标识(作为员工表中的外键?)


派生表不会增加值,因此我将去掉它并使用标量查询(因为我不知道公司表中的所有列都可以正确地执行group by):

此外,如果性能仍然是一个问题,我会考虑修改您的WHERE语句,不使用ReGEXP。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 补遗 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我看到这个问题明确地标识employee表将company_id作为外键。既然已经澄清了这一点,我将删除以下声明:

这些表的数据模型不是直观的(如果没有 公司标识(作为员工表中的外键?)


派生表不会增加值,因此我将去掉它并使用标量查询(因为我不知道公司表中的所有列都可以正确地执行group by):

此外,如果性能仍然是一个问题,我会考虑修改您的WHERE语句,不使用ReGEXP。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 补遗 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我看到这个问题明确地标识employee表将company_id作为外键。既然已经澄清了这一点,我将删除以下声明:

这些表的数据模型不是直观的(如果没有 公司标识(作为员工表中的外键?)


我不明白这个问题,所以如果这是一个Oracle平台,为什么要列出Mysql和sql server标记?您需要运行一个解释计划,并查看数据库对查询所做的操作。-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。我不理解这个问题,所以如果这是Oracle平台,为什么要列出Mysql和SQL server标记?您需要运行一个解释计划,并查看数据库对查询所做的操作。-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。我不理解这个问题,所以如果这是Oracle平台,为什么要列出Mysql和SQL server标记?您需要运行一个解释计划,并查看数据库对查询所做的操作。-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。我不理解这个问题,所以如果这是Oracle平台,为什么要列出Mysql和SQL server标记?您需要运行一个解释计划,并查看数据库对查询所做的操作。-旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
synta替换