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