修复了 并发下报错 SqlSugarScope 5.1.3.1
用户使用下来都夸性能强大,虽然性能强大,但是使用下来有几个小问题
1、不支持删操作 (只能truncatetable 或者删除分区)
2、程序里面尽量不要修改表结构和truncate drop操作这样容易锁表(右边菜单有解锁方案)
表建好了就尽量不要去改他了,CodeFirst只执行一次就行了
修改表结构后最好重启服务,不然会出现LOCK TABLE问题,更多解决方案 看右边菜单【常见错误】
QuestDb 性能最强的时序库,适合物联网、金融大数据,数据日志等 ,也是2021年Github增速最快的数据库
适合历史数据和数据聚合统计 比如金融软件,支持Window和Linux
//测试用例1: LIKE 1亿多取一条 用了1秒 select * from pos where id ~ 'OQHFDQTJTJJQEEEZ' //Like //测试用例2:按天分表 所有数据进行汇总 接近2亿数据汇总 用了9秒左右 select sum(price),side from 'trades' where price>100 group by side //测试用例3:按天分表 所有数据进行汇总 接近2亿进行Count 用了2秒 (关系型数据库要20分钟以上) select count(1) from 'trades'
SqlSugarCore 5.1.1-preview09
host=localhost;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading; //数据库固定的
DbType = DbType.QuestDB
//索引特性可以多个字段 [SugarIndex(null, nameof(IndexClass.Name), OrderByType.Asc)] public class IndexClassTest { public int Id { get; set; } //只能是string类型并且 datatype=symbol 其它类型不需要索引 [SugarColumn(ColumnDataType = "symbol")] public string Name { get; set; } } //创建表 db.CodeFirst.InitTables<IndexClassTest>();
和正常的GroupBy用法一样,在SqlSugar中用法没有区别
var list= db.Queryable<Order>() .GroupBy(x => x.Name) .Select(i => new { name = i.Name, count = SqlFunc.AggregateCount(i.Name) }) .ToList();
数据不超过30亿不需要分表30亿内分表意义不大,分表已知问题存在下面几个
1. 插入后不能立马查询出来随机性的,不分表正常,不清楚是否有什么配置
2. 出现过1个客户测试电脑环境经常断电出现过一次数据丢失,不清楚系统问题还是数据库问题(其他时序库也有这种情况)
3. 1个客户出现分表并且表的字段超级多 出现了性能问题 ,时间比较久了也可能是官方修复了
如果数据超过十亿或者更多,我们需分表存储性能更佳
//无需自动分表特性 只需要在分表字段上加上 TimeDbSplitField public class SplitTableEntity { public string Id { get; set; } public string name{get;set;} [TimeDbSplitField(DateType.Day)]//按天分表 public DateTime Ts { get; set; }//只能是时间类型一个字段 } //创建表 db.CodeFirst.InitTables<IndexClassTest>();
创建完带有Day标识的表说明你创建成功了和正常表一样使用,存储时是按时间分开存储的全自动的
请升级到:5.1.4.86-preview07
//用例1:根据1天进行分组统计,比报表查询要好用很多 var list=db.Queryable<UnitSiafayyy>() .SampleBy(1, SampleByUnit.Day)//有字符串重载 .Select(it=>new { Id=SqlFunc.AggregateMin(it.Id), Count=SqlFunc.AggregateCount(it.Id) }) .ToList(); //用例2:统计后过滤 var list=db.Queryable<UnitSiafayyy>() .SampleBy(1, SampleByUnit.Day)//有字符串重载 .Select(it=>new { Id=SqlFunc.AggregateMin(it.Id), Count=SqlFunc.AggregateCount(it.Id) }) .MergeTable().Where(it=>it.Count>1) .ToList(); //ORM建表情况下,创建时间一定要加 分表标记,并且忽略更新 public class UnitSiafayyy { [SugarColumn(IsPrimaryKey = true)] public long Id { get; set; } [TimeDbSplitField(DateType.Year)]//重点2个标签 [SugarColumn(IsOnlyIgnoreUpdate =true)] public DateTime DateTime { get; set; } }
请升级到:5.1.4.86-preview10
分组取最后一条可以多个字段,相当于其他数据库的开窗口函数要弱一些
var list db.Queryable<Users>() .PartitionBy(it=>new {时间戳字段,分组字段1,分组字段1}).ToList();//只能根据时间戳字段取最后一条 //生成的Sql //SELECT * RFOM USERS Lastest on 时间戳字段 Partition By 分组字段1,分组字段1 //ORM建表要注意 [TimeDbSplitField(DateType.Year)]//时间戳字段需标记一下 [SugarColumn(IsOnlyIgnoreUpdate =true)] public DateTime DateTime { get; set; }
//数据量大并发高参数化插入性能更好 100万 15秒左右 db.Insertable<Users>(list).UseParameter().ExecuteCommand(); //这个数据更强大的插入方式还在研究目前这个性完全够用了
在高性能并发情况下并发建议使用异步处理
for (int i = 0; i < 1000; i++) { Task.Run(() => { //因为没事务 db都加上db.CopyNew()这样不用考虑任何线程问题 db.CopyNew().Insertable(updateObjs).ExecuteCommandAsync(); Console.WriteLine(i); }); } Console.ReadKey();//我们可以用控制台测试 几K并发只只是短时间爆发完全没有没问题
加群 :995692596 群文件可以下载,后缀改成Zip
错误:could not open read-only [file=H:\BuleDb\QuestDb\bin\qdbroot\db\booltest511\default\a.d]”
1、重启服务器
2、禁止使用tuncatetable语法和修改表操作,这些表初始化后不要动了
3、上面2个都不行在用C#程序插入一记录 锁就解除了
db.Insertable(new BoolTest511() { Id = 1, dateTime = DateTime.Now, A = true }).ExecuteCommand();
错误: Exception while reading from stream
解决方案:先检查SQL是否正确,在不行就重启服务
https://questdb.io/docs/get-started/docker
2016 © donet5.comApache Licence 2.0