成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

避免使用SELECT* 的九個理由及兩個例外場景

數據庫 其他數據庫
本文將從兩個角度解釋避免使用SELECT *的9個理由,同時討論2個合理使用SELECT *的例外場景。

我們經常會看到一些文章警告使用SELECT * 是一種錯誤的習慣,應該明確地指定查詢的列名,譬如在最新《阿里java開發手冊(泰山版)》中對此做了強制性的規定。而大家對其原因只是一知半解。本文將從兩個角度解釋避免使用SELECT *的9個理由,同時討論2個合理使用SELECT *的例外場景。

性能問題

從性能的角度,在應用中使用SELECT *可能會引起查詢的性能問題,主要表現在以下六個方面。

  • 增加解析成本:用SELECT *數據庫需要解析更多的對象、權限、屬性等相關內容,這個影響可能較小,但是它確實會對數據庫的元數據查詢造成一定的壓力。
  • 增加I/O操作,對于無用的大字段,如 VARCHAR、LOB、TEXT類型的字段,會增加 IO操作;數據庫一般會把超過一定長度的大字段,存放在單獨的表空間中,因此對這些字段的訪問會額外地增加一次I/O操作。
  • 增加網絡消耗,帶上如LOB/TEXT之類的無用的大文本字段,傳輸數據量會成多倍地增漲,特別是如果數據庫和應用程序不在同一臺機器,這種開銷非常明顯。
  • 增加內存消耗,不管您是否使用這些列,您的應用程序都需要把它們接收到內存,這可能會無謂的消耗大量的內存,影響程序的性能及健壯性,甚至造成內存溢出,應用崩潰。
  • 影響索引選擇,對于使用SELECT * 的查詢語句,優化器會放棄覆蓋索引策略優化的可能性,導致需要回表或是全表掃描。
  • 影響索引推薦,PawSQL的索引推薦引擎能夠分析SQL的結構,對符合條件的表上創建索引(快速定位、避免排序、避免回表)以提升查詢性能,具體請參考《創建高效索引的準則》。對于使用SELECT * 的查詢語句,PawSQL將不考慮進行覆蓋索引的推薦。

維護代價

從代碼維護的角度,在應用中使用SELECT *可能會導致維護變得困難,主要表現在以下三個方面,

代碼可讀性:使用SELECT * 會降低代碼的可讀性,這是因為使用SELECT * 會使查詢語句不容易理解,開發人員需要查看表定義來確定到底查詢的是什么數據,同時也難以進行調試。

列名對齊:

  • 在通過ORM框架開發應用時,增加或是刪減字段,容易與 resultMap 配置不一致;
  • 當使用SELECT * 定義視圖時,增加或是刪減字段,都可能導致視圖失效,
  • 您可能會經常使用SELECT * into INSERT . . .之類的語句,以實現將某些數據從一張表復制到另一張表。如果在兩張表中,各個列的排列順序略有不同,那么就可能會出現將不正確的數據復制到錯誤列中的情況。

列名沖突:如果您在連接查詢中使用了SELECT * ,一旦在多個表中出現了具有相同名稱的列,就會導致列名沖突;從而導致數據的消費方使用錯誤。

兩個例外情形

SELECT * 并不是任何情況下都不適合使用,我們日常開發中經常使用的合理場景有兩類:

即席查詢(Ad-hoc Query)

當我們進行數據探索或是問題定位時,我們需要即時的手工寫一些SQL來查看某些數據表,我們不知道表有哪些列,這個時候我們可以使用SELECT *來完成我們的查詢。我們不會,也不需要預先研究底層列名是什么,我們甚至是通過SELECT *來確定列名和樣例數據。特別是當表有大量的列時,SELECT *可以讓我們更方便快捷完成數據探索或是問題定位的目標。

當 * 表示一行,而不是代表所有列時

當 * 表示一行,而不是代表所有列時,* 的使用是合理的。

譬如在以下用例中,* 表示符合某個條件的行。如果您使用列名而不是 *,它將計算該列值不為NULL的行數。

SELECT COUNT(*) FROM table

類似的,在下面的這個查詢中,* 表示符合關聯條件條件的行。

SELECT c_custname FROM customer c WHERE EXISTS ( SELECT * FROM orders o WHERE o.c_custkey = c.c_custkey);

