穆罕默德·阿里:使用 SELECT * 的陷阱

穆罕默德·阿里:使用 SELECT * 的陷阱

💡 原文英文,约900词,阅读约需3分钟。
📝

内容提要

使用SELECT *检索数据可能导致性能问题和资源消耗,应避免使用SELECT *,而是选择仅检索所需列的查询。

🔎

延伸解读

网络传输与资源消耗

使用SELECT *会检索所有列,包括不需要的数据,从而增加数据库服务器与应用程序服务器之间的网络流量。这不仅消耗更多带宽和资源,还可能影响共享同一网络的其他应用和服务的性能。此外,增加的流量可能导致网络基础设施和数据传输成本上升。

排序与哈希操作的负担

SELECT *会增加数据量,使得排序和哈希操作更加资源密集。排序算法需要处理更大的数据集,消耗更多内存(work_mem)和计算能力,可能导致排序变慢、CPU使用率升高,甚至生成低效的执行计划。哈希操作如分组或连接也会因数据量增大而消耗更多内存,可能触发基于磁盘的哈希,导致处理时间变长。

TOAST列与索引仅扫描的影响

在PostgreSQL中,SELECT *会检索所有列,包括可能被压缩或存储在TOAST表中的大值列,解压缩和额外获取元组会增加CPU和I/O开销。此外,SELECT *会阻止索引仅扫描,因为索引仅扫描要求查询只引用索引中存储的列。使用SELECT *会强制访问表数据,增加磁盘读取和内存占用,降低查询效率。

❓

Q&A

使用SELECT *会带来哪些性能问题?

使用SELECT *会导致网络流量增加、资源消耗加大,影响数据库性能,尤其在排序和哈希操作时更为明显。

为什么不建议在SQL查询中使用SELECT *?

不建议使用SELECT *因为它会检索所有列,增加数据大小,导致更高的资源消耗和更慢的查询效率。

PostgreSQL中的TOAST机制是什么?

TOAST机制用于高效存储大值,如文本和二进制数据,使用SELECT *时会检索所有列,包括可能需要解压缩的TOAST列。

如何提高SQL查询的效率?

通过仅选择所需的列而非使用SELECT *,可以提高查询效率,允许数据库使用索引仅扫描。

SELECT *对网络带宽的影响是什么?

使用SELECT *会增加数据库与应用程序之间的网络流量,消耗更多带宽,可能影响其他应用的性能。

什么是索引仅扫描?

索引仅扫描是一种查询优化技术,允许数据库直接从索引中检索数据,避免访问实际表数据,但SELECT *会阻止这种扫描。

🏷️

标签

➡️

继续阅读