优化器直方图
This commit is contained in:
1 parent
7d96933e32
commit
d59e65b639
17 files changed
+353
-49
No files matched your search
@@ -319,7 +319,7 @@ exprTables expr = case expr of
|
||||
-- | 两侧都取表名
|
||||
both a b = exprTables a ++ exprTables b
|
||||
|
||||
-- | 一张表的线上信息(内存实现:没有索引,统计现算)
|
||||
-- | 一张表的线上信息(内存实现:没有索引,统计与直方图现算)
|
||||
tableInfoOf :: (String, Table) -> TableInfo
|
||||
tableInfoOf (name, tbl) =
|
||||
TableInfo
|
||||
@@ -328,10 +328,14 @@ tableInfoOf (name, tbl) =
|
||||
, tiRows = length (tableRows tbl)
|
||||
, tiIndexes = []
|
||||
, tiStats = [(c, distinctOf c, False) | (c, _) <- tableCols tbl]
|
||||
, tiHistograms = [(c, h) | (c, _) <- tableCols tbl, Just h <- [histogramOf (columnValues c)]]
|
||||
}
|
||||
where
|
||||
-- | 一列的所有值
|
||||
columnValues c = [v | r <- tableRows tbl, Just v <- [lookup c r]]
|
||||
|
||||
-- | 一列的不同值个数
|
||||
distinctOf c = length (nub [v | r <- tableRows tbl, Just v <- [lookup c r]])
|
||||
distinctOf c = length (nub (columnValues c))
|
||||
|
||||
-- | 本地列类型转线上字符串(和 IPC 那边同一套写法)
|
||||
wireType :: Column -> String
|
||||
|
||||
@@ -6,13 +6,14 @@ module Main (main) where
|
||||
import ChuSQL.Core.Engine.Storage.IPC (
|
||||
Account (..),
|
||||
Request (ReqAccountReset),
|
||||
TableInfo (..),
|
||||
closeConnection,
|
||||
localStorageLink,
|
||||
setStorageLink,
|
||||
)
|
||||
import ChuSQL.Core.Engine.Syntax.AST (Statement)
|
||||
import ChuSQL.Core.Engine.Syntax.Parser (parseStatement)
|
||||
import ChuSQL.Core.Model (Database, Row, Table (..), Value (..), pattern TInt, pattern TStr)
|
||||
import ChuSQL.Core.Model (Database, Histogram (..), Row, Table (..), Value (..), pattern TInt, pattern TStr)
|
||||
import ChuSQL.Interface.Auth (hashPasswordWith)
|
||||
import ChuSQL.Interface.Protocol (ClientRequest (..), Grant (..), RoleView (..), ServerResponse (..), decodeRequest, encodeResponse)
|
||||
import ChuSQL.Interface.RateLimit (newRateLimiter)
|
||||
@@ -307,6 +308,21 @@ tcpSpec = do
|
||||
asBool (at "truncated" value) `shouldBe` False
|
||||
asText (at "database" value) `shouldBe` "test"
|
||||
|
||||
describe "memory backend: catalog statistics" $ do
|
||||
it "reports a histogram for a numeric column" $ do
|
||||
db <- newMVar testDb
|
||||
let backend = memoryBackend testDatabaseName db
|
||||
infos <- beCatalog backend
|
||||
case infos of
|
||||
Left err -> expectationFailure err
|
||||
Right tables -> case [i | i <- tables, tiTable i == "users"] of
|
||||
[] -> expectationFailure "the catalog is missing the users table"
|
||||
(info : _) -> do
|
||||
fmap histLow (lookup "id" (tiHistograms info)) `shouldBe` Just 1
|
||||
fmap histHigh (lookup "id" (tiHistograms info)) `shouldBe` Just 5
|
||||
fmap (sum . histBuckets) (lookup "id" (tiHistograms info)) `shouldBe` Just 5
|
||||
lookup "name" (tiHistograms info) `shouldBe` Nothing
|
||||
|
||||
describe "server config ([server] in chusql.toml)" $ do
|
||||
it "falls back to the defaults when the file has no server section" $ do
|
||||
path <- tcpConfigPath "server-default"
|
||||
|
||||
Reference in new issue
Block a user