0

我有一个名为 ATTACHMENT 的表,其中包含以下列:

COLUMN_NAME          TYPE_NAME  COLUMN_SIZE
---------------------------------------------------
DTYPE                VARCHAR    31
ID                   VARCHAR    36
VERSION              BIGINT     19
TYPE                 INTEGER    10
FILENAME             VARCHAR    100
DATA                 BLOB       9437211
SIZE                 INTEGER    10
CHECKSUM             BIGINT     19
AUTHOR               VARCHAR    36
FILEDATE             DATE       10
FILETIME             TIME       8
CREATIONDATE         DATE       10
CREATIONTIME         TIME       8
FILETYPE             INTEGER    10
SYSTEM               SMALLINT    5
ORIGINALPICTUREID    VARCHAR    36
COMPRESSEDPICTUREID  VARCHAR    36
FIRSTUSE             VARCHAR    120

当我运行简单的测试 SQL 查询时:

SELECT ID FROM ATTACHMENT WHERE ORIGINALPICTUREID IS NOT NULL;

此查询执行很长时间(30 秒)

但是当我在没有 IS NOT NULL 表达式的情况下运行下一个测试 SQL 查询时:

SELECT ID FROM ATTACHMENT WHERE ORIGINALPICTUREID IS NULL;

此查询仅执行 2 秒。

在实际系统中,我有脚本:

select ATTACHMENT.ID,
       ATTACHMENT.SIZE,
       ATTACHMENT.AUTHOR,
       ATTACHMENT.FILENAME,
       ATTACHMENT.FILETIME,
       ATTACHMENT.FILEDATE,
       ATTACHMENT.CREATIONDATE,
       ATTACHMENT.CREATIONTIME,
       ATTACHMENT.FILETYPE,
       ATTACHMENT.COMPRESSEDPICTUREID,
       ATTACHMENT.ORIGINALPICTUREID,
       ATTACHMENT.FIRSTUSE
from ATTACHMENT,
     MESSAGECONTENT_ATTACHMENT,
     MESSAGECONTENT
where ATTACHMENT.ID not in (select distinct ATTACHMENT.ORIGINALPICTUREID
                            from ATTACHMENT
                            where ATTACHMENT.ORIGINALPICTUREID is not null)
and   ATTACHMENT.ID not in (select distinct COMPRESSEDPICTUREID
                            from ATTACHMENT
                            where ORIGINALPICTUREID is not null)
and   MESSAGECONTENT_ATTACHMENT.MESSAGECONTENT_ID = MESSAGECONTENT.ID
and   MESSAGECONTENT_ATTACHMENT.ATTACHMENTS_ID = ATTACHMENT.ID
and   ATTACHMENT.DTYPE = 'P'
and   MESSAGECONTENT.PERSONIDPATIENT = '0584393a-0955-4c9b-98f7-d31c991d22a3'
and   (ATTACHMENT.FILENAME like '%jpeg' 
       or ATTACHMENT.FILENAME like '%jpg' 
       or ATTACHMENT.FILENAME like '%tiff' 
       or ATTACHMENT.FILENAME like '%tif' 
       or ATTACHMENT.FILENAME like '%bmp' 
       or ATTACHMENT.FILENAME like '%gif' 
       or ATTACHMENT.FILENAME like '%png' 
       or ATTACHMENT.FILENAME like '%ser')

这个脚本执行非常非常长的时间。

您能否帮助我如何解决我的 Derby DB 中的 SQL 查询中的 IS NOT NULL 表达式的问题?

非常感谢!

4

2 回答 2

1

您在此查询中杀死自己主要是因为您的非空值不同......您分别为原始和压缩的所有附件吹了两次,但您只对单个患者感兴趣。我已将查询重组为从您想要的 WHO 开始... PatientPersonID。从那里,加入到邮件附件。你只关心与这个 ONE PERSON 相关的任何东西。这应该会产生非常小的记录集。在这些记录中,只有那些您关心查看附件表本身并查看是否有任何符合您的 DPTYPE 的条件,例如条件和 IS NULL。

我会确保您至少在 (PersonIDPatient) 上的 messagecontent 表上有一个索引,如果在第一个位置之后有任何其他列,没问题。与其他表的连接似乎位于它们各自的主 ID 列上,并假设您在这些列上有索引。

SELECT 
      atch.ID, 
      atch.SIZE, 
      atch.AUTHOR, 
      atch.FILENAME, 
      atch.FILETIME, 
      atch.FILEDATE, 
      atch.CREATIONDATE, 
      atch.CREATIONTIME, 
      atch.FILETYPE, 
      atch.COMPRESSEDPICTUREID, 
      atch.ORIGINALPICTUREID, 
      atch.FIRSTUSE 
   FROM 
      MESSAGECONTENT msgCont
         JOIN MESSAGECONTENT_ATTACHMENT msgAtt
            ON msgCont.ID = msgAtt.MESSAGECONTENT_ID
            JOIN ATTACHMENT atch
               ON msgAtt.ATTACHMENTS_ID = atch.ID 
              AND atch.DTYPE = 'P' 
              AND atch.ORIGINALPICTUREID IS NOT NULL
              AND atch.CompressedPictureID IS NOT NULL
              AND (   atch.FILENAME LIKE '%jpeg' 
                   OR atch.FILENAME LIKE '%jpg' 
                   OR atch.FILENAME LIKE '%tiff' 
                   OR atch.FILENAME LIKE '%tif' 
                   OR atch.FILENAME LIKE '%bmp' 
                   OR atch.FILENAME LIKE '%gif' 
                   OR atch.FILENAME LIKE '%png' 
                   OR atch.FILENAME LIKE '%ser')
   WHERE 
      msgCont.PersonIDPatient = '0584393a-0955-4c9b-98f7-d31c991d22a3' 
于 2013-10-01T19:23:48.950 回答
0

查询中的 NOT IN 运算符不使用任何索引。-

避免在查询中使用 NOT IN 运算符。

为了找到不符合特定标准的结果,它必须根据条件检查所有记录,这使得索引的存在无关紧要。

另外,不要使用通配符 % 尝试使用全文索引并查询数据库,例如

选择 Col1、Col2、.......

从表

其中 Col1 CONTAINS(Col1,'Search') AND Col1 CONTAINS(Col1,'Search2').........

于 2013-10-01T17:38:24.067 回答