如何查看一条SQL语句是否用到索引

这就是坑。

别这样做。

直接使用 SELECT index_name FROM user_indexes WHERE table_name = 'TABLE_NAME';检查索引。

sql 中 alter index rebuild 用法_sql 中 alter index rebuild 重建索引教程

说实话,需要重建索引的时候,我在XX公司做项目的时候也遇到过一些问题,所以还是有一些经验的。
如果使用正确,ALTER INDEX REBUILD 命令可以成为救星,但如果使用错误,它可能会弄乱数据库。

我们先来说说实际场景。
我使用 SQL Server 管理旧系统,命令表有数千个索引。
年底,资料集体发出。
经核查,该指数股息率增加了6 0%以上。
当时系统询问特殊卡,客户投诉很多。
我连夜编写了一个脚本,并使用 REBUILD 重建了关键的 idx_order_day。
结果第二天开机时,CPU使用率升至9 0%,硬盘I/O爆发。
检查日志后发现重建时没有添加线上表项,整个表被锁了三个小时左右。
这个教训是非常深刻的。

基本语法并不复杂,但关键是理解为什么要使用它。
重建不是包治百病,要看具体情况。
例如,有一个使用MySQL的客户端。
ALGORITHM=INPLACE REBUILD,大家习惯使用的,MySQL ONLINE ReBUILD在5 .7 版本之前就支持了,但是参数的用法和SQL Server完全不同。

FILLFACTOR 参数特别值得考虑。
之前我在XX系统中设置了idx_order_date REBUILD WITH (FILLFACTOR=8 0)。
起初我想减少分页符,但是我发现当输入新数据时,分页符越来越多。
后来查了数据,发现这和表的数据分布有直接关系。
对于不均匀的数据分布,9 0% FILLFACTOR 可能更合适。
我自己没有运行过这个。
我记得数据在X区域,但我建议你检查一下。

我有一个万无一失的方法来计算分割的大小。
首先在凌晨2 点重建索引,使用在线基准测试,然后监控系统。
如果重建后CPU使用率仍然是2 00%,则说明索引永远不需要重建。
我见过客户将分割率设置为 2 0% 并自动重建。
结果,系统的性能变得越来越差。
非常重要的是不要将索引重建视为日常维护任务。
在一个项目中,我每周都会定期构建所有索引。
结果系统日志爆炸了,等待时间从2 小时变成了4 8 小时。
后来当碎片率超过4 0%且系统稳定时转为重构。
需要明确的是,重建是一项严肃的事业,数据应该说明一切。

我记得有一次我在指导一位客户,手术和维护人员问:“重建和重建有什么区别?”我以此为例。
重组就像重新排列外卖盒中的物品,而重建就像扔掉外卖盒并订购另一个。
一切看起来都需要大量工作,但后者确实有效。

不同数据库之间的差异非常有趣。
Oracle的REBUILD重建整个索引结构,PostgreSQL使用REINDEX语法,但他们的在线重建逻辑不同。
所以在编写跨数据库脚本时,应该单独处理这个问题。

最后,我们来说说一些小事。
如果重建时表数据量较大,建议使用SORT_IN_TEMPDB=ON。
当客户使用这个参数时,他发现临时表占用了8 0%的磁盘空间——当时临时磁盘分配了2 0G。
因此,您应该在重建之前检查临时磁盘的大小。
别忘了这一点。
虽然这项工作的技术含量不高,但要想正确理解,还是应该根据系统的实际情况进行调整。
有时调整 FILLFACTOR 比直接构建指针更好。
我有一个客户就是这样做的。
重构后分布率仍为5 0%,但查询速度更快。
当时我并没有意识到,但我了解到他们表进出的数据极其不一致,9 0%的数据都在前几条记录中。

sql like走索引吗

2 02 3 年,在MySQL数据库中,当查询条件为“name LIKE 'abc%'”时,如果name列有索引,则会有效利用索引,查询效率将大幅提升。
但如果查询是“name LIKE '%abc%'”,即使有索引,查询性能也不会提高,因为数据库需要全表扫描。
不同的数据库(例如Oracle和SQL Server)对LIKE语句索引有不同的实现。
具体效果需要根据实际数据库和版本进行测试。