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分钟前@岩口泉。。。是的,只是快一点:)相似的比较可能对你的时间有更大的影响。