SQL选择WHERE条件,后台会发生什么?

时间:2009-07-07 16:03:41

标签: sql sql-server

假设我没有文本索引。我想说:

SELECT * FROM myTable WHERE myTable.columnA LIKE 'bobo'

SQL引擎是否会遍历每一行并且只返回那些匹配的条件,或者SQL是否更智能并且确实做了一些隐藏的本机索引?

我正在使用MSSQL 2000,2005,2008但是如果其他版本的SQL有不同的方法,那我就听见了。

是否有一个好的在线文档甚至是关于如何执行操作的书?

4 个答案:

答案 0 :(得分:11)

将该查询放入SQL Server Management Studio查询中,并在运行之前启用“包含实际执行计划”选项。它将为您提供执行查询所执行的所有步骤的详细图表,以及正在使用的所有索引以及如何使用。

答案 1 :(得分:2)

如果你查看这个查询的执行简单:

SELECT  *
FROM    mytable
WHERE   columnA LIKE 'bobo%'

您将看到它将被重写为:

SELECT  *
FROM    mytable
WHERE   columnA >= 'bobo'
        AND columnA < 'bobP'

,对INDEX SEEK上的索引使用columnA,如果有的话。

答案 2 :(得分:1)

this book的第3部分,“查询执行”涵盖了在查看执行计划时您将看到的主要元素,正如Welbog所建议的那样。

答案 3 :(得分:1)

我不太确定MSSQL,但我可以告诉你LIKE子句如何在其他数据库中工作,我认为MSSQL是相似的。

您的选择中没有任何通配符,因此查询变为:

SELECT * FROM myTable WHERE myTable.columnA = 'bobo'

如果myTable.columnA上有传统的非全文索引,那么

SELECT * FROM myTable WHERE myTable.columnA LIKE 'bobo%'

可以使用索引,但是

SELECT * FROM myTable WHERE myTable.columnA LIKE '%bobo'

SELECT * FROM myTable WHERE myTable.columnA LIKE '%bobo%'

无法使用索引并将导致全表扫描服务器将检查表的每一行。区别在于通配符在前面:'%bobo'。 DB可以将LIKE 'bobo%'转换为索引上的范围扫描,但由于树样式索引的性质,它不能与LIKE '%bobo'一起使用。

如果您真的需要对数据进行LIKE'%bobo',那么请考虑使用内容反向(myTable.columnA)创建派生列myTable.columnB并对其执行LIKE 'obob%'

如果你确实需要做'%bobo%'那么你就像搜索引擎一样使用你的数据库,要么需要使用全文索引,要么考虑使用外部全文搜索引擎。