优化sybase中的条件查询

Posted

技术标签:

【中文标题】优化sybase中的条件查询【英文标题】:Optimizing conditional query in sybase 【发布时间】:2014-04-10 23:49:40 【问题描述】:

我想获得有关优化下面查询的帮助。

我希望有一个可以跨年公开员工数据的视图。此视图包含员工表中的数据,其中员工 ID、年份和员工人口统计数据作为列。我还有一个名为 testemployees 的表,其中包含 EmployeeID 和 Year。这是雇员表的一个子集,可能有也可能没有数据。我想要完成的是:

如果 testEmployees 表中有数据,我的视图应该只为 testEmployees 中的员工获取员工详细信息,如果 testEmployees 中没有数据,我应该让我的视图包含员工表中的所有数据。

我的员工表确实非常大,即使下面的查询有效,也需要花费大量时间来获取这些数据。任何有关如何改进此查询的指针将不胜感激。

Create view dbo.employees(Year, EmployeeID)
as 
select * from
employee e, testemployees te
where e.Year = case when((select count(1) from testemployees)>0) then te.Year else e.Year
and e.employeeID = case when((select count(1) from testemployees)> 0) then te.employeeID else e.employeeID

让我知道您对如何优化查询的想法。使用任何其他类型的连接会有所帮助吗?

提前致谢。

【问题讨论】:

您没有提到表上的任何索引。如果有,请包括索引的类型(集群/非集群、唯一等)以及索引中包含的行。您能否还指定您正在运行的 SAP Sybase ASE 的版本 @MichaelGardner 你好!我在主键列上使用了聚集索引。我有一个关于 Year 和 EmployeeID 组合的索引。我正在使用 Sybase ASE 11/12/15 TDS 5.5。这是你要问的吗?提前感谢您的帮助! 【参考方案1】:

我使用 Sybase 已经有一段时间了,我不太确定他们对 SQL-99 查询的语法支持。但是,假设 Sybase 至少对 SQL-99 连接语法有一些支持,以下应该可以工作:

Create view dbo.employees(Year, EmployeeID)
as 
select e.employeeId, e.Year, e.attribute1, e.attribute2, ... e.attributeN,
       ifnull(te.employeeId, e.employeeId, te.employeeId) as testEmployeeId,
       ifnull(te.employeeId, e.Year, te.Year) as testYear,
       ifnull(te.employeeId, e.attribute1, te.attribute1) as testAttribute1,
       ifnull(te.employeeId, e.attribute2, te.attribute2) as testAttribute2,
               ....
       ifnull(te.employeeId, e.attributeN, te.attributeN) as testAttributeN
from  employee e
left join testemployees te on (e.employeeId = te.employeeId and e.Year = te.Year)

请注意,这与您定义的语义有些不同。我猜这实际上更接近你想要的。

【讨论】:

以上是关于优化sybase中的条件查询的主要内容,如果未能解决你的问题,请参考以下文章

使用条件连接优化 SQL 查询

使用 group by 和条件优化 SQL 查询

Sybase数据库:两个特别注意的地方

oracle查询优化

第 2 章 查询条件优化之等值查找

了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表