• 模拟大数据如何到达Azure的数据仓库


    MS SQL Server 2012 数据库

    一个销售表

    CREATE TABLE [dbo].[tblSale](
        [id] [bigint] IDENTITY(1,1) NOT NULL,
        [prod_id] [bigint] NOT NULL,
        [user_id] [bigint] NOT NULL,
        [cnt] [int] NOT NULL,
        [total_price] [decimal](18, 2) NOT NULL,
        [date] [datetime] NOT NULL,
     CONSTRAINT [PK_tblSale] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    ))

    ,用while循环,insert 6万条测试记录,用时2分56秒, 但返回一个Error creating window handle 

    declare @i  int 
           set @i=1
           while @i <= @RecordCnt
           begin 
             insert into [tblSale](prod_id,user_id,cnt,total_price,date)
              values(@i,@i,1,@i,@saleDate)
             select @i
             set @i =@i+1
           end  

    这个应该是SSME客户端问题

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/aeae8dc8-f45f-44df-881b-fa9d57948bde/an-error-occurred-while-executing-batch-error-message-is-error-creating-window-handle-sql-server

    In SQL Management studio,  set results to text.  Tools-->Options-->Query Results-->
    
    Sqlserver-->Results to Text   or click on icon  Results to Text.

     但是这样改, insert的速度好像变慢了, 8分钟才insert了4万条,按这个速度(2分钟1万条),一个2000万条记录的销售表,从本地复制到云端的Azure数据库要2000*2/60/24=2.8天, 不能用这个方法来写大数据

     参考这篇文章,https://www.cnblogs.com/fishparadise/p/4809014.html, 用bcp 导出数据,40万条数据只需要1秒

    bcp [taobao].[dbo].[tblSale] out tblsale.txt -c -T -S .\SQLEXPRESS
    已成功将 1000 行大容量复制到主文件。总共接收到: 398000
    已成功将 1000 行大容量复制到主文件。总共接收到: 399000
    已成功将 1000 行大容量复制到主文件。总共接收到: 400000
    
    400528 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total     : 967    Average : (414196.47 rows per sec.)

     改成导入数据 ,速度会慢一点,27万/秒

    bcp [taobao].[dbo].[tblSale_in] in tblsale.txt -c -T -S .\SQLEXPRESS
    已向 SQL Server 发送了 1000 行。总共发送了: 397000
    已向 SQL Server 发送了 1000 行。总共发送了: 398000
    已向 SQL Server 发送了 1000 行。总共发送了: 399000
    已向 SQL Server 发送了 1000 行。总共发送了: 400000
    
    400528 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total     : 1482   Average : (270261.81 rows per sec.)

     bcp 导入时,碰到自动增长的ID列,会自动替换成最新的ID,不会用txt文本里的ID, 如果txt文件里有空白的空行, bcp导入时就会提示遇到EOF

    bcp [taobao].[dbo].[tblSale_in] in tblsale.txt -c -T -S .\SQLEXPRESS  -b 10000

    -b10000 可以指定多少行作为一个事物提交,这样能有效减少日志的大小

    看看一个按日期分组查询的性能

    --500w数据分组要3秒,680w数据要5秒
    SELECT Convert(varchar(8) , date, 112) as date,count(*) as dayCnt
      FROM [taobao].[dbo].[tblSale] group by Convert(varchar(8) , date, 112) 
      order by  Convert(varchar(8) , date, 112) 

     在编辑导出导入的txt数据时,发现用SSME和VS.net 针对大数据(100多万条)还是有问题(经常out of memeory)

    =======================什么时候用表分区,知乎看到的文章=================================

    先考虑表分区 ;然后考虑分表 ;然后考虑分库。
    
    这个题目是我所经历过的,我做的是GPS应用,早期版本就是选用的关系型数据库Sql Server。当时我选取的方案就是第一种:表分区。 
    表分区的优势是,如果表结构合理,可以不涉及到程序修改。也就是说,对程序来讲依然是单表读写的效果! 所有轨迹数据存入到一个巨大的表里。有多大呢? 最大存储量超过10亿行。具体数值应该是12亿多点,由于系统设计为只存储30天轨迹,所以线上期间最大存储只到这个数,再后来采用云架构,
    上云替换成非关系性数据库,获得了更高的写入性能和存储压缩能力。 每日写入量就超过1500万行。上下班交通高峰时候每秒写入量平均超过500行。也就是500iops,距离系统设计的压测指标3000还有一大截 这张大型单表设计要点:(一个聚集索引用于写入,一个联合索引用于查询,没有主键,使用表分区) 明确主键用途: 真的需要查询单行数据时候才需要主键! 我采用无主键设计,用于避免写入时候浪费维护插入数据的性能。最早使用聚集的类似自增的id主键,压测写入超过5亿行的时候,写入性能缩减一半 准确适用聚集: 写入的数据在硬盘物理顺序上是追加,而不是插入! 我把时间戳字段设置为聚集索引,用于聚集写入目的设计。保证硬盘上的物理写入顺序,不浪费性能用于插入数据 职责足够单一: 用于精准索引! 使用时间
    +设备联合索引,保证这张表只有一个查询用途。保证系统只有一种查询目的:按照设备号,查询一个时间段的数据。 精确的表分区: 要求查询时候限定最大量或者最大取值范围! 按天进行表分区,实现大数据量下的高效查询。这里是本文重点,按照聚集索引进行,可以让目标数据局限在更小的范围进行,
    虽然单表数据上亿,但是查询基本上只在某一天的的几千万里进行索引查询 每张表会有各自的特点,不可生搬硬套,总结下我这张表的特点: 只增,不删,不改! 关于不删除中:每天使用作业删除超过30天的那个分区数据除外,因为要清空旧的表分区,腾出新的表分区! 只有一个业务查询:只按照设备编码查询某个时间段 只有一个运维删除:删除旧的分区数据

    只有一块盘的话,分区不会比索引提升很多

  • 相关阅读:
    工作实战之项目常用技术
    Thymeleaf的错误解决方式
    实用小demo
    idea常用的几个插件
    idea2019+Plugins中搜索不到任何插件解决办法
    git的初体验
    springboot2.+的整合log4j2错误解决浅谈
    MobaXterm百度网盘下载
    阿里云RDS云数据库连接步骤
    读源码学编程之——死循环妙用
  • 原文地址:https://www.cnblogs.com/zitjubiz/p/16179813.html
Copyright © 2020-2023  润新知