月度归档:2019年09月

mssql sqlserver求数据行最大值(最小值)的方法分享


摘要:
下文讲述数据表中,如何求数据表中,一行数据中最大值(最小值)列数据的方法分享,如下所示:
实验环境:sqlserver 2017



在一些平时的sql脚本编写中,我们常常需要获取一个数据表中行 “列中最大值(最小值)”,
下文将讲述三种获取行“列值的最大值(最小值)”的方法,如下所示:

  ---获取行 最大列值--使用max 
  ---获取行 最小列值--使用min
 create table [maomao365.com]
(sort varchar(10),
 i    int,j int,k int)
 go
 insert into [maomao365.com]
 (sort,i,j,k)values
 ('A',1,4,5),
 ('B',2,67,98),
 ('C',8,36,57),
 ('D',9,87,32)
 go


 ---方法1: 虚拟表方法-效率高
 select sort,(select Max(v) from (values (i),(j),(k)) as #temp(v)) as v from [maomao365.com]
 ---方法2:行列转换的方法-效率高
 select sort, max(v) as v from [maomao365.com] unpivot (v for qty in (i,j,k)) as u group by sort 

 ---方法3:拼接虚拟表的方法
  select sort ,
  (select max(v) as v from 
  (      select a.i as v 
   union select a.j 
   union select a.k )v)
   as v  from [maomao365.com] as a 
 
 go
 truncate table  [maomao365.com]
 drop     table   [maomao365.com]
mssql_sqlserver_获取行中最大值列的值的方法

mssql_sqlserver_获取行中最大值列的值的方法

分布式系统预备知识-全公司唯一单据编号生成方法


摘要:
下文讲述大型互联网系统中全公司唯一单据编号详解,
下文将从大型互联网公司的唯一单据编号功能及同唯一列的不同之处及实现方式进行“全公司唯一单据编号”进行详解说明
如下所示:


1.常见的单据编号用途:

1.在互联网项目中,处处都有全局唯一单据编号存在,例:
淘宝订单号:全taobao唯一
支付宝付款流水号:全支付宝唯一
微信支付交易单号 等等这些大型互联网系统都拥有单据编号;
 编号在大型互联网系统中的作用就标识这条交易的唯一性。
2.在企业内部的ERP中,每一个业务记录的产生都对应的单号信息,例:
   入库单会生成入库单号
   销售单会生成销售单号
   采购退货单会生成相应的退后单号
   销售退货单也会生成相应的销售退货单号,等等
   这些业务单号在企业内部可以作为此业务的唯一标识。
那么从以上的两个业务我们可以得出,单据编号的用途就是业务的唯一标识

唯一标识和单据编号的区别

唯一标识:常指一个数据表的唯一行记录的标识列;
单据编号:是针对一项业务进行标识。
————————-
唯一标识:不具备一些业务属性,无法用作其它用途,只可以作为数据库的唯一标识信息
单据编号:具有一定的业务属性。

3.分布式系统为何需要单据开发一个全局编号生成接口

3.1 因为一个系统中,需要生成编号的地方非常多非常多,为了避免重复造轮子,我们需要采用一个单独的单据编号生成程序。
3.2 一个分布式系统,一个模块可能由成千上万不同的程序生成单据编号,所以必须使用一个单据的编号生成接口,使生成的单据编号安全可靠。


4.分布式系统为何需要单据开发一个全局编号生成接口

4.1 前缀列(或前缀列+日期)+数据库自增列
这种方式的最大弊端就是依赖数据库,不利用数据库的扩展,而且自增列有一定的“上线”会达到最大值,这种自增列不具备业务属性,
这种自增列由于具有一定的规律,所有有经验的用户,可以估算出系统的业务量,变相的泄露了公司的业务信息。

4.2 前缀列+机器Id+ 序列号(毫秒级时间41位+机器ID 10位+毫秒内序列12位)
采用4.2的方式,可以保证编号的唯一性,也就是大家常说的 Snowflake 算法,
采用此种方式生成编号的缺点就是订单号位数过长,但是可以保证其唯一性,此种生成编号的方法,目前被N多大型互联网公司采用,
采用此种方式的最大优点就是脱离于编号生成完全脱离数据库,这种方式便于数据库的移植和程序的移植。

通过以上方式,我们可以总结出,最利于业务表达的单据编号生成方式为”4.2″,而且这种方式,也利于分库分表的扩展。

MySQL数据库如何查看“表及索引”所占用的空间大小呢?


摘要:
下文讲述MySQL数据库,如何使用sql脚本查询表及索引空间大小,如下所示:


实现思路:
通过查询information_schema中的tables 获取表及索引所占用空间

  --查看索引所占用空间大小
  mysql >select CONCAT(sum(index_length/(1024*1024)) ,'MB') as 'indexTotal' 
  mysql > from  information_schema.TABLES  WHERE table_schema LIKE '数据库名称';

 --查看表空间大小
  mysql >select CONCAT(sum(data_length/(1024*1024)) ,'MB') as 'indexTotal' 
  mysql > from  information_schema.TABLES  WHERE table_schema LIKE '数据库名称';
mysql_sql获取索引及表空间大小方法

mysql_sql获取索引及表空间大小方法