Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Derby DB中使用NOT NULL表达式执行查询的时间非常长_Sql_Sql Server_Derby - Fatal编程技术网

Sql 在Derby DB中使用NOT NULL表达式执行查询的时间非常长

Sql 在Derby DB中使用NOT NULL表达式执行查询的时间非常长,sql,sql-server,derby,Sql,Sql Server,Derby,我有一个带有名称附件的表,表中有以下列: COLUMN_NAME TYPE_NAME COLUMN_SIZE --------------------------------------------------- DTYPE VARCHAR 31 ID VARCHAR 36 VERSION BIGINT 19 TYPE INTEGER

我有一个带有名称附件的表,表中有以下列:

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

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

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表达式的问题吗


多谢各位

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

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

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

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

选择Col1、Col2、

从桌子上


如果Col1包含(Col1,'Search')和Col1包含(Col1,'Search2')……

在这个查询中,您正在自杀,主要是因为您的not nulls不同。。。您分别对原始和压缩的所有附件进行了两次吹扫,但您只对单个患者感兴趣。我已经重新构造了查询,从您想要的人开始。。。病人的人格。在此基础上,加入邮件附件。你只关心与这个人有关的任何事情。这将导致一组非常小的记录。在这些记录中,只有那些您希望查看附件表本身并查看是否有符合您的DPTYPE的记录(如条件)并且为NULL的记录

我会确保您的messagecontent表上至少有一个关于(PersonIDPatient)的索引,如果在第一个位置之后有任何其他列,则没有问题。与其他表的联接似乎位于它们各自的主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' 

你考虑过筛选索引吗?是的,我尝试过使用索引,但没有帮助。使用什么索引?你能在问题中包括这些信息吗?还有,我们谈论的是多少行,为什么您认为像“%png”或“%gif”这样的
会很快?这需要扫描。您应该考虑单独存储类型(或类型类别),这样您就可以查找而不是解析表中的每个文件名。非常感谢!我已经使用了你的解决方案,现在要求在2秒内工作。对7分钟前@岩口泉。。。是的,只是快一点:)相似的比较可能对你的时间有更大的影响。