[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GYNBWCQ4X94M2ARC4GD9A2":3,"skill-same:01M6GYNBWCQ4X94M2ARC4GD9A2":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":45,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6GYNBWCQ4X94M2ARC4GD9A2","find-slow-queries-with-pg-stat-statements",null,"Use when you need to know which queries to optimise before touching code — read pg_stat_statements ranked by total time, and pick the top offender, not the one that feels slow.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33],"find","queries","with","stat","find slow queries with pg stat statements","code","pick","read","use","time","you","top","which","when","2026-11-10 10:12:30",false,"---\nname: find-slow-queries-with-pg-stat-statements\ndescription: Use when you need to know which queries to optimise before touching code — read pg_stat_statements ranked by total time, and pick the top offender, not the one that feels slow.\n---\n\n# Find slow queries with pg_stat_statements\n\nOptimise by measured total time, not by the query that feels slow. `pg_stat_statements` aggregates every statement's calls, total time, and rows, so the highest-total-time query — often a fast query called a million times — is the real target.\n\n## Procedure\n\n1. Enable the extension; it needs `shared_preload_libraries = 'pg_stat_statements'` and a restart before `CREATE EXTENSION` will work:\n```sql\nCREATE EXTENSION IF NOT EXISTS pg_stat_statements;\n```\n2. Rank by total time first — that is the aggregate impact, the correct first sort:\n```sql\nSELECT substr(query,1,80) AS q, calls,\n       round(total_exec_time)::bigint AS total_ms,\n       round(mean_exec_time,2) AS mean_ms, rows\nFROM pg_stat_statements\nORDER BY total_exec_time DESC\nLIMIT 20;\n```\n3. Also rank by mean time to surface single expensive queries that are rare but slow:\n```sql\nSELECT substr(query,1,80), calls, round(mean_exec_time,2)\nFROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 20;\n```\n4. Read `rows \u002F calls`: a query returning one row per call but called a million times is an N+1, not a plan problem — route it to the N+1 fix.\n5. Separate `total_exec_time` (actual work) from `total_plan_time`; high plan time points to a plan-cache or prepared-statement issue.\n6. Reset stats before a controlled measurement window so you measure current traffic, not history:\n```sql\nSELECT pg_stat_statements_reset();\n```\n7. Take the top statement, run `EXPLAIN (ANALYZE)` on it, fix it, re-rank, and keep the before\u002Fafter totals.\n\n## Pitfalls\n\n- Normalisation collapses constants to `$1`, so distinct queries can share a row; substitute real values when testing.\n- Ranking by mean and missing a 5ms query called two million times that dominates total time.\n- `mean_exec_time` alone hides a query that mostly waits on a lock; check `blk_read_time`\u002F`blk_write_time` (needs `track_io_timing`).\n- Forgetting the restart; `CREATE EXTENSION` alone fails without `shared_preload_libraries`.\n- Not resetting after a one-off batch job, so its single run dominates the ranking.\n- Querying stats only on the primary when a replica serving reads has its own counters.\n\n## Verification\n\n    psql -c \"SELECT calls, round(total_exec_time) FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;\"\n    psql -c \"SELECT pg_stat_statements_reset();\"   # before a measurement window\n    # pass: top total-time query identified, fixed, and its total drops on re-measure\n\nReport the top statement by total time, its calls and mean, whether the fix was a plan or a loop, and the before\u002Fafter total.\n","# Find slow queries with pg_stat_statements\n\nOptimise by measured total time, not by the query that feels slow. `pg_stat_statements` aggregates every statement's calls, total time, and rows, so the highest-total-time query — often a fast query called a million times — is the real target.\n\n## Procedure\n\n1. Enable the extension; it needs `shared_preload_libraries = 'pg_stat_statements'` and a restart before `CREATE EXTENSION` will work:\n```sql\nCREATE EXTENSION IF NOT EXISTS pg_stat_statements;\n```\n2. Rank by total time first — that is the aggregate impact, the correct first sort:\n```sql\nSELECT substr(query,1,80) AS q, calls,\n       round(total_exec_time)::bigint AS total_ms,\n       round(mean_exec_time,2) AS mean_ms, rows\nFROM pg_stat_statements\nORDER BY total_exec_time DESC\nLIMIT 20;\n```\n3. Also rank by mean time to surface single expensive queries that are rare but slow:\n```sql\nSELECT substr(query,1,80), calls, round(mean_exec_time,2)\nFROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 20;\n```\n4. Read `rows \u002F calls`: a query returning one row per call but called a million times is an N+1, not a plan problem — route it to the N+1 fix.\n5. Separate `total_exec_time` (actual work) from `total_plan_time`; high plan time points to a plan-cache or prepared-statement issue.\n6. Reset stats before a controlled measurement window so you measure current traffic, not history:\n```sql\nSELECT pg_stat_statements_reset();\n```\n7. Take the top statement, run `EXPLAIN (ANALYZE)` on it, fix it, re-rank, and keep the before\u002Fafter totals.\n\n## Pitfalls\n\n- Normalisation collapses constants to `$1`, so distinct queries can share a row; substitute real values when testing.\n- Ranking by mean and missing a 5ms query called two million times that dominates total time.\n- `mean_exec_time` alone hides a query that mostly waits on a lock; check `blk_read_time`\u002F`blk_write_time` (needs `track_io_timing`).\n- Forgetting the restart; `CREATE EXTENSION` alone fails without `shared_preload_libraries`.\n- Not resetting after a one-off batch job, so its single run dominates the ranking.\n- Querying stats only on the primary when a replica serving reads has its own counters.\n\n## Verification\n\n    psql -c \"SELECT calls, round(total_exec_time) FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5;\"\n    psql -c \"SELECT pg_stat_statements_reset();\"   # before a measurement window\n    # pass: top total-time query identified, fixed, and its total drops on re-measure\n\nReport the top statement by total time, its calls and mean, whether the fix was a plan or a loop, and the before\u002Fafter total.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-13 02:31:19",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill find-slow-queries-with-pg-stat-statements",{"tool":54,"command":55},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill find-slow-queries-with-pg-stat-statements",{"tool":57,"command":58},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill find-slow-queries-with-pg-stat-statements","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements\u002FSKILL.md",true,[62,66,72],{"path":63,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"SOURCE.md","REFERENCE","参考文档",367,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements\u002FSOURCE.md",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-find-slow-queries-with-pg-stat-statements\u002FTRUST.auto.yaml",[77,105,128,146,159,169],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":81,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":34},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":110,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":34},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[114,115,116,117,118,119,120,121,122,123,124,125,126,127],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":132,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":34},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[136,115,137,138,139,140,141,125,124,123,142,143,144,119,145,118,117],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":109,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":34},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[154,155,116,156,157,126,124,158,122,121,119,118],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":160,"name":161,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":162,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":34},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[166,167,168],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":34},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[177,178,179,180,181,182,183,28,184,25,185],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","share"]