[{"data":1,"prerenderedAt":377},["ShallowReactive",2],{"project-39207570":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":45,"post_text":47,"what":48,"said":91,"maker_in_thread":182,"shape":192,"grid":196,"attempts":338,"same_week":339,"maker_shows":33,"maker_hidden":369,"reader_version":370,"card":371},"39207570","Stanchion","Column-oriented tables in SQLite","title","Show HN: Stanchion – Column-oriented tables in SQLite","https:\u002F\u002Fgithub.com\u002Fdgllghr\u002Fstanchion","github.com","dgllghr",1706726333,2024,273,60,249,3515,8,"legend","data","embedded columnar storage","library",[24,25,26,27],"sqlite extension","column-oriented","embedded analytics","sqlite columnar storage","mixed",0.139,{"positive":31,"neutral":32,"mixed":33,"critical":34},7,9,1,4,21,{"idea":37,"design":39,"performance":40,"docs":42,"execution":44},{"positive":38,"critical":38},2,{"positive":33,"critical":33},{"positive":41,"critical":33},3,{"positive":43,"critical":43},0,{"positive":33,"critical":43},[46,43,46,41,33,43,33,43,43,43,41,41,43,46,43,43,43,46,33,46,43,43,43,41,43,43,43,43,43,43,43,33,43,43,41,41,43,46,43,41],5,"Hello HN!\n\nI built stanchion to scratch my own itch. I have personal applications running on SQLite where I want to store log and metric data (basically forever) but don't want to add complexity by bringing in a new database or whole separate server. Some of these applications are running on a Raspberry Pi, where storage and compute are limited, but I still want data warehouse like capabilities.\n\nI envision stanchion being used in similar scenarios: on phones and resource-limited devices in applications that are already using SQLite. I know that there are alternatives like DuckDB (which is ver",{"problem":49,"audience":55,"pricing":59,"motivation":60,"time_to_build":59,"stack":64,"openness":88,"stage":89,"team_size":90},{"value":50,"source":51,"evidence":52},"Analytical queries and long-term log\u002Fmetric storage in SQLite without adding a separate database.","maker",[53],{"id":54},"post",{"value":56,"source":51,"evidence":57},"Developers with personal or embedded apps already using SQLite, including on Raspberry Pi and phones.",[58],{"id":54},null,{"value":61,"source":51,"evidence":62},"Author wanted column-oriented analytics in SQLite for personal apps without adding a new database or server.",[63],{"id":54},[65,77],{"value":66,"source":67,"evidence":68},"Zig","commenter",[69,73],{"id":70,"by":71,"text":72},"39219897","alexgarcia-xyz","This is an awesome project, I love SQLite extensions and I think they have a ton of use. Giants props to Dan here, I haven't seen many SQLite extensions written in Zig, and I'm…",{"id":74,"by":75,"text":76},"39226591","ngrilly","Great example of Zig code, and of seamless interaction with C!",{"value":78,"source":67,"evidence":79},"C (SQLite)",[80,84],{"id":81,"by":82,"text":83},"39219783","Iridescent_","As far as I can tell, the linked github repository is written only in C. Zig is used only as build system EDIT: nvm, the github stats seem to be completely wrong? It shows 96% C…",{"id":85,"by":86,"text":87},"39219947","lr1970","Yes, this is because it includes SQlite source (in C) that dwarfs the size of columnar storage extension (in Zig).","open_source","beta","unknown",{"praise":92,"objections":109,"requests":132,"questions":147,"alternatives":162},[93,98],{"value":94,"source":67,"evidence":95},"Good Zig and C interop example; useful SQLite extension work",[96,97],{"id":74,"by":75,"text":76},{"id":70,"by":71,"text":72},{"value":99,"source":67,"evidence":100},"Embedded columnar analytics is a welcome trend",[101,105],{"id":102,"by":103,"text":104},"39219531","datadrivenangel","I'm excited to see how this compares to DuckDB. More local\u002Fembedded analytics databases will be good for the industry.",{"id":106,"by":107,"text":108},"39223078","tbragin","Interesting project! Thank you for open sourcing and sharing. Agree that local and embedded analytics are an increasing trend, I see it too. A couple of questions: * I’m curious…",[110,118,125],{"value":111,"source":67,"evidence":112},"SQLite virtual table API limits analytical query speed, e.g. COUNT(*) full scans",[113,114],{"id":70,"by":71,"text":72},{"id":115,"by":116,"text":117},"39226451","ncruces","I may be missing something, but I'm not sure you need to detect COUNT(*) specifically. For a query that's just SELECT COUNT(*) FROM… SQLite will just iteratively call xNext\u002FxEof…",{"value":119,"source":67,"evidence":120},"Plugin toolchain fragmentation when mixing languages with SQLite",[121],{"id":122,"by":123,"text":124},"39225157","vincent-manis","This sounds like an excellent project, and I hope it continues to a production release. I do have one qualm, though. SQLite is written in C, and if I were writing plugins for it,…",{"value":126,"source":67,"evidence":127},"LGPL license may deter users compared with SQLite's public domain",[128],{"id":129,"by":130,"text":131},"39225156","skissane","Question: Why do you choose LGPL-3.0? For many, one of the most attractive features of SQLite is its license (or should I say lack thereof). I realise some people view public…",[133,140],{"value":134,"source":67,"evidence":135},"Benchmarks against DuckDB or chDB and ClickBench results",[136,137],{"id":106,"by":107,"text":108},{"id":138,"by":11,"text":139},"39221264","DuckDB is great! But row-oriented storage is also great for many use cases. My goal is to provide a way for people to have access to the benefits of column-oriented storage…",{"value":141,"source":67,"evidence":142},"Compression support such as RLE and zstd",[143],{"id":144,"by":145,"text":146},"39222152","thecowgoes","Can't wait to see compression! Any timeline for that?",[148,155],{"value":149,"source":67,"evidence":150},"How the extension works under the hood",[151],{"id":152,"by":153,"text":154},"39224878","devdiary","Can you ELI5, how did you make this possible? I see the readme asking to download a binary and then also mentioning sqlite extension. I have never had exp with sqlite ext, so not…",{"value":156,"source":67,"evidence":157},"Whether row and column roles could be swapped",[158],{"id":159,"by":160,"text":161},"39222325","m1sta_","Is there any value in just treating rows as columns and vice versa?",[163,171,175],{"value":164,"source":67,"evidence":165},"DuckDB",[166,170],{"id":167,"by":168,"text":169},"39220033","jitl","Note that DuckDB can ingest SQLite tables. If you need OLAP on your SQLite system today instead of whenever this is stable, consider pairing up DuckDB. In the simplest case if…",{"id":70,"by":71,"text":72},{"value":172,"source":67,"evidence":173},"chDB \u002F clickhouse-local",[174],{"id":106,"by":107,"text":108},{"value":176,"source":67,"evidence":177},"Parquet and Apache Arrow",[178],{"id":179,"by":180,"text":181},"39221070","thamer","The \"Data Storage Internals\" section[1] of the README sounds to me like it has its own column-oriented format for these tables, at least that's how I'm reading the part about…",{"comments":183,"answered":46,"key":184},10,[185,188,191],{"id":186,"text":187},"39221203","Thanks for the kind words, Alex! You have probably written more great sqlite extensions than anyone, so your feedback is very meaningful. You are right that there are…",{"id":189,"text":190},"39224052","That is a great trick for COUNT(*), thank you! That's disappointing about xFindFunction. Once I start digging into it more, I will let you know if I find any other clever tricks…",{"id":138,"text":139},{"commenters":193,"max_depth":31,"maker_replies":183,"first_comment_mins":194,"lifespan_hours":195},35,1442,50,[197,199,203,207,209,211,212,215,217,219,221,225,227,230,231,234,236,237,239,242,245,248,250,253,256,259,262,265,268,270,273,274,275,278,280,283,285,288,291,293,296,299,301,303,305,308,310,313,316,318,319,322,324,326,329,331,333,336],[70,43,46,198,71,43],"project\u002Fpositive\u002Fidea",[200,43,43,201,202,43],"39220353","commenter\u002Fneutral\u002Fnone","zzo38computer",[204,43,46,205,206,43],"39220938","project\u002Fpositive\u002Fdesign","jerrysievert",[186,43,43,208,11,33],"project\u002Fneutral\u002Fperformance",[210,43,41,208,71,43],"39222266",[189,43,43,201,11,33],[213,43,33,214,116,43],"39233933","project\u002Fcritical\u002Fperformance",[115,43,43,216,116,43],"commenter\u002Fneutral\u002Fperformance",[159,43,41,218,160,43],"project\u002Fneutral\u002Fidea",[167,33,33,220,168,43],"project\u002Fcritical\u002Fidea",[222,33,43,223,224,43],"39220721","other\u002Fneutral\u002Fnone","chrisjc",[226,33,43,201,168,43],"39221068",[228,33,43,216,229,43],"39228370","hantusk",[138,33,43,198,11,33],[232,33,41,233,168,43],"39223712","project\u002Fmixed\u002Fidea",[235,33,43,201,11,33],"39224064",[106,38,41,208,107,43],[238,38,43,208,11,33],"39223971",[240,38,46,241,116,43],"39226892","project\u002Fpositive\u002Fperformance",[243,41,43,223,244,43],"39220305","breadchris",[246,41,43,223,247,43],"39220652","yellowapple",[249,41,43,201,244,43],"39223464",[251,41,43,223,252,43],"39224120","mikepurvis",[254,41,43,223,255,43],"39224611","justinclift",[257,34,46,241,258,43],"39224065","hifikuno",[260,34,43,223,261,43],"39233128","gregw2",[263,46,33,220,264,43],"39219927","nattaylor",[266,46,41,208,267,43],"39220257","simcop2387",[102,269,46,198,103,43],6,[271,269,43,223,272,43],"39219565","lainga",[81,269,43,223,82,43],[85,269,43,223,86,43],[276,269,43,277,11,33],"39221438","project\u002Fneutral\u002Fdocs",[279,269,41,277,255,43],"39224660",[281,269,43,282,11,33],"39232271","commenter\u002Fneutral\u002Fdocs",[284,269,43,282,255,43],"39233720",[286,269,43,223,287,43],"39219807","BiteCode_dev",[289,269,43,223,290,43],"39219904","speedgoose",[292,269,43,201,287,43],"39220342",[294,269,43,223,295,43],"39221050","remram",[297,269,43,223,298,43],"39219935","orlp",[300,269,43,223,168,43],"39220050",[302,269,43,201,287,43],"39220352",[304,31,43,223,290,43],"39219884",[306,31,43,223,307,43],"39219934","conradev",[122,18,33,309,123,43],"project\u002Fcritical\u002Fdesign",[311,32,43,223,312,43],"39221397","didgetmaster",[314,32,43,223,315,43],"39223705","lukevp",[317,32,43,223,312,43],"39224769",[152,183,41,218,153,43],[320,183,43,321,11,33],"39232083","project\u002Fneutral\u002Fdesign",[179,323,41,321,180,43],11,[325,323,43,321,11,33],"39221404",[74,327,46,328,75,43],12,"project\u002Fpositive\u002Fexecution",[144,330,46,241,145,43],13,[332,330,43,208,11,33],"39224012",[129,334,41,335,130,43],14,"project\u002Fneutral\u002Fnone",[337,334,41,335,116,43],"39234382",[],[340,345,350,355,360,365],{"id":341,"name":342,"points":343,"category":344},"39180953","Boardzilla",574,"languages",{"id":346,"name":347,"points":348,"category":349},"39159418","Pong Wars",490,"games",{"id":351,"name":352,"points":353,"category":354},"39191870","Ubicloud",475,"infrastructure",{"id":356,"name":357,"points":358,"category":359},"39148336","PlatoEdu",289,"learning_science",{"id":361,"name":362,"points":363,"category":364},"39201182","gpt",280,"ai",{"id":366,"name":367,"points":368,"category":364},"39176570","WhisperFusion",272,false,"v2",{"id":372,"name":5,"line":6,"ai":369,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":373,"top":18,"kw":374,"maker":11,"domain":10,"tier":19,"attempts":43,"strip":375,"url":9,"mix":376,"praise":94,"objection":111,"sub":21},39207570,0.14,[24,25,26,27],"5053101000330500051500030000000100330503",[31,32,33,34],1794036649023]