{"id":"1822e620-96ca-479c-8f9c-06f02d6cfe6e","shortId":"xtGQng","kind":"skill","title":"risingwave-best-practices","tagline":"Use when designing RisingWave schemas, writing materialized views, configuring sources or sinks, optimizing streaming SQL performance, troubleshooting slow backfills, setting up CDC, designing time-windowed aggregations, or reviewing a RisingWave streaming pipeline","description":"# RisingWave Best Practices\n\n14 rules covering schema design, streaming SQL patterns, sink configuration, and performance.\n\n## How to Apply\n\n1. Read the relevant rule files for the review type below\n2. Apply rules to the design or code under review\n3. Explain violations with their impact and the fix\n\n## Review Procedures\n\n### Schema Review\n- [ ] [schema-source-vs-table.md](rules/schema-source-vs-table.md) — SOURCE vs TABLE selection\n- [ ] [schema-append-only.md](rules/schema-append-only.md) — APPEND ONLY for immutable streams\n- [ ] [schema-watermark.md](rules/schema-watermark.md) — Watermark placement\n\n### Materialized View Review\n- [ ] [mv-emit-on-window-close.md](rules/mv-emit-on-window-close.md) — EOWC for windowed queries\n- [ ] [mv-background-ddl.md](rules/mv-background-ddl.md) — Non-blocking DDL for large tables\n- [ ] [mv-no-order-by.md](rules/mv-no-order-by.md) — ORDER BY in MVs\n\n### Streaming SQL Review\n- [ ] [stream-tumble-windows.md](rules/stream-tumble-windows.md) — Time window functions\n- [ ] [stream-cdc-pattern.md](rules/stream-cdc-pattern.md) — Two-step CDC setup\n- [ ] [stream-temporal-join.md](rules/stream-temporal-join.md) — Joining streams with CDC tables\n\n### Sink Review\n- [ ] [sink-snapshot-false.md](rules/sink-snapshot-false.md) — Prevent backfill duplicates\n- [ ] [sink-force-compaction.md](rules/sink-force-compaction.md) — Reduce output volume\n\n### Performance Review\n- [ ] [perf-shared-source.md](rules/perf-shared-source.md) — Shared Kafka source\n- [ ] [perf-indexes-on-mv.md](rules/perf-indexes-on-mv.md) — Indexes on materialized views\n- [ ] [perf-parallelism.md](rules/perf-parallelism.md) — MV parallelism tuning\n\n## Rule Categories\n\n| Priority | Category | Impact | Prefix | Rules |\n|----------|----------|--------|--------|-------|\n| 1 | Schema Design | CRITICAL / HIGH | `schema-` | 3 |\n| 2 | Materialized Views | CRITICAL / HIGH | `mv-` | 3 |\n| 3 | Streaming SQL | CRITICAL / HIGH | `stream-` | 3 |\n| 4 | Sink Configuration | HIGH / MEDIUM | `sink-` | 2 |\n| 5 | Performance | HIGH / MEDIUM | `perf-` | 3 |\n\n## Quick Reference\n\n**Schema:**\n- `schema-source-vs-table` — CDC requires TABLE; SOURCE is for append-only streams\n- `schema-append-only` — APPEND ONLY enables optimizations; use for immutable event data\n- `schema-watermark` — Define watermarks at ingestion point (source/table), not in MVs\n\n**Materialized Views:**\n- `mv-emit-on-window-close` — Use EOWC for final window results; default emits partial updates\n- `mv-background-ddl` — SET BACKGROUND_DDL=true before creating MVs over large tables\n- `mv-no-order-by` — ORDER BY in MV applies only at creation, not to ongoing results\n\n**Streaming SQL:**\n- `stream-tumble-windows` — Use TUMBLE/HOP/SESSION, not date_trunc, for streaming windows\n- `stream-cdc-pattern` — Two-step: CREATE SOURCE (shared) → CREATE TABLE ... FROM source\n- `stream-temporal-join` — Join streaming source with CDC table using FOR SYSTEM_TIME AS OF\n\n**Sinks:**\n- `sink-snapshot-false` — Always use `snapshot = false` when adding sinks to existing MVs\n- `sink-force-compaction` — Use `force_compaction = true` for high-cardinality upsert sinks\n\n**Performance:**\n- `perf-shared-source` — Multiple MVs from one Kafka topic should use shared source\n- `perf-indexes-on-mv` — Create indexes on MV columns used in WHERE/JOIN predicates\n- `perf-parallelism` — Increase parallelism for high-throughput MVs","tags":["risingwave","best","practices","agent","skills","risingwavelabs","agent-skills"],"capabilities":["skill","source-risingwavelabs","skill-risingwave-best-practices","topic-agent-skills"],"categories":["agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/risingwavelabs/agent-skills/risingwave-best-practices","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add risingwavelabs/agent-skills","source_repo":"https://github.com/risingwavelabs/agent-skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (3,379 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:14:16.112Z","embedding":null,"createdAt":"2026-05-18T13:21:49.407Z","updatedAt":"2026-05-18T19:14:16.112Z","lastSeenAt":"2026-05-18T19:14:16.112Z","tsv":"'1':56,190 '14':41 '2':67,197,217 '3':77,196,203,204,210,223 '4':211 '5':218 'ad':370 'aggreg':31 'alway':365 'append':98,239,244,246 'append-on':238 'appli':55,68,308 'backfil':23,158 'background':287,290 'best':3,39 'block':120 'cardin':386 'categori':184,186 'cdc':26,144,151,232,332,352 'close':274 'code':74 'column':413 'compact':378,381 'configur':13,50,213 'cover':43 'creat':294,337,340,409 'creation':311 'critic':193,200,207 'data':254 'date':325 'ddl':121,288,291 'default':281 'defin':258 'design':7,27,45,72,192 'duplic':159 'emit':271,282 'enabl':248 'eowc':112,276 'event':253 'exist':373 'explain':78 'fals':364,368 'file':61 'final':278 'fix':85 'forc':377,380 'function':138 'high':194,201,208,214,220,385,425 'high-cardin':384 'high-throughput':424 'immut':101,252 'impact':82,187 'increas':421 'index':174,406,410 'ingest':261 'join':148,347,348 'kafka':170,398 'larg':123,297 'materi':11,107,176,198,267 'medium':215,221 'multipl':394 'mv':180,202,270,286,300,307,408,412 'mv-background-ddl':285 'mv-background-ddl.md':116 'mv-emit-on-window-clos':269 'mv-emit-on-window-close.md':110 'mv-no-order-bi':299 'mv-no-order-by.md':125 'mvs':130,266,295,374,395,427 'non':119 'non-block':118 'one':397 'ongo':314 'optim':17,249 'order':127,302,304 'output':163 'parallel':181,420,422 'partial':283 'pattern':48,333 'perf':222,391,405,419 'perf-indexes-on-mv':404 'perf-indexes-on-mv.md':172 'perf-parallel':418 'perf-parallelism.md':178 'perf-shared-sourc':390 'perf-shared-source.md':167 'perform':20,52,165,219,389 'pipelin':37 'placement':106 'point':262 'practic':4,40 'predic':417 'prefix':188 'prevent':157 'prioriti':185 'procedur':87 'queri':115 'quick':224 'read':57 'reduc':162 'refer':225 'relev':59 'requir':233 'result':280,315 'review':33,64,76,86,89,109,133,154,166 'risingwav':2,8,35,38 'risingwave-best-practic':1 'rule':42,60,69,183,189 'rules/mv-background-ddl.md':117 'rules/mv-emit-on-window-close.md':111 'rules/mv-no-order-by.md':126 'rules/perf-indexes-on-mv.md':173 'rules/perf-parallelism.md':179 'rules/perf-shared-source.md':168 'rules/schema-append-only.md':97 'rules/schema-source-vs-table.md':91 'rules/schema-watermark.md':104 'rules/sink-force-compaction.md':161 'rules/sink-snapshot-false.md':156 'rules/stream-cdc-pattern.md':140 'rules/stream-temporal-join.md':147 'rules/stream-tumble-windows.md':135 'schema':9,44,88,191,195,226,228,243,256 'schema-append-on':242 'schema-append-only.md':96 'schema-source-vs-t':227 'schema-source-vs-table.md':90 'schema-watermark':255 'schema-watermark.md':103 'select':95 'set':24,289 'setup':145 'share':169,339,392,402 'sink':16,49,153,212,216,360,362,371,376,388 'sink-force-compact':375 'sink-force-compaction.md':160 'sink-snapshot-fals':361 'sink-snapshot-false.md':155 'skill' 'skill-risingwave-best-practices' 'slow':22 'snapshot':363,367 'sourc':14,92,171,229,235,338,343,350,393,403 'source-risingwavelabs' 'source/table':263 'sql':19,47,132,206,317 'step':143,336 'stream':18,36,46,102,131,149,205,209,241,316,319,328,331,345,349 'stream-cdc-pattern':330 'stream-cdc-pattern.md':139 'stream-temporal-join':344 'stream-temporal-join.md':146 'stream-tumble-window':318 'stream-tumble-windows.md':134 'system':356 'tabl':94,124,152,231,234,298,341,353 'tempor':346 'throughput':426 'time':29,136,357 'time-window':28 'topic':399 'topic-agent-skills' 'troubleshoot':21 'true':292,382 'trunc':326 'tumbl':320 'tumble/hop/session':323 'tune':182 'two':142,335 'two-step':141,334 'type':65 'updat':284 'upsert':387 'use':5,250,275,322,354,366,379,401,414 'view':12,108,177,199,268 'violat':79 'volum':164 'vs':93,230 'watermark':105,257,259 'where/join':416 'window':30,114,137,273,279,321,329 'write':10","prices":[{"id":"83628553-7f3a-4764-8842-90682874623e","listingId":"1822e620-96ca-479c-8f9c-06f02d6cfe6e","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"risingwavelabs","category":"agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:49.407Z"}],"sources":[{"listingId":"1822e620-96ca-479c-8f9c-06f02d6cfe6e","source":"github","sourceId":"risingwavelabs/agent-skills/risingwave-best-practices","sourceUrl":"https://github.com/risingwavelabs/agent-skills/tree/main/skills/risingwave-best-practices","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:49.407Z","lastSeenAt":"2026-05-18T19:14:16.112Z"}],"details":{"listingId":"1822e620-96ca-479c-8f9c-06f02d6cfe6e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"risingwavelabs","slug":"risingwave-best-practices","github":{"repo":"risingwavelabs/agent-skills","stars":7,"topics":["agent-skills"],"license":"other","html_url":"https://github.com/risingwavelabs/agent-skills","pushed_at":"2026-04-13T04:28:40Z","description":"Agent Skills for RisingWave.","skill_md_sha":"1843b8b7a56cc1750c5c56f9c2d23bac3ce4fd61","skill_md_path":"skills/risingwave-best-practices/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/risingwavelabs/agent-skills/tree/main/skills/risingwave-best-practices"},"layout":"multi","source":"github","category":"agent-skills","frontmatter":{"name":"risingwave-best-practices","license":"Apache-2.0","description":"Use when designing RisingWave schemas, writing materialized views, configuring sources or sinks, optimizing streaming SQL performance, troubleshooting slow backfills, setting up CDC, designing time-windowed aggregations, or reviewing a RisingWave streaming pipeline"},"skills_sh_url":"https://skills.sh/risingwavelabs/agent-skills/risingwave-best-practices"},"updatedAt":"2026-05-18T19:14:16.112Z"}}