Database

  • 数据库分库分表
    • 1.横向切分
      • 分库分表案例
      • 需要定义规则来选择表
      • 查询:
      • 规则:
    • 2.纵向拆分表
    • 3.相对平均分配数据
  • 复杂Sql语句
  • 一条Sql语句执行的全过程;
  • 你们觉得数据库是什么?
    • 数据页
    • 管理数据页
    • 聚集索引:
    • 非聚集索引
    • 索引的创建建议:

数据库分库分表

1.横向切分

分库分表案例

按照时间横向切分
订单表,历史表;
订单表:按照年份来拆分表,每一年(月),每一年对应一个订单表;
成本:
保存:1.选择保存到哪个表中去

需要定义规则来选择表

查询:

  1. 确定到哪个表中去查询
  2. 还是按照规则来呗

规则:

OrderInfo, 年来分, OrderInfo_2020 / OrderInfo_2019,
保存+查询=获取当前年份,确定表,不建议提前建好,建议在程序中动态生成;
每一次都需要判断是否存在表,可以使用缓存-----在系统初始化----读取相关表名,保存到内存
中,后续判断基于内存来;时间不能在数据库中获取;

2.纵向拆分表

注意:数据之间的关系—一堆一的关联
查询就基于主外键来做关联

3.相对平均分配数据

如果有一大批数据(大数据量的),我明知道数据库直接保存一个表,压力很大;计划就使用10个表
来存储;
100000,十个表相对平均分摊,差不过每个表存储的数据接近一万;

复杂Sql语句

1.行转列

--方法一:
select  StuName as '学员',
max(case courseName when '思想政治' then courseScore else 0 end) as '思想政治',
max(case courseName when '数学' then courseScore else 0 end) as '数学',
max(case courseName when '语文' then courseScore else 0 end) as '语文',
max(case courseName when '物理' then courseScore else 0 end) as '物理',
max(case courseName when '化学' then courseScore else 0 end) as '化学',
max(case courseName when '英语' then courseScore else 0 end) as '英语'
from course group by StuName--方法二:
select ROW_NUMBER() over(order by a.StuName asc) as ID,a.StuName as '学号',MAX(a.思想政治) as '思想政治',MAX(a.数学) as '数学',MAX(a.语文) as '语文',MAX(a.物理) as '物理',MAX(a.化学) as '化学',MAX(a.英语) as '英语'
from course pivot(max(courseScore) for courseName in(思想政治,数学,语文,物理,化学,英语))a
group by a.StuName

2.列转行

