-1
SELECT DISTINCT                                  
    A.IDPRE                                   
    ,A.IDARTB                                  
    ,A.TIREGDAT                            
    ,B.IDDATE                                
    ,B.IDINFO                                
    ,C.TIINTRO                                 
FROM
    GLHAZQ  A                                 
    ,PRTINFO B                                 
    ,PRTCON  C                                 
WHERE
    B.IDARTB   = A.IDARTB                     
AND B.IDPRE    = A.IDPRE                      
AND C.IDPRE    = A.IDPRE                      
AND C.IDARTB   = A.IDARTB                     
AND C.TIINTRO  = (
    SELECT MIN(TIINTRO)          
    FROM
    PRTCON D              
    WHERE D.IDPRE = A.IDPRE  
    AND D.IDARTB  = A.IDARTB)
ORDER BY C.TIINTRO   

运行此查询时出现以下错误(DB2)

SQL0495N  Estimated processor cost of "000000012093" processor seconds   
("000575872000" service units) in cost category "A" exceeds a resource limit error  
threshold of "000007000005" service units.  SQLSTATE=57051

请帮我解决这个问题

4

2 回答 2

1

显然,工作负载管理器正在防止您使用过多的资源。您需要调整查询,使其估计成本低于 DBA 设置的阈值。您将首先检查由db2exfmt. 如果您需要帮助,请在此处发布计划以及表和索引定义。

要生成解释计划,请执行以下 3 个步骤:

  1. 通过执行创建解释表db2 -tf $INSTANCE_HOME/sqllib/misc/EXPLAIN.DDL
  2. 通过执行说明语句生成计划:db2 explain plan for select ...<the rest of your query>
  3. 格式化计划:(db2exfmt -d <your db name> -1注意第二个参数是数字“1”,而不是字母“l”)。

要生成表 DDL 语句,请使用该db2look实用程序:

db2look -d <your db name> -o tables.sql -e -t GLHAZQ PRTINFO PRTCON
于 2013-08-13T13:20:18.617 回答
1

虽然不是 db2 人,但我会怀疑查询语法是一样的。在您的查询中,您正在基于 C.TIINTRO 进行子选择,这可能会影响性能。您还在查询所有记录。

我将通过预先查询 MIN() 值来开始查询,因为您甚至没有使用“C”别名中的任何其他值字段,所以将其排除在外。

SELECT DISTINCT
      A.IDPRE,
      A.IDARTB,
      A.TIREGDAT,
      B.IDDATE,
      B.IDINFO,
      PreQuery.TIINTRO
   FROM
      ( SELECT D.IDPRE, 
               D.IDARTB, 
               MIN(D.TIINTRO) TIINTRO
           from 
              PRTCON D
           group by 
              D.IDPRE, 
              D.IDARTB ) PreQuery
         JOIN GLHAZQ  A
            ON PreQuery.IDPre = A.IDPRE
            AND PreQuery.IDArtB = A.IDArtB
         JOIN PRTINFO B
            ON PreQuery.IDPre = B.IDPRE
            AND PreQuery.IDArtB = B.IDArtB
   ORDER BY 
      PreQuery.TIINTRO

我会确保你有索引

table      Index keys
PRTCON     (IDPRE, IDARTB, TIINTRO)
GLHAZQ     (IDPRE, IDARTB)
PRTINFO    (IDPRE, IDARTB)

如果你真的需要你的“C”表,你可以添加另一个 JOIN 例如

JOIN PRTCON C
  ON PreQuery.IDArtB = C.IDArtB
  AND PreQuery.TIIntro = C.TIIntro

有了这样的时间,你可能会更好地拥有一个“覆盖索引”

GLHAZQ table key ( IDPRE, IDARTB, TIREGDAT )
PRTINFO    (IDPRE, IDARTB, IDDATE, IDINFO)

这样,索引具有您在查询中返回的所有元素,而不必返回所有实际的数据页面。它可以直接从索引中获取值

于 2013-08-13T14:06:29.833 回答