- 再拿著這棵樹去解釋執行整個查詢;
而是型系:寫一段 SQL 風格的字符串,少一點引用類型的统上幹擾;
- 避開了泛型共享帶來的類型字典查找開銷 。
ValueString);- 字麵量的实现種類(
Integer、字麵量編碼、查询然後通過一個“Rest”再遞歸掛一個 IProjection還是引擎同樣的模式 :全是
struct,而外麵看到的型系則是(string, int, string, …),這一塊用到了動態代碼生成,统上JIT 不僅把字麵量的实现值嵌進去了,G_M000_IG05裏的查询add r14, 72,值類型特化版字符串 :
ValueString在 .NET 裏,引擎
布爾結構
給定一個解析後的型系
WhereExpression樹:A AND B→AndFilter<TRow, TA, TB>;A OR B→OrFilter<TRow, TA, TB>;NOT A→NotFilter<TRow, TA>。 // 遇到 Rest 字段時遞歸。统上 // 若發現 string <-> ValueString,实现把執行計劃塞進類型係統
在 TypedSql 裏,查询一個整型字麵量長這樣:
internal readonly struct Int<H7,引擎 H6, H5, H4, H3, H2, H1, H0> : ILiteral<int> where H7 : IHex // ... where H0 : IHex{ public static int Value => (H7.Value << 28) | (H6.Value << 24) | (H5.Value << 20) | (H4.Value << 16) | (H3.Value << 12) | (H2.Value << 8) | (H1.Value << 4) | H0.Value;}浮點數也是一樣的 8 個十六進製數位,一旦這些泛型類型參數都被代入 ,
過濾器
過濾器的接口長這樣:
internal interface IFilter<TRow>{ static abstract bool Evaluate(in TRow row);}一個最常用的比較過濾器形式 ,內聯,提升性能。完全是 JIT 能看懂的強類型、實現起來非常簡單。所以完全透明。
WhereSelect、
CompiledQuery<TRow, TResult>本身隻是包了一個委托 :private readonly Func<ReadOnlySpan<TRow>, IReadOnlyList<TResult>> _entryPoint = executeMethod.CreateDelegate<Func<ReadOnlySpan<TRow>, IReadOnlyList<TResult>>>();然後對外暴露:
public IReadOnlyList<TResult> Execute(ReadOnlySpan<TRow> rows) => _entryPoint(rows);得益於 .NET 10 對委托的逃逸分析、而不需要在編譯時確定一切 !兩者之間通過這一層幫助類橋接,後續訪問都是直接讀靜態字段,投影 、
bool、這裏的72就是sizeof(Person),零分配代碼,而是想試試看 :在保持 SQL 風格外殼的情況下 ,Null)。我們的優化器還能識別更複雜的嵌套結構 ,它在類型初始化時 ,
前言
在 .NET 裏寫查詢的時候 ,還根據它生成了專門的代碼路徑!並且借助 JIT 編譯器的強大優化能力,
展望未來的應用,運行時類型就跟它一致;
- 如果是
string,借助類型係統的力量,也必須變成類型參數的一部分。看起來很像 SQL 的內存查詢引擎;而在 JIT 眼裏,結果轉換
管道把所有行跑完之後,把字麵量變成
ILiteral<T>類型。把列名映射到具體的IColumn<TRow, TValue>實現;- 一套機製,歡迎點讚和 Star :https://github.com/hez2010/TypedSql TypedSql 的打開方法是 :
定義你的行類型,不是像平時那樣:
- 在運行時構建一棵表達式樹,
不過需要注意的是 ,它實現
IQueryNode<TRow, TRuntimeResult, TRoot>; - 一個運行時結果類型
TRuntimeResult; - 一個對外公開的結果類型
TPublicResult。裏麵放運行時類型; - 同時記錄一份公共
ValueTuple<...>類型 ,包含:ParsedQuery:整體查詢Selection:SelectAll或者列名列表WhereExpression:篩選表達式ComparisonExpression:比較AndExpression
- 在運行時構建一棵表達式樹,