性能比较:使用in和like的SQL查询

时间:2017-06-02 15:38:23

标签: sql sql-server sql-server-2008

哪个查询运行得更快?

考虑到它返回200条记录,而authorname至少有20个字符,而authorname则是全文索引

select * from quotestable 
where quotesauthor like (select Authorname from  Authortable where authorid =45)

select * from quotestable 
where quotesauthor in (select Authorname from  Authortable where authorid =45)

2 个答案:

答案 0 :(得分:6)

这不是"更快"的问题。它们有不同的含义。

第一个查询只能在子查询返回0或1条记录时运行(并且通常应使用TOP 1来保证这一点)。但是,它可以对结果进行通配符匹配。如果子查询返回任意数量的记录,则第二个查询可以运行,但不会进行通配符匹配。

听起来你应该真正拥有的是一个JOIN:

SELECT q.* 
FROM quotestable q 
INNER JOIN AuthorTable a ON q.quotesauthor = a.authorname
WHERE a.authorid = 45

...当然假设AuthorIDAuthorNameAuthorTable中是唯一的。如果quotesauthor字段可能并不总是与AuthorTable.AuthorName直接匹配,这也允许将LIKE与通配符一起用于匹配条件。

虽然我在这里,但我也很奇怪AuthorName将被全文索引。传统索引而不是全文对此查询更有帮助。在这里使用全文的唯一原因是,如果你有全名,如约翰米尔顿'在该领域,并希望能够做只搜索姓氏或名字的事情。但即使在这种情况下,通过将这些存储为自己的字段并删除全文索引,您似乎可以获得更好的服务。全文索引在较长的字段上最有效,例如描述或文章/帖子。

答案 1 :(得分:0)

不一样。一个测试平等,其他测试如表达式......

尝试平等

select * from quotestable f1 
where exists 
(
select * from  Authortable f2
where f2.authorid =45 and f1.quotesauthor =f2.Authorname
)

尝试使用

select * from quotestable f1 
where exists 
(
select * from  Authortable f2
where f2.authorid =45 and f1.quotesauthor like '%' + f2.Authorname + '%'
)