sql热点
1. sql金融业务指标统计
金融业务指标的SQL统计艺术
信贷业务的脉络,如同一座精密的钟表,由贷前申请、贷中审批到贷后管理,每个环节都与数据紧密相连。关键的表单如授信记录、模型输出和借据表,它们是数据的中枢,驱动着业务指标的实时洞察。本文将通过SQL的魔力,深入解析这些表单,以满足多样化的统计需求。
数据驱动的决策基石
- 核心数据表: 授信记录,记录用户风险评估;模型输出,映射用户风险;借据表,揭示借款与还款情况。这三张表如同业务的骨骼,支撑着每个环节的数据追踪。
统计需求全景
- 申请与授信:洞察流量与批准效率。
- 产品不良指标:在贷余额、不良率,衡量风险程度。
- 逾期类型分布:揭示风险热点和异常行为。
- 用户画像:规则匹配情况,揭示用户行为模式。
- Vintage账龄分析:评估资产风险的演变趋势。
SQL查询的艺术
- 每日动态洞察: 通过SQL,计算平均核额(当日总授信金额/通过人数),并按日期动态追踪五个关键指标,以及贷款余额、还款和逾期行为。
- 产品指标精准计算: 在贷余额、余额不良率和客户不良率,通过分组统计和汇总,揭示产品风险的全貌。
- 逾期类型洞察: 通过窗口函数和标记逾期类型,计算逾期率,揭示风险分布的动态变化。
- 用户画像解析: JSON_EXTRACT技术提取规则命中情况,多维度展现用户行为特征。
- 账龄分析深度解读: 通过 Vintage 分析,每月末观察贷款质量,计算逾期率,揭示资产健康度。
这些SQL查询如同金融业务的智能引擎,将复杂的数据转化为易于理解的指标,助力决策者在瞬息万变的市场环境中保持敏锐的洞察力。当然,所有示例基于模拟数据,实际应用中可能需要根据具体业务场景进行调整。期待你的反馈,共同探讨如何优化和扩展这些统计方法。
2. 如果sql语句已经达到优化,瓶颈在于数据文件的磁盘io,此时可以怎么调整
具体问题具体分析,举例来说明为什么磁盘IO成瓶颈数据库的性能急速下降了。
为什么当磁盘IO成瓶颈之后, 数据库的性能不是达到饱和的平衡状态,而是急剧下降。为什么数据库的性能有非常明显的分界点,原因是什么?
相信大部分做数据库运维的朋友,都遇到这种情况。 数据库在前一天性能表现的相当稳定,数据库的响应时间也很正常,但就在今天,在业务人员反馈业务流量没有任何上升的情况下,数据库的变得不稳定了,有时候一个最简单的insert操作, 需要几十秒,但99%的insert却又可以在几毫秒完成,这又是为什么了?
dba此时心中有无限的疑惑,到底是什么原因呢? 磁盘IO性能变差了?还是业务运维人员反馈的流量压根就不对? 还是数据库内部出问题?昨天不是还好好的吗?
当数据库出现响应时间不稳定的时候,我们在操作系统上会看到磁盘的利用率会比较高,如果观察仔细一点,还可以看到,存在一些读的IO. 数据库服务器如果存在大量的写IO,性能一般都是正常跟稳定的,但只要存在少量的读IO,则性能开始出现抖动,存在大量的读IO时(排除配备非常高速磁盘的机器),对于在线交易的数据库系统来说,大概性能就雪崩了。为什么操作系统上看到的磁盘读IO跟写IO所带来的性能差距这么大呢?
如果亲之前没有注意到上述的现象,亲对上述的结论也是怀疑。但请看下面的分解。
在写这个文章之前,作者阅读了大量跟的IO相关的代码,如异步IO线程的相关的,innodb_buffer池相关的,以及跟读数据块最相关的核心函数buf_page_get_gen函数以及其调用的相关子函数。为了将文章写得通俗点,看起来不那么累,因此不再一行一行的将代码解析写出来。
咱们先来提问题。buf_page_get_gen函数的作用是从Buffer bool里面读数据页,可能存在以下几种情况。
提问. 数据页不在buffer bool 里面该怎么办?
回答:去读文件,将文件中的数据页加载到buffer pool里面。下面是函数buffer_read_page的函数,作用是将物理数据页加载到buffer pool, 图片中显示
buffer_read_page函数栈的顶层是pread64(),调用了操作系统的读函数。
通过解析buf_wait_for_read函数的下层函数,我们知道其实通过首先自旋加锁pin的方式,超过设定的自旋次数之后,进入等待,等待IO完成被唤醒。这样节省不停自旋pin时消耗的cpu,但需要付出被唤起时的开销。
再继续扩展问题: 如果会话线程A 经过物理IO将数据页1001读入buffer之后,他需要修改这个页,而在会话线程A之后的其他的同样需要访问数据页1001的会话线程,即使在数据页1001被入读buffer pool之后,将仍然处于等待中。因为在数据页上读取或者更新的时候,同样需要上锁,这样才能保证数据页并发读取/更新的一致性。
由此可见,当一个高并发的系统,出现了热点数据页需要从磁盘上加载到buffer pool中时,造成的延迟,是难以想象的。因此排在等待热点页队列最后的会话线程最后才得到需要的页,响应时间也就越长,这就是造成了一个简单的sql需要执行几十秒的原因。
再回头来看上面的问题,mysql数据库出现性能下降时,可以看到操作系统有读IO。 原因是,在数据库对数据页的更改,是在内存中的,然后通过检查点线程进行异步写盘,这个异步的写操作是不堵塞执行sql的会话线程的。所以,即使看到操作系统上有大量的写IO,数据库的性能也是很平稳的。但当用户线程需要查找的数据页不在buffer pool中时,则会从磁盘上读取,在一个热点数据页不是非常多的情况下,我们设置足够大的innodb_buffer_pool的size, 基本可以缓存所有的数据页,因此一般都不会出现缺页的情况,也就是在操作系统上基本看不到读的IO。 当出现读的IO时,原因时在执行buf_read_page_low函数,从磁盘上读取数据页到buffer pool, 则数据库的性能则开始下降,当出现大量的读IO,数据库的性能会非常差。
3. 网络SS|D是什么
简单来说,SSID就是你的路由器热点的名字,就是别人通过WIFI找到你的服务器的名字。找到了这个名字,才能连接WIFI。
4. mysql数据库find
举个例子来说
有个文章表里面有个type字段 他存储的是文章类型 有 头条 推荐 热点 图文 …… 等等
现在有篇文章他既是 头条 又是热点 还是图文
type中以 的格式存储
们我们如何用sql查找所有type中有 图文标准的文章呢??
这就要我们的find_in_set出马的时候到了
以下为引用的内容
select * from article where FIND_IN_SET( type)
mysql手册中find_in_set函数的语法
FIND_IN_SET(str strlist)
假如字符串str 在由N 子链组成的字符串行表strlist 中 则返回值的范围在 到 N 之间
一个字符串行表就是一个由一些被 符号分开的子链组成的字符串 如果第一个参数是一个常数字符串 而第二个是type SET列 则 FIND_IN_SET() 函数被优化 使用比特计算
如果str不在strlist 或strlist 为空字符串 则返回值为 如任意一个参数为NULL 则返回值为 NULL 这个函数在第一个参数包含一个逗号( )时将无法正常运行
mysql> SELECT FIND_IN_SET( b a b c d )
> 因为b 在strlist集合中放在 的位置 从 开始
select FIND_IN_SET( ) 返回 就是 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中 才返回 大于 的数
select FIND_IN_SET( )
返回 select FIND_IN_SET( ) 返回
注意
select * from treenodes where FIND_IN_SET(id )
使用find_in_set函数一次返回多条记录
id 是一个表的字段 然后每条记录分别是id等于 的时候
有点类似in (集合)
lishixin/Article/program/MySQL/201311/29463