如何解决联接两个表而一个表有很多行时,为什么SQL查询需要太长时间执行
SELECT object_oid,parent_oid,object_type,filetype,token
FROM TemporaryFiles
WHERE token NOT IN (SELECT DISTINCT
TemporaryFiles.token
FROM TemporaryFiles
INNER JOIN Tokens ON TemporaryFiles.token = Tokens.token);
TemporaryFiles 表-该表大约有5,000行
----------------------------------------------------
Column Name DataType
OBJECT_OID int
PARENT_OID int
OBJECT_TYPE varchar(100)
FileType varchar(255)
Token varchar(255)
DBKEY int ------------------------Primary Key
此表在主键DBKey上具有一个聚集索引
令牌表-该表大约有900,000行
--------------------------------------------------------------
Column Name DataType
OBJECT_OID int
PARENT_OID int
OBJECT_TYPE nvarchar(64)
CHILD_TYPE nvarchar(64)
FileType nvarchar(32)
Token nvarchar(255)
CreationTime datetime
Contextual bit
DBKEY int ------------------------Primary Key
DBKey的主键上有一个聚集索引 还有一个关于OBJECT_OID,OBJECT_TYPE,上下文,
的非聚集索引我尝试为两个表在Token上再创建一个非聚集索引。查询仍然需要无限的时间来执行。
即使我尝试将“不存在”更改为“不存在”语句。但我仍然看到这个问题。
解决方法
可能我建议您尝试以下方法。确实不需要DISTINCT,只需添加许多额外的工作即可:
SELECT object_oid,parent_oid,object_type,filetype,token
FROM TemporaryFiles
WHERE NOT EXISTS (SELECT 1 FROM Tokens AS T WHERE T.Token = TemporaryFiles.Token);
,
也许尝试使用左联接来获取所有没有令牌的临时文件
SELECT object_oid,token
FROM TemporaryFiles a
left join Tokens ON TemporaryFiles.token = Tokens.token
where Tokens.token is null
明智地使用索引:可能使用非簇状标记进行测试,并在选择中使用列的包含项(为什么在此处查看说明) Indexing/Include
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。