zoukankan      html  css  js  c++  java
  • 一个业务场景的优化讨论

    碰到这样一个业务场景:每个用户订单会有好几个合同文件,其中某些合同文件需要盖章,盖章是有专门的盖章服务完成的,盖章完成后,文件会有一个ID与之匹配。

    关于这样一个业务,研发的同学建了如下这样一张表:

    CREATE TABLE [dbo].[UserFile](
        [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
        ....
        [NeedStamp] [bit] NULL,
        [SealApplyId] [int] NULL
    )

    往里面塞数据的时候,需要盖章的文件:

    INSERT INTO [dbo].[UserFile](...,NeedStamp,SealApplyId)VALUES(...,1,NULL)

    不需要盖章的文件:

    INSERT INTO [dbo].[UserFile](...,NeedStamp,SealApplyId)VALUES(...,0,NULL)

    然后定期抽取需要盖章的文件送去盖章服务:

    SELECT * FROM [dbo].[UserFile] WHERE NeedStamp = 1 AND SealApplyId IS NULL

    盖好章之后呢:

    UPDATE [dbo].[UserFile] SET SealApplyId = @SealApplyId WHERE ID=@ID

    这样的业务跑一段时间之后发现抽取需要盖章的数据查询非常缓慢:

    原因是符合NeedStamp = 1需要盖章的数据非常多,符合SealApplyId IS NULL条件的数据也非常多,虽然符合组合条件NeedStamp = 1 AND SealApplyId IS NULL的数据非常稀少。

    这样即算我以NeedStamp和SealApplyId组合创建索引,查询都不会用到索引。(无论哪个字段放在前面统计信息都不会理想)

    这样的情况下我的解决方案有两种:

    1、简单粗暴的利用hint强制走索引:

    SELECT * FROM [dbo].[UserFile] WITH(INDIX(idx_SealApplyId_NeedStamp)) WHERE NeedStamp = 1 AND SealApplyId IS NULL

    2、重新定义SealApplyId的初始值(或者分表):

    需要盖章的文件SealApplyId初始值定义为0、不需要盖章的文件SealApplyId定义为-1(甚至可以直接分表把不需要盖章的文件放到别的表)。

    由于需要盖章且未盖章的数据即SealApplyId=0的数据会非常少,这样直接在SealApplyId上建一个索引即可了。

    各位大神有什么好的其它方案么?

  • 相关阅读:
    google浏览器切换成中文
    Python 进阶篇
    Linux 命令
    Linux
    Linux
    Linux
    Linux--shell脚本之文本处理工具
    Linux--shell脚本之正则表达式
    Linux
    Linux
  • 原文地址:https://www.cnblogs.com/ajiangg/p/8968636.html
Copyright © 2011-2022 走看看