有些人在 SELECT 列表中使用 表orders的主鍵o.c_custkey,或者使用數字1,但是這些約定基本上是沒有意義的。你查詢的是符合某個條件的所有行,這就是 * 的含義。對于數據庫優化器來說,這兩個查詢語句實際上是相同的。

PawSQL中與SELECT*相關的優化

PawSQL中與SELECT*相關的審查或優化有三個。

SELECT*審查預警

PawSQL分析用戶輸入的SQL語句,并對其中出現的非上述例外情況的SELECT*進行提示預警。

  • 對下面的SQL進行預警
select * from customer as c where c.c_acctbal > 100
  • 對下面的SQL不預警,屬于例外情況
select c_custname from customer c where EXISTS ( select * from orders o where o.c_custkey = c.c_custkey);

投影下推(Projection Pushdown)

PawSQL中的投影下推重寫優化可以把子查詢中的SELECT進行重寫,刪除不必要的SELECT

  • 優化前SQL,子查詢中存在SELECT*
select c_nationkey, count(*)
from (select *
from customer as c
where c.c_acctbal > 100)
group by c_nationkey
  • 應用投影下推后
select c_nationkey, count(*)
from (select c_nationkey
from customer as c
where c.c_acctbal > 100)
group by c_nationkey

如果您希望在PawSQL中驗證投影下推對于SELECT *的處理邏輯,您需要先禁用查詢折疊(Query Folding)重寫優化,因為查詢折疊會將子查詢重寫合并。

覆蓋索引推薦

如在性能問題章節里所述,對于使用SELECT * 的查詢語句,PawSQL索引推薦引擎將不考慮進行覆蓋索引的推薦。

關于PawSQL

PawSQL專注數據庫性能優化的自動化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL優化產品包括。

  • PawSQL Cloud,在線自動化SQL優化工具,支持SQL審查,智能查詢重寫、基于代價的索引推薦,適用于數據庫管理員及數據應用開發人員。
  • PawSQL Advisor,IntelliJ 插件, 適用于數據應用開發人員,可以IDEA/DataGrip應用市場通過名稱搜索“PawSQL Advisor”安裝。
責任編輯:姜華 來源: PawSQL
相關推薦

2021-12-27 10:11:22

加密后門密碼學數據安全

2012-04-03 14:27:19

手機

2018-09-04 12:03:31

HBase大數據存儲

2022-04-19 10:29:56

外包誤區IT外包IT領導者

2014-08-01 14:35:33

Linux開源軟件

2022-04-08 16:11:01

物聯網

2010-01-14 14:38:47

為什么使用三層交換機

2012-10-11 10:43:26

開發SQL

2023-12-18 10:45:22

SQL開發數據庫

2020-06-04 08:15:53

Kubernetes容器PaaS

2024-06-24 08:00:00

網絡安全WAFWeb應用程序防火墻

2011-03-02 09:34:58

AppFuse

2011-07-31 19:44:43

程序員

2022-08-29 09:06:43

hippo4j動態線程池

2015-12-21 10:05:33

2016-07-11 16:03:10

慧點科技

2011-08-01 14:33:44

SQL

2024-10-10 08:46:28

2015-10-26 13:16:11

FreeMarkerJSP

2015-10-28 10:04:29

FreeMarkerJSP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本亚洲精品 | 日韩精品国产精品 | 国产一区二区观看 | 精品亚洲永久免费精品 | 狠狠色综合网站久久久久久久 | 91福利在线观看视频 | 日韩成人av在线 | 欧美一级视频免费看 | 欧美精品二区 | 成人久久一区 | 91精品国产91久久久久久三级 | 成人精品国产一区二区4080 | 日本免费一区二区三区 | 精品在线一区二区 | 毛片黄| 国产日韩一区二区三免费高清 | 狠狠插天天干 | 久久久国产一区 | 99久久婷婷国产综合精品电影 | 91精品久久久久久久久 | 亚洲精品永久免费 | 国产激情视频在线 | 欧美一区二区另类 | 天天精品在线 | 在线免费黄色小视频 | 欧美一级网站 | 久久久久久国产精品免费免费狐狸 | h视频在线播放 | 亚洲免费在线 | 精品久久久久一区二区国产 | 久久久久久综合 | 精品国产欧美日韩不卡在线观看 | 超碰在线久 | 成人免费在线视频 | 一级黄色影片在线观看 | 99国内精品 | 欧美日韩淫片 | 国产精品网址 | 欧美区在线 | 91免费观看国产 | 奇米久久|