大數據“復活”記
1256
2025-04-01
【簡介】
索引是常見的查詢性能優化手段,但索引本身也需要占用一定的磁盤空間,同時也會降低數據入庫的性能。通過學習和了解GaussDB(DWS)的btree索引和cbtree的機制,本文提供一種依靠索引元數據來識別表上索引冗余的手段
【方案】
注: 不支持表達式索引, 不區分partial index和普通的index
-- duplicate:重復索引 -- 解釋:索引定義重復 -- 建議:刪除重復索引 -- redundancy:冗余索引 -- 解釋:如果索引A的索引列剛好是索引B的索引列的前面一部分,那么索引A就可以被認為是冗余索引 -- 建議:刪除冗余索引 -- optimizable:可優化索引 -- 解釋:如果索引A和B的索引列一致,只是索引列的順序有差異,那么索引A或者B是可優化的 -- 建議:根據業務優化索引的列字段,通常會根據重復程度,刪除索引的后N個索引列 WITH info AS ( SELECT n.nspname AS schemaname, c.relname AS tablename, x.indrelid AS indrelid, x.indexrelid AS indexrelid, indnatts, indkey, indexprs FROM pg_index x JOIN pg_class c ON c.oid = x.indrelid JOIN pg_class i ON i.oid = x.indexrelid LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = 'r' AND c.oid >= 16384 AND (c.reloptions IS NULL OR c.reloptions::text NOT LIKE '%internal_mask%') AND i.relkind = 'i' AND i.oid >= 16384 AND x.indpred IS NULL ) SELECT i.schemaname, i.tablename, i.indexrelid::regclass::text AS baseidx, substring(pg_get_indexdef(i.indexrelid) from 'USING .+\)') AS baseidxdef, x.indexrelid::regclass::text AS optidx, substring(pg_get_indexdef(x.indexrelid) from 'USING .+\)') AS optidxdef, CASE WHEN i.indkey = x.indkey AND pg_get_expr(i.indexprs, i.indrelid) = pg_get_expr(x.indexprs, x.indrelid) THEN 'duplicate'::text WHEN x.indexprs IS NULL AND strpos(i.indkey::text||' ', x.indkey::text) = 1 THEN 'redundancy'::text WHEN x.indexprs IS NULL AND i.indkey @> x.indkey AND x.indkey @> i.indkey THEN 'optimizable'::text ELSE NULL END AS optpolicy FROM info i INNER JOIN pg_index x ON (i.indrelid = x.indrelid AND i.indexrelid > x.indexrelid) WHERE x.indpred IS NULL AND optpolicy IS NOT NULL ORDER BY 1, 2, 3 ;
EI企業智能 Gauss AP SQL 數據倉庫服務 GaussDB(DWS) 運維
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。