对【关于初学SQL的几个建议 】这篇文章最后的传闻一点简单看法
今天进入到sql论坛,一进来就看到一篇置顶帖子,关于最后一点也说点看法,发现不能回帖了。
原帖内容如下:
----------------------------------------
4. 不要人云亦云,盲目相信一些传闻
SQL查询优化是个复杂问题,硬件配置、DBMS版本、表结构定义、索引、数据量、查询语句,都会影响查询性能。判断一个语句的性能,最好是自己尝试一下,观察执行计划和统计数据。而对于网上看到的论断,即使不能一一尝试,至少也要想一下为什么,而不是盲目相信。
在CSDN论坛上看到的流传甚广的传闻:
1) WHERE CHARINDEX('abc', ColumnName) > 0 比 WHERE ColumnName LIKE '%abc%' 性能好。
2) 用JOIN判断A表数据在/不在B表比 IN/NOT IN 和 EXISTS/NOT EXISTS 性能好。
很好奇这些传闻是怎么产生的。
--------------------------------------------
首先表明只是在一般情况下以下说法有效,具体情况还得具体分析。
很支持 “SQL查询优化是个复杂问题” 这句话。
1)如果在 Cloumnname 这一列上建立了索引的话,
CHARINDEX('abc', ColumnName) > 0 是可以使用索引的,
ColumnName LIKE '%abc%' 不能使用索引。
另外 像这种 :
name like 'Abc%
也可以写成 name >= 'Abc'' AND name < ‘Abc’ 这样也可以利用索引。
2) join 是用在连接查询, In/NOt IN 和 EXISTS 一般都是用在子查询。
子查询一般使用嵌套执行的方式,父查询中的每一行,都执行一次子查询,这样的话效率是低一点。
子查询变为连接查询后不用执行很多次,然后还可以选择不同的连接方法和连接顺序,
像 id IIN (1,2,3) 也可以写成 id = 1 or id = 2 or id = 3 这样也可以利用索引。
为什么都和索引扯上关系,说明索引在数据库查询优化中是很重要的一部分。