Sql 简单查询永远挂在大表上
我正试图使用business objects frontend从另一个开发人员的代码中跨越一些代码值,我知道这是次优的,但他们没有给我后端访问权限 我需要做的只是从相关表中提取一条记录,将代码值与显示值进行比较。我猜问题与包含数百万条记录的表有关。即使我将查询范围缩小到一个值,只尝试今天的记录,并将检索到的最大行数设置为1,它也会永远挂起 它为我的查询生成的代码是:Sql 简单查询永远挂在大表上,sql,business-objects,Sql,Business Objects,我正试图使用business objects frontend从另一个开发人员的代码中跨越一些代码值,我知道这是次优的,但他们没有给我后端访问权限 我需要做的只是从相关表中提取一条记录,将代码值与显示值进行比较。我猜问题与包含数百万条记录的表有关。即使我将查询范围缩小到一个值,只尝试今天的记录,并将检索到的最大行数设置为1,它也会永远挂起 它为我的查询生成的代码是: SELECT CLINICAL_EVENT.EVENT_CD, CV_EVENT.DISPLAY FROM CLINI
SELECT
CLINICAL_EVENT.EVENT_CD,
CV_EVENT.DISPLAY
FROM
CLINICAL_EVENT,
CODE_VALUE CV_EVENT
WHERE
( CLINICAL_EVENT.EVENT_CD=CV_EVENT.CODE_VALUE )
AND
(
CLINICAL_EVENT.EVENT_CD = 338743225
AND
CLINICAL_EVENT.EVENT_END_DT_TM
> '16-02-2017 00:00:00'
)
您是否可以通过使用连接语法而不是表示法来避免查询中的交叉连接?也许引擎正在优化以避免交叉连接,也许不是
SELECT
CLINICAL_EVENT.EVENT_CD,
CV_EVENT.DISPLAY
FROM
CLINICAL_EVENT
INNER JOIN CODE_VALUE CV_EVENT
on CLINICAL_EVENT.EVENT_CD=CV_EVENT.CODE_VALUE
WHERE CLINICAL_EVENT.EVENT_CD = 338743225
AND CLINICAL_EVENT.EVENT_END_DT_TM > '16-02-2017 00:00:00'
此外,什么样的数据类型是EVENT_END_DT_TM可能会隐式地将您的“2016-02-2017 00:00:00”转换为日期或日期时间,这将有助于提高性能。在我的评论中展开一点:
要检查的代码值和相应的显示值实际上都来自表code_VALUE。从联接中获得的唯一好处是根据代码值出现在满足日期条件的CLINICAL_事件行上的次数复制这些结果,从某种意义上说,如果没有匹配行,则包括抑制所有外观
您似乎只想比较代码值和相应的描述,而不是计算代码出现的次数。在这种情况下,通过将CODE_值加入到CLINICAL_事件中,您将招致许多不必要的工作,甚至可能是一些不必要的工作。相反,只需直接从CODE_值中选择所需的行。运行该查询时是否有表锁?代码值和相应的显示值实际上都来自表CODE_值。从联接中获得的唯一好处是根据代码值在满足日期条件的CLINICAL_事件行上出现的次数复制这些结果。为什么不直接从CODE_值中选择想要的记录,并从查询中完全消除table CLINATION_事件呢?联接本身也可能会减少数据。因此,可能有一个表中的记录而不是另一个表中的记录需要从结果中排除;这就是连接存在的原因。虽然可以通过一个可能更快的存在来处理,但在BO宇宙中,这两个对象是实际的物理表,还是它们的派生表都有自己的开销?@JohnBollinger按照你的建议移除了临床事件表。如果你想添加这个作为答案,我会让它成为一个被接受的答案:-如果数据库不以与你建议的替代方案完全相同的方式处理OP的查询,那将是令人惊讶的。在任何情况下,不要忽视OP不能直接访问DB。他提出的查询是由软件生成的,他似乎不太可能对发送给DB的内容有足够的控制权来实现您的建议。在BO中,您可以始终转到报表的SQL视图,取消选中自动生成SQL并修改SQL,前提是您有权这样做