对【关于初学SQL的几个建议 】这篇文章最后的传闻一点简单看法

wasdasdfqwer 2015-06-21 12:44:47
今天进入到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 这样也可以利用索引。

为什么都和索引扯上关系,说明索引在数据库查询优化中是很重要的一部分。





...全文
186 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
卖水果的net 版主 2015-06-29
  • 打赏
  • 举报
回复
引用 3 楼 swordmanli 的回复:
调优比较复杂,你说的这些也不是传闻,有的是在不同的引擎或版本下效果不同而已。
说的不错。
swordmanli 2015-06-23
  • 打赏
  • 举报
回复
调优比较复杂,你说的这些也不是传闻,有的是在不同的引擎或版本下效果不同而已。
hery2002 2015-06-22
  • 打赏
  • 举报
回复
所以,任何调优,都必须经过实际环境中大量测试~
wasdasdfqwer 2015-06-21
  • 打赏
  • 举报
回复
网上的很多结论都是通过实践测试得出来的。就是在表中插入很多测试数据,然后分别执行sql比较时间的长短。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