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_demo 有 id、order_no、user_name、status、amount、created_at 六個欄位,終端寬度不夠時每行會折成多行,欄位名和值的對應關係很難一眼看清。這就是 \x 要解決的問題。
打開展開模式,再查一次:
sql 代碼解讀複製代碼\x
select * from t_meta_demo limit 2;
再執行一次 \x 關掉,對比兩次輸出:
sql 代碼解讀複製代碼\x
select * from t_meta_demo limit 2;
\x 打開後 ksql 提示 Expanded display is on,輸出格式從橫排表格變成垂直列示,每個欄位單獨一行,格式是 欄位名 | 值。再次執行 \x 提示 Expanded display is off,恢復橫排。
MySQL 裡垂直顯示用的是 select ... \G,寫在 SQL 結尾,只對那一條語句生效。\x 是工作階段級開關,打開以後所有查詢都走垂直格式,不需要每條 SQL 後面加。連續查幾張寬表時,\x 比 \G 省事得多。
手動切 \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;
單行查詢下 ksql 會自動使用垂直展開;多行查詢時 ksql 判斷終端寬度夠用,直接輸出橫排表格。
\x auto 的判斷依據是目前終端寬度,不是欄位數量。同一張表,終端視窗調窄時 ksql 更傾向於展開,調寬後相同查詢可能回到橫排。MySQL 裡沒有這個模式,\G 每次都要手寫在 SQL 結尾。
關掉展開模式,開啟計時:
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 is on,每條 SQL 執行完都會接著一行 Time: x.xxx ms。
MySQL 裡看執行耗時通常需要 show profiles 或借助客戶端工具,ksql 裡 \timing 打開後會自動附在每個結果後面,不用額外操作。
但 \timing 給的是客戶端側的牆鐘時間,包含網路往返和客戶端處理,只適合粗略判斷某條查詢快不快。若要精確分析 SQL 是否走了索引、各執行節點耗時分布,還是要用 EXPLAIN (ANALYZE, BUFFERS),不能把 \timing 當成效能分析工具來用。
關掉計時,示範三種邊框樣式:
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;
三種樣式的差別:
border 1:欄位之間用 | 分隔,標題行下有 +---+---+ 形式的分隔線,是預設樣式border 0:去掉所有分隔符,欄位之間只有空格,標題和資料之間用短橫線對齊border 2:整個結果集外面加一圈完整邊框,頂部、底部、標題和資料之間都有分隔線\pset border 只改顯示格式,不影響資料,切換後立即生效。MySQL 客戶端輸出的邊框樣式固定,ksql 這裡可以按需調整。border 0 在把終端輸出貼進文件時最有用,不用手動清掉格線。示範完以後恢復預設:
sql 代碼解讀複製代碼\pset border 1
在互動工作階段裡把查詢結果重新導向到檔案,不需要退出去用 shell 重新導向:
sql 代碼解讀複製代碼\pset border 1
\o /tmp/ksql-output.txt
select order_no, user_name, status, amount from t_meta_demo;
\o
\o /tmp/ksql-output.txt 打開後,ksql 不再把查詢結果輸出到終端——select 執行後提示符直接回來,沒有任何表格輸出,結果都寫進檔案。\o 不帶參數則關閉重新導向,恢復終端輸出。在另一個終端用 cat /tmp/ksql-output.txt 可以看到全部五行資料,和直接在終端查的結果一致。
有一個坑很容易踩:關閉重新導向必須用 \o 不帶任何參數。忘了關的話,後續所有查詢輸出包括元命令提示都會繼續寫檔案,終端裡什麼都看不到,很容易以為命令沒執行。MySQL 裡在互動工作階段內匯出結果通常要借助外部工具,ksql 裡 \o 可以直接在工作階段內切換,用完記得關。