简单查询永远挂在大表上

时间:2017-02-16 22:01:44

标签: sql business-objects

我正在尝试使用业务对象前端从其他开发人员的代码中穿越一些代码值(我知道,它是次优的,但他们没有给我后端访问权限)。

我需要做的只是从相关表中提取记录,将代码值与显示值进行比较。我猜这个问题与包含数百万条记录的表有关。即使我将查询范围缩小到一个值,也只尝试今天的记录,并将检索到的最大行设置为1,它会永远挂起。

为我的查询生成的代码是:

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'
  )

2 个答案:

答案 0 :(得分:0)

您是否可以通过使用连接语法而不是符号来避免查询中的交叉连接?也许引擎正在优化以避免交叉连接,也许不是。

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的数据类型可能会隐式地将您的'16 -02-2017 00:00:00'转换为日期或日期时间,这将有助于提高性能。

答案 1 :(得分:0)

对我的评论进行了扩展:

您要检查的代码值和相应的显示值实际上都来自表CODE_VALUE。您从联接中获得的唯一内容是根据代码值在满足日期条件的CLINICAL_EVENT行上出现的次数重复这些结果(在某种意义上,包含抑制 all 如果没有匹配的行,则显示。)

您似乎只想比较代码值和相应的描述,而不是评估代码出现的次数。在这种情况下,通过加入CODE_VALUECLINICAL_EVENT,您将承担大量不必要的工作 - 甚至可能还有一些非想要的工作。相反,只需直接从CODE_VALUE选择所需的行。