Ven*_*kat 0 sql sql-server sql-server-2008
哪个查询运行得更快?
考虑到它返回200条记录并且authorname
至少有20个字符并且authorname
是全文索引的
select * from quotestable
where quotesauthor like (select Authorname from Authortable where authorid =45)
Run Code Online (Sandbox Code Playgroud)
.
select * from quotestable
where quotesauthor in (select Authorname from Authortable where authorid =45)
Run Code Online (Sandbox Code Playgroud)
这不是"更快"的问题.它们有不同的含义.
第一个查询只能在子查询返回0或1条记录时运行(并且通常应该TOP 1
用来保证这一点).但是,它可以对结果进行通配符匹配.如果子查询返回任意数量的记录,则第二个查询可以运行,但不会执行通配符匹配.
这听起来像你应该真正拥有的是一个JOIN:
SELECT q.*
FROM quotestable q
INNER JOIN AuthorTable a ON q.quotesauthor = a.authorname
WHERE a.authorid = 45
Run Code Online (Sandbox Code Playgroud)
...当然假设是AuthorID
或者AuthorName
是独一无二的AuthorTable
.在quotesauthor字段可能并不总是与之匹配的情况下,这也允许使用带有通配符的LIKE作为匹配条件AuthorTable.AuthorName
.
虽然我在这里,但对于我来说,AuthorName
全文索引也很奇怪.传统索引而不是全文对此查询更有帮助.在这里使用全文的唯一原因是,如果你在该字段中拥有像"John Milton"这样的全名,并且希望能够执行仅搜索姓氏或仅使用名字等操作.但即使在这种情况下,通过将它们存储为自己的字段并删除全文索引,似乎可以更好地服务.全文索引在较长的字段上最有效,例如描述或文章/帖子.