字段太多看不全,ksql 的展開模式和輸出控制怎麼用

MySQL 裡查寬表,欄位一多輸出就會折行,欄位對應關係很容易看亂。MySQL 的解法是在 SQL 結尾加 `\G`,把每行欄位垂直列出。ksql 處理這個問題的方式不同——透過幾個元命令控制整個工作階段的輸出行為,不用每條 SQL 結尾另外加。

這篇在 KingbaseES V009R001C010 環境裡驗證:\x(展開模式)、\x auto(自動判斷)、\timing(執行耗時)、\pset border(邊框調整)、\o(輸出重新導向)。示範在 app_db 資料庫的 app_schema.t_meta_demo 表上進行,使用 app_user 連線,進入後先執行 set search_path to app_schema, public,讓後續查詢不用帶 schema 前綴。

有幾個活動推薦給大家:

"1、薦商機·贏好禮——金倉社區「同行者計畫」開啟(bbs.kingbase.com.cn/forumDetail…2、2026金倉資料庫智慧運維工具開發大賽(bbs.kingbase.com.cn/forumDetail…"

預設輸出下的寬表問題

關掉分頁器,直接查全表:

sql 代碼解讀複製代碼\pset pager off

select * from t_meta_demo;

預設輸出寬表換行

t_meta_demoidorder_nouser_namestatusamountcreated_at 六個欄位,終端寬度不夠時每行會折成多行,欄位名和值的對應關係很難一眼看清。這就是 \x 要解決的問題。

\x 開關:垂直展開與關閉

打開展開模式,再查一次:

sql 代碼解讀複製代碼\x

select * from t_meta_demo limit 2;

再執行一次 \x 關掉,對比兩次輸出:

sql 代碼解讀複製代碼\x

select * from t_meta_demo limit 2;

x 模式開關前後對比

\x 打開後 ksql 提示 Expanded display is on,輸出格式從橫排表格變成垂直列示,每個欄位單獨一行,格式是 欄位名 | 值。再次執行 \x 提示 Expanded display is off,恢復橫排。

MySQL 裡垂直顯示用的是 select ... \G,寫在 SQL 結尾,只對那一條語句生效。\x 是工作階段級開關,打開以後所有查詢都走垂直格式,不需要每條 SQL 後面加。連續查幾張寬表時,\x\G 省事得多。

\x auto:讓 ksql 自己決定要不要展開

手動切 \x 來回有點麻煩。\x auto 模式下 ksql 會自動判斷:

sql 代碼解讀複製代碼\x auto

ksql 回傳 Expanded display is used automatically

查單行結果:

sql 代碼解讀複製代碼select * from t_meta_demo where order_no = 'ORD-20240601-001';

再查多行:

sql 代碼解讀複製代碼select * from t_meta_demo;

x auto 自動切換

單行查詢下 ksql 會自動使用垂直展開;多行查詢時 ksql 判斷終端寬度夠用,直接輸出橫排表格。

\x auto 的判斷依據是目前終端寬度,不是欄位數量。同一張表,終端視窗調窄時 ksql 更傾向於展開,調寬後相同查詢可能回到橫排。MySQL 裡沒有這個模式,\G 每次都要手寫在 SQL 結尾。

\timing 顯示執行耗時

關掉展開模式,開啟計時:

sql 代碼解讀複製代碼\x off
\timing

執行幾條查詢觀察耗時:

sql 代碼解讀複製代碼select count(*) from t_meta_demo;

select * from t_meta_demo where status = 'paid';

select user_name, sum(amount) from t_meta_demo group by user_name;

timing 顯示執行耗時

\timing 開啟後會提示 Timing is on,每條 SQL 執行完都會接著一行 Time: x.xxx ms

MySQL 裡看執行耗時通常需要 show profiles 或借助客戶端工具,ksql 裡 \timing 打開後會自動附在每個結果後面,不用額外操作。

\timing 給的是客戶端側的牆鐘時間,包含網路往返和客戶端處理,只適合粗略判斷某條查詢快不快。若要精確分析 SQL 是否走了索引、各執行節點耗時分布,還是要用 EXPLAIN (ANALYZE, BUFFERS),不能把 \timing 當成效能分析工具來用。

\pset border 調整輸出邊框

關掉計時,示範三種邊框樣式:

sql 代碼解讀複製代碼\timing off

預設邊框(border 1):

sql 代碼解讀複製代碼\pset border 1
select order_no, user_name, status, amount from t_meta_demo limit 3;

無邊框(border 0):

sql 代碼解讀複製代碼\pset border 0
select order_no, user_name, status, amount from t_meta_demo limit 3;

雙線邊框(border 2):

sql 代碼解讀複製代碼\pset border 2
select order_no, user_name, status, amount from t_meta_demo limit 3;

pset border 三種邊框樣式

三種樣式的差別:

  • border 1:欄位之間用 | 分隔,標題行下有 +---+---+ 形式的分隔線,是預設樣式
  • border 0:去掉所有分隔符,欄位之間只有空格,標題和資料之間用短橫線對齊
  • border 2:整個結果集外面加一圈完整邊框,頂部、底部、標題和資料之間都有分隔線

\pset border 只改顯示格式,不影響資料,切換後立即生效。MySQL 客戶端輸出的邊框樣式固定,ksql 這裡可以按需調整。border 0 在把終端輸出貼進文件時最有用,不用手動清掉格線。示範完以後恢復預設:

sql 代碼解讀複製代碼\pset border 1

\o 把輸出寫進檔案

在互動工作階段裡把查詢結果重新導向到檔案,不需要退出去用 shell 重新導向:

sql 代碼解讀複製代碼\pset border 1
\o /tmp/ksql-output.txt

select order_no, user_name, status, amount from t_meta_demo;

\o

o 輸出重新導向到檔案

\o /tmp/ksql-output.txt 打開後,ksql 不再把查詢結果輸出到終端——select 執行後提示符直接回來,沒有任何表格輸出,結果都寫進檔案。\o 不帶參數則關閉重新導向,恢復終端輸出。在另一個終端用 cat /tmp/ksql-output.txt 可以看到全部五行資料,和直接在終端查的結果一致。

有一個坑很容易踩:關閉重新導向必須用 \o 不帶任何參數。忘了關的話,後續所有查詢輸出包括元命令提示都會繼續寫檔案,終端裡什麼都看不到,很容易以為命令沒執行。MySQL 裡在互動工作階段內匯出結果通常要借助外部工具,ksql 裡 \o 可以直接在工作階段內切換,用完記得關。


原文出處:https://juejin.cn/post/7657831024920133659


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝15   💬3   ❤️3
643
🥈
我愛JS
📝2   💬3   ❤️3
123
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登