哪个查询运行得更快?
考虑到它返回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)
答案 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
...当然假设AuthorID
或AuthorName
在AuthorTable
中是唯一的。如果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 + '%'
)