假设我没有文本索引。我想说:
SELECT * FROM myTable WHERE myTable.columnA LIKE 'bobo'
SQL引擎是否会遍历每一行并且只返回那些匹配的条件,或者SQL是否更智能并且确实做了一些隐藏的本机索引?
我正在使用MSSQL 2000,2005,2008但是如果其他版本的SQL有不同的方法,那我就听见了。
是否有一个好的在线文档甚至是关于如何执行操作的书?
答案 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%'那么你就像搜索引擎一样使用你的数据库,要么需要使用全文索引,要么考虑使用外部全文搜索引擎。