V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Afar
V2EX  ›  SQL Server

SQLServer 特定场景优化问题

  •  
  •   Afar · 2022-03-09 13:09:04 +08:00 · 2516 次点击
    这是一个创建于 988 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用场景: 车间内 142 台 PC ,通过配置 ODBC ,执行插入数据到局域网内服务器上的 SQLServer 数据库,频率为每 10 秒一次。 每台 PC 对应服务器中的一个数据库,共 142 个数据库,每个库有 18 张表,单表最大字段 780 个。

    车间 PC 操作系统为 Win7/XP,内存为 4G 。 服务器配置为 Xeon Gold 5218 ,内存 128G ,SQLServer 版本为 2019 社区版,默认安装默认配置。

    异常现象: 偶尔会出现数据插入异常,PC 端报数据库写表失败。

    可能问题:

    1. 网络问题。
    2. 插入数据量过大,插入频率过大。
    3. SQLServer 数据库优化不足,升级为专业版或优化数据库参数配置。
    4. 其它问题。

    麻烦各位大佬,给些建议或者指导,非常感谢。

    25 条回复    2022-03-23 09:31:19 +08:00
    Afar
        1
    Afar  
    OP
       2022-03-09 13:20:08 +08:00
    liprais
        2
    liprais  
       2022-03-09 13:24:36 +08:00
    典型的生产者消费者场景
    整个 kafka 或者 mq 完事
    DollarKiller
        3
    DollarKiller  
       2022-03-09 13:35:40 +08:00
    这种场景典型上时序数据库呀
    zzlhr
        4
    zzlhr  
       2022-03-09 13:40:20 +08:00
    1.网络问题可能性不大,排查方法就是找一台失败的电脑连续 ping ,到出现失败查看是否丢包
    2. 这个有可能,但是概率不大,原因可能是插入是锁表,看下是不是业务上使用触发器之类的,频繁写操作的表尽量避免使用触发器
    3. 免费版 cpu 限制 4 核,还有内存限制的都很小,你这服务器配置性能完全没有发货。
    4. 上述排除完毕之后还有问题就 使用 sqlserver 自带的分析工具 Sql Server Profiler 挺好用,也很简单
    paradoxs
        5
    paradoxs  
       2022-03-09 14:06:59 +08:00
    发到 MQ 上,慢慢拉
    c6h6benzene
        6
    c6h6benzene  
       2022-03-09 14:09:52 +08:00 via iPhone
    Service Broker 丢队列里慢慢消费?
    Afar
        7
    Afar  
    OP
       2022-03-09 14:23:41 +08:00
    @liprais @DollarKiller PC 端软件是日本人写的,已经不可能更改了。
    @zzlhr 非常感谢。SQL Server Profiler 能监测到远程客户端插入失败的情况么?我打开看了看,好像都是成功的日志。
    Afar
        8
    Afar  
    OP
       2022-03-09 14:46:53 +08:00
    @paradoxs @c6h6benzene 如果能本地数据库转 MQ ,推送到服务器端的 Broker 上最好了。但是这样又需要去每台机器上配置部署,同时增加了 PC 端负担。
    Itoktsnhc
        9
    Itoktsnhc  
       2022-03-09 15:02:33 +08:00
    架构不调整的话首先该做的是对 SQL Server 以及所在机器的状态做一个监控,结合客户端报错的时间看指标,比如 CPU 情况,内存情况,网络流量情况,数据库连接数,是否存在死锁这些
    mingl0280
        10
    mingl0280  
       2022-03-09 15:50:02 +08:00 via Android
    2 和 3 完全不可能,高度怀疑是 ODBC 插入代码有问题。
    PopRain
        11
    PopRain  
       2022-03-09 16:20:19 +08:00
    社区版你就算有 128G 内存,它也只会用 1G 内存(数据库文件 MAX 10G)。。。。你建这么多数据库,本身就耗费缓存内存,缓存要不停交换到硬盘肯定影响插入效率,如果可以改,最好不要超过 10 个数据库

    另外,可以先装个开发版试试(免费 180 天),如果没有问题,预算有限可以买个 WEB 版(max 64G),话说这么“豪华”的服务器都买了,舍不得买个标准版的数据库。。。。 如果这样,为什么不用 postgresql 呢?
    PopRain
        12
    PopRain  
       2022-03-09 16:31:08 +08:00
    补充一下,如果客户端可以配置连接端口的话,是不是可以测试一下多安装几个实例,监听不同端口,这个不知道微软是否限制为共享 1G 内存,还是各自 1G
    Afar
        13
    Afar  
    OP
       2022-03-09 16:37:43 +08:00
    @PopRain @mingl0280 @Itoktsnhc 现在是 SQLServer 2019 Express Edition ,升级成标准版或企业版的话,数据库性能上会不会有明显提升?感谢
    Afar
        14
    Afar  
    OP
       2022-03-09 16:39:29 +08:00
    PC 客户端是 WIN7/XP ,只能通过 ODBC 到服务器数据库,服务器端是 Windows Server 2016 ,如何实现多实例呢? VMware 么?
    kiracyan
        15
    kiracyan  
       2022-03-09 16:49:36 +08:00
    你的社区版确定没阉割吗?
    Afar
        16
    Afar  
    OP
       2022-03-09 17:09:31 +08:00
    @kiracyan 我也看不来有没有阉割,这是 select @@version 查询出来的

    Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 16299: )
    adoal
        17
    adoal  
       2022-03-09 17:36:08 +08:00 via iPhone
    “数据插入异常”时的具体表现是什么,服务器返回的错误码?客户端抛出的异常?日志里的记录?如果什么都没有,那不好猜。
    PrinceofInj
        18
    PrinceofInj  
       2022-03-09 18:26:09 +08:00
    @Afar 直接新安装一个数据库,选评估版就行了。企业版的功能,180 天评估器,足够排查了吧。继续运行安装程序,选命名实例就是多实例了。
    netnr
        19
    netnr  
       2022-03-09 18:53:51 +08:00 via Android
    判决大概率是版本问题,先换一个开发版观察是否依然出现问题,EE 版本限性能和大小
    换个思路分析,142 台每 10 秒写入同一个数据库也顶得住
    kiracyan
        20
    kiracyan  
       2022-03-09 19:41:41 +08:00
    @Afar 建议升级企业版 我之前公司上千台写入都没什么问题 服务器的系统版本时 win server 吗 我看你信息是 win10 版本的
    PopRain
        21
    PopRain  
       2022-03-09 20:48:53 +08:00
    @Afar SQL SERVER express 最大只能用 1G 内存,你还开了这么多 database , 你可以安装一个开发版测试一下,我觉得肯定有改善,你这个数据量对 SQL server 来说不算什么。
    qile1
        22
    qile1  
       2022-03-10 01:08:45 +08:00 via Android
    把服务器虚拟化成多个系统,每个系统安装 sql server
    zzlhr
        23
    zzlhr  
       2022-03-10 14:44:13 +08:00
    如果超市 SQL Server Profiler 应该是监测不到的,但是你可以看成功的执行时间是多久,如果排队会出现很多执行时间很长的 sql ,而且目前看来很明确是版本问题了。sqlserver 缓存池跟用户量和数据库大小,运行时间都有直接联系,缓存池都是在内存里,楼上说了限制 1g 我不知道准确不,没仔细看,但是就算不是也不会超过 4g ,就你这个使用情况内存是不够的
    PopRain
        24
    PopRain  
       2022-03-22 14:11:11 +08:00
    楼主最后把结果告诉大家一下
    Afar
        25
    Afar  
    OP
       2022-03-23 09:31:19 +08:00
    @PopRain
    谢谢各位。
    由于是生产车间,且设备数量较多,稳妥起见,两个方案同步进行。
    1. 将 Express 版本升级到企业版。
    2. 数据插入频率由 10s 改为 60s 。
    更改后,报警数量明显减少,但是很遗憾,没有找到具体原因。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:45 · PVG 20:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.