USE [CustomerDB]
GO/****** Object:  Table [dbo].[CourseInfo]    Script Date: 2020/9/27 16:17:12 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE TABLE [dbo].[CourseInfo]([Id] [int] IDENTITY(1,1) NOT NULL,[思想政治] [decimal](18, 0) NULL,[数学] [decimal](18, 0) NULL,[语文] [decimal](18, 0) NULL,[物理] [decimal](18, 0) NULL,[化学] [decimal](18, 0) NULL,[英语] [decimal](18, 0) NULL,[学员名称] [nvarchar](50) NULL,CONSTRAINT [PK_CourseInfo] PRIMARY KEY CLUSTERED
([Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GOINSERT INTO [dbo].[CourseInfo]([思想政治],[数学],[语文],[物理],[化学],[英语],[学员名称])VALUES(60 ,65  ,84  ,70 ,76 ,54 ,'李四'),(86 ,70  ,80  ,90 ,65 ,96 ,'张三'),(86 ,21  ,56  ,23 ,89 ,96 ,'王五') ---select * from [dbo].[CourseInfo]select 学员名称 from [dbo].[CourseInfo]  ---需要多行展示怎么办?select 学员名称 from [dbo].[CourseInfo] -----列转行
select * from ( select 学员名称 as StuName,courseName='思想政治',courseScore=思想政治 from [dbo].[CourseInfo]union allselect 学员名称 as StuName ,courseName='数学',courseScore=数学 from [dbo].[CourseInfo]union allselect 学员名称 as StuName,courseName='语文',courseScore=语文  from [dbo].[CourseInfo]union allselect 学员名称 as StuName,courseName='物理',courseScore=物理 from [dbo].[CourseInfo]union allselect 学员名称 as StuName,courseName='化学',courseScore=化学 from [dbo].[CourseInfo]union allselect 学员名称 as StuName,courseName='英语',courseScore=英语 from [dbo].[CourseInfo]
) t order by  t.StuName

执行T-Sql

一条Sql语句执行的全过程;

  1. 客户端
  2. 关系引擎 接收到命令,制定执行计划(缓存—存储过程,参数化SQL语句)
  3. 存储引擎
  4. 缓冲区
  5. 数据库文件
  6. 数据库日志

你们觉得数据库是什么?

仓储—数据持久化容器—仓库;
数据库肯定是一个应用程序–可以做到数据的持久化(数据是保存在硬盘,读取慢—SSD),多线程操作
需要加锁;类似于一个仓库,保存数据,在需要的时候可以把数据再取出来;
这么去提高找数据的速度呢?—需要索引;
数据库存储机制

数据页

1.数据页

8kb/page, 8个数据页为一个Extent存储区,
数据存储,不能跨页存储,nvarchar()----8kb
text,Img


文本图像页


page页中保存的是数据的引用,具体数据保存在文本图像页中;

管理数据页

记录数据页在硬盘中的具体问题。

索引页:保存索引,某个字段的数据&&具体数据位置,索引是一个独立的存储,体积小—读取就快;
数据库索引探究

聚集索引:

类似的数据聚集在一起,可以排序,主键中默认就是聚集索引;
把数据有序摆放,物理排序,修改索引,会重新排序,重新调整物理排序,会很耗时,在生产环境要谨
慎;
聚集索引:只能有一个聚集索引,可以一个索引包含多个列,就是多个列都排序
保存在独立的索引页,包含字段的数据和位置信息;
查询的时候,排序,大于,小于,between查询很快;
就像字典中的拼音查字法:阿, a----可以定位到大概在哪个区域;
字典:拼音查字法

非聚集索引

字典:偏旁部首查字法
不影响数据的物理排序,重复存储一个数据和位置------字典中的偏旁部首查字法
陈-----找到偏旁,再确定这个字;存储会有重复,体积小,查找快,快速定位,直达目标;
找数据:通过索引直接定位到硬盘中的某个位置;
可以创建多个,每个索引页可以包含多个字段;
修改数据的时候:需要维护索引;

索引的创建建议:

1.主键必须建立索引,(根据实际情况选择主键类型,如果是in–聚集索引,guid–非聚集索引),创建时

2.外键也需要建立索引
3.经常需要Where 的字段—需要建立索引
4.Order by /group by distinct 如果查询频繁,建议建立索引
5.索引不要太多;
6.重复的数据较多的,不要建立索引,sex—1和0
7.text,img不要建立索引

18.sql server横向切分、纵向拆分表、相对平均分配数据、复杂sql语句、数据库存储原理(by-朝夕)相关推荐

  1. SQL Server管理相关的注册表技巧

    SQL Server管理相关的注册表技巧 2010-10-20 17:14 佚名 SQL Server的管理和Windows的管理是息息相关的,通过Windows的注册表可以让SQL Server管理 ...

  2. SQL Server 查询性能优化——堆表、碎片与索引(一)

    SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找一遍.如果有可采用的索引,SQL Server只需要在索引层级查找 ...

  3. SQL Server查询性能优化——堆表、碎片与索引(一)

    SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找 一遍.如果有可采用的索引,SQL Server只需要在索引层级查 ...

  4. Oracle和sql server中复制表结构和表数据的sql语句

    在Oracle和sql server中,如何从一个已知的旧表,来复制新生成一个新的表,如果要复制旧表结构和表数据,对应的sql语句该如何写呢?刚好阿堂这两天用到了,就顺便把它收集汇总一下,供朋友们参考 ...

  5. cte公用表表达式_CTE SQL删除; 在SQL Server中删除具有公用表表达式的数据时的注意事项

    cte公用表表达式 In this article, the latest in our series on Common table expressions, we'll review CTE SQ ...

  6. SQL Server使用快捷键查看指定表的信息(字段、备注、索引、约束信息等)

    在我们工作,学习,开发中,为了快速了解业务,编写业务,需要了解相关的表的信息,下面这个SQL就很有必要了.这个SQL能让我们使用快捷键就能查看指定表的信息(字段.备注.索引.约束信息等),能让我们迅速 ...

  7. sql server服务器怎么配置文件,配置 SSAS 以生成内存转储文件 - SQL Server | Microsoft Docs...

    配置 SQL Server Analysis Services 以生成内存转储文件 09/25/2020 本文内容 本文介绍如何将 SQL Server Analysis Services 配置为自动 ...

  8. SQL Server误区30日谈-Day21-数据损坏可以通过重启SQL Server来修复

    本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11: Misconceptions about.... EVE ...

  9. 看看如何解决“SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录”的问题...

    今天安装Sql Server之后,出现SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录的问题是由于sql server只设置了Windows身份验证, ...

最新文章

  1. MCU实战经验:多种的按键处理
  2. 080703 雨&星巴克的菜单
  3. 6.STM32外设函数分类
  4. java 注解 数据字典_Spring实现数据字典翻译
  5. 编程之美-24点游戏方法整理
  6. Python 使用正则表达式中的 /b 的时候出现了问题
  7. HUST - 1016 幼儿园小朋友们的难题(水题)
  8. 二甲医院云服务器,医院用上云计算 病情上传到云端可行否?
  9. 晶体管游戏 linux,Industrial Linux
  10. WCF 第一章 总结
  11. 洛谷 P1426 小鱼会有危险吗【模拟/题意理解】
  12. python+selenium 自动化测试环境搭建
  13. 《人类简史》笔记——认知革命和农业革命背后的思考
  14. jmu-python-函数-找钱
  15. 如何将域名解析到指定的端口(linux服务器,超级简单,图文)
  16. 修改idea的头部文档注释信息
  17. Win10屏幕截图自动保存方法
  18. 为NanoPi M2 自制Debian镜像
  19. 阿里系-淘宝接口抓取
  20. STUN, TURN, ICE介绍

热门文章

  1. java switch枚举类,Java 枚举 switch的用法
  2. shell脚本中使用sudo的前置条件
  3. window系统命令行切换当前目录
  4. 最长公共子序列(LCS)的C++实现
  5. 系统迁移的重点步骤及注意事项
  6. mysql查看定时备份_mysql定时备份
  7. 芦笋制品的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 最新图文识别技术综述
  9. c语言精髓之编译过程,C语言精髓知识点
  10. Android P (9.0)刘海屏(DisplayCutout)适配方法