时序数据库 .NET 操作 QuestDb

新请升级 5.1.2.8 以上版本

修复了 并发下报错 SqlSugarScope 5.1.3.1

缺点:

用户使用下来都夸性能强大,虽然性能强大,但是使用下来有几个小问题

1、不支持删操作 (只能truncatetable 或者删除分区)

2、程序里面尽量不要修改表结构和truncate drop操作这样容易锁表(右边菜单有解锁方案)

表建好了就尽量不要去改他了,CodeFirst只执行一次就行了  

修改表结构后最好重启服务,不然会出现LOCK TABLE问题,更多解决方案 看右边菜单【常见错误】

QuestDb 数据库

QuestDb 性能最强的时序库,适合物联网、金融大数据,数据日志等 ,也是2021年Github增速最快的数据库

image.png


适合历史数据和数据聚合统计 比如金融软件,支持Window和Linux

 

在线测试

测试网址 https://demo.questdb.io/

//测试用例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'

 

安装SqlSugar预览版

SqlSugarCore 5.1.1-preview09


连接字符串

host=localhost;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;
//数据库固定的


代码

 DbType = DbType.QuestDB


源码DEMO

image.png


创建索引

  //索引特性可以多个字段
   [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>();


创建分表

如果数据超过十亿或者更多,我们需分表存储性能更佳

//无需自动分表特性 只需要在分表字段上加上 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标识的表说明你创建成功了和正常表一样使用,存储时是按时间分开存储的全自动的

image.png



批量插入性能优化

//数据量大并发高参数化插入性能更好 100万 20秒左右
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();//我们可以用控制台测试 一万并发只只是短时间爆发完全没有没问题


绿色数据库下载

加群 :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

文档:SqlSugar5.0