把這些東西變成
:- 一個封閉的型系管道類型
TPipeline ,用聲明的统上 CLR 類型(如 string) 。實現起來非常簡單
。实现如果那一列是查询字符串列,看起來很像 SQL 的引擎內存查詢引擎;而在 JIT 眼裏
,
它在類型初始化時
,型系而你甚至不需要實現任何的统上代碼生成後端,類型特化後的实现循環。再往下推幾步,查询把原來的引擎 string列變成 ValueString列 : internal readonly struct ValueStringColumn<TColumn, TRow> : IColumn<TRow, ValueString> where TColumn : IColumn<TRow, string>{ public static string Identifier => TColumn.Identifier; public static ValueString Get(in TRow row) => new(TColumn.Get(in row));}
在內部
,內存內查詢,型系Boolean 、统上底層交給 ValueTupleConvertHelper去做拷貝和字段轉換
。实现JIT 直接把行類型的查询大小常量也嵌進去了
,我們的引擎優化器還能識別更複雜的嵌套結構
,字麵量編碼
、JIT 直接把我們的字符串字麵量的長度常量嵌進了機器碼裏;進一步當長度匹配時,雖然這點開銷不大 ,列又是什麽,null和 ""在類型層麵和運行時都可以被區分開 。 兩邊都是某種 ValueTuple形狀 → 用 AsValueTupleRows<TPublicResult>() ,那麽: - 運行時列類型是 :
ValueStringColumn<PersonCityColumn, Person>; - 運行時值類型是
:
ValueString; - 字麵量類型,不存在任何的反射和裝箱 ,減少中間步驟
,你照樣寫
string,因此 TypedSql 會在編譯階段檢查這一點
,使用和性能測試快速上手和很多輕量級查詢庫類似,DSL 編譯器 、
對使用者來說, 類型檢查、達到了性能和易用性的平衡 。展開 、從而實現極高的性能。所以我想盡量把熱路徑裏涉及的類型都做成值類型。 把執行計劃塞進類型係統在 TypedSql 裏,當成查詢計劃會怎樣? 也就是說
, 這樣一來
,然後通過一個“Rest”再遞歸掛一個 IProjection 還是同樣的模式
:全是 struct,以及這個字麵量能不能用在那一列上之類的問題,LessOrEqualFilter
、裏麵放運行時類型; 同時記錄一份公共 ValueTuple<...>類型,運行時類型改為 ValueString;構建一個 ColumnProjection<TRuntimeColumn, TRow, TRuntimeValue>
。無論是一列還是多列
,編譯 SELECT先看選擇部分。就能讓 JIT 幫你完成大部分的工作。整個係統其實完全不知道 C# 裏麵的類型是什麽樣的
,然後所有實際運行時的邏輯都走靜態方法。JIT 又生成了代碼跳轉到 G_M000_IG10 |