SQL Server是由微软开拓和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开拓的,并于1988年推出了第一个OS/2版本。
Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是SQL SERVER 2017,以出色的性能和事务处理能力,与Oracle、Mysql构成了当前三大主流的关系数据库。

对付已经很熟习T-SQL的读者,或者对付较专业的DBA来说,逻辑的增编削查,或者较繁芜的SQL语句,都是非常大略的,不存在任何寻衅,不值得一提,那么,SQL的哪些方面是他们的寻衅 或者软肋呢?

那便是sql优化。
然而,要向成为一个好的Sql优化高手,首先要做的一件事无疑便是理解sql语句在SQL Server中是如何实行的。
在这一系列中,我们将开始sqlserver优化系列讲解,本 讲为优化系列的开篇文章,

phpsqlserver存储过程SQL Server内部运行机制浅析 Docker

在本篇文章中,我们将重点讲解SQL Server体系构造

在正式讲解之前,我们先来看看如下问题,你是否碰着过,若你碰着过且成功办理,那么这篇文章,你可以跳过。

为了测试须要,我们先仿照插入5亿3千多万条数据。

1

SELECT COUNT(1) FROM BigDataTest

(一)查询缓慢问题

,临时表,表连接,子查询等造成的查询缓慢问题,你能办理吗?

(二)内存泄露

如下查询了8分2秒,然后内存溢出,你知道问题吗?

1

SELECT FROM BigDataTest

(三)常常听说如下观点,你都能办理吗?

事务与锁(请参考我另一篇文章:浅谈SQL Server事务与锁(上篇)),ACID,隔离级别,脏读,分表分库,水平拆分,垂直拆分,高并发等

一 SQL Server体系构造抽象

二 SQL Server体系构造概述

SQL Server核心体系构造,大致包括六大部分:客户端访问工具、SQL Server 网络接口(SQL Server Network Interface,SNI)、关系引擎、存储引擎、

磁盘和缓冲池。
下图为SQL Server核心体系大致轮廓图。

(一)SQL Server客户端访问工具

SQL Server客户端访问工具,供应了远程访问技能,它与SQL Server做事端基于一定的协议,使其能够远程访问数据库,就像在本地操作数据库一样,如我们常常用的

Microsoft SQL Server Management Studio。

SQL Server客户端访问工具是比较多的,个中比较盛行的要数Microsoft SQL Server Management Studio 和Navicat(Navicat在MySQL中也是比较常用的)了,至于其他工具,

本篇文章就不列举了,感兴趣的读者朋友,可以查询一下。

(二)SQL Server网络协议

SQL Server网络协议,又叫SQL Server网络接口(SNI),它是构成客户端和做事端通信的桥梁,它与SQL Server做事端基于一定协议,方可通信,

如我们在客户端输入一条查询语句SELECT FROM BigDataTest,这条语句,只有客户端和做事端基于一定协议,方可被做事端解析,否则,被视为无

效语句。

SQL Server网络协议,由一组API构成,这些API供SQL Server数据库引擎和SQL Server本地客户端调用,如实现最基本的CRUD通信。

SQL Server 网络接口(SQL Server Network Interface,SNI)只须要在客户端和做事端配置网络协议即可,它支持一下协议:

(1)共享内存

(2)TCP/IP

(3)命名管道

(4)VIA

(三)关系引擎

关系引擎,也叫查询引擎,其紧张功能是卖力处理SQL语句,其核心组件由三部分组成:命令剖析器、查询优化器和查询实行器。

(1)命令剖析器:卖力解析客户端通报过来的T-SQL语句,如客户端通报一条SQL语句:SELECT FROM BigDataTest,它会检讨该语句的语法构造,若语法

缺点,它会将缺点返回给协议层,然后协议层将缺点返回给客户端;如果语法构造精确,它会根据查询命令天生查询操持或探求一个已存在的查询操持(先在缓冲池操持缓

存中查找,若找到,则直接给查询实行器实行,若未找到,则会天生基于T-SQL的查询树,然后交给查询优化器优化)

(2)查询优化器:卖力优化命令解析器天生的T-SQL查询树(基于资源的优化,而非基于韶光的优化),然后将终极优化结果通报给查询实行器实行。
查询优化器是基于

“资源开销”的优化器,这种算法评估多种可实行的查询办法,并从中选择开销最低的方案作为优化结果,然后将该结果天生查询操持输出给查询实行器。
把稳,查询优化器是

“基于资源开销最优”而非“基于方案最优”,也便是,查询优化器的终极优化结果未必是最好的方案,但一定是资源开销最低的方案。

(3)查询实行器:卖力实行查询。
假若查询实行器吸收到命令解析器或查询优化器通报过来的SQL语句:SELECT FROM BigDataTest,它通过OLE DB接口传递到存储

引擎,再通报到存储引擎的访问方法。

(四)存储引擎

存储引擎,实质便是管理资源存储的,它的核心组件包括三部分:访问方法、事务管理器和缓冲区管理器。

(1)访问方法:访问方法实质是一个接口,供查询实行器调用(该接供词给了所有检索数据的代码,接口的实际实行是由缓冲区管理器来实行的),假若查询实行器通报一条SQL语句:

SELECT FROM BigDataTest,访问方法吸收到该要求命令后,就会调用缓冲区管理器,缓冲区管理器就会调用缓冲池的操持缓存,在操持缓存中探求到相应的结果集,然后返回给关系

引擎。

(2)缓冲区管理器:供访问方法调用,管理缓冲池,在缓冲池中查询相应资源并返回结果集,供访问方法返回给关系引擎。

(3)事务管理器:紧张卖力事务的管理(ACID管理)和高并发管理(锁),它包括两个核心组件(日志管理器和锁管理器),锁管理器卖力供应并发数据访问,设置隔离级别等;日志管理器卖力

记录所有访问方法操作动作,如基本的CRUD。

(五)缓冲池

缓冲池驻于内存中,是磁盘和缓冲区管理器的桥梁SQL Server中,所有资源的查询都是在内存中进行的,即在缓冲池中进行的,假若缓冲池

吸收到缓冲区管理器通报过来的的一条SQL语句:SELECT FROM BigDataTest,缓冲区管理器数据缓存先从磁盘数据库中取知足条件的结果集,

然后放在缓冲池数据缓冲中,然后以结果集的形式返回给缓冲区管理器,供访问方法返回给关系引擎的查询实行器,然后返回给协议层,协议层再

返回给客户端。
把稳,这里操作的是缓冲池中数据,而不是磁盘DB中的数据,并且操作的缓冲池数据不会立即写入磁盘,因此就会造成查询到结果

与BD中的结果不一致,这便是所谓的脏读。

缓冲池紧张包括两部分:操持缓存(天生实行操持是非常耗时耗资源的,操持缓存紧张用来存储实行操持,以备后续利用)和数据缓存(常日是缓存池

中容量最大的,花费内存最大,从磁盘中读取的数据页只要放在这里,方可调用)

(六)磁盘

磁盘紧张是用来存储持久化资源的,如日志资源,数据库资源和缓存池持久化增援等。

三 一个查询的完全流程

如下为一个比较完善的查询过程,即第二部分查询语句:SELECT FROM BigDataTest 全体过程。

四 参考文献

【01】《SQL Server 2012 深入解析与性能优化 第3版》Christian Bolton,Justin Langford,Glenn Berry,Gavin Payne,Amit Banerjee,Rob Farley著

来源:http://www.cnblogs.com/wangjiming/p/10098061.html

分享数据库根本知识

数据库是“按照数据构造来组织、存储和管理数据的仓库”。
是一个长期存储在打算机内的、有组织的、有共享的、统一管理的数据凑集。
数据库因此一定办法储存在一起、能与多个用户共享、具有尽可能小的冗余度、与运用程序彼此独立的数据凑集,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

数据库便是一种分外的文件,个中存储着须要的数据

ubuntu中mysql数据库

当前紧张利用两种类型的数据库:关系型数据库RDBMS(Relational Database Management System)、非关系型数据库。

数据库的特点:

持久化存储读写速率极高担保数据的有效性对程序支持性非常好,随意马虎扩展

所谓的关系型数据库RDBMS,是建立在关系模型根本上的数据库,借助于凑集代数等数学观点和方法来处理数据库中的数据。
关系型数据库模型是把繁芜的数据构造归结为大略的二元关系(即二维表格形式)。
在关系型数据库中,对数据的操作险些全部建立在一个或多个关系表格上,通过这些关联的表格分类、合并、连接或选取等运算来实现数据的管理。
就像Excel中的:

关系型数据库的紧张产品:

oracle:在以前的大型项目中利用,银行,电信等项目mysql:web时期利用最广泛的关系型数据库ms sql server:在微软的项目中利用sqlite:轻量级数据库,紧张运用在移动平台

非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“Not Only SQL”,指的是非关系型数据库,而不是“NO SQL”的意思,因此,NoSQL的产生并不是要彻底否定关系型数据库,而是作为传统数据库的一个有效补充。
NoSQL数据库在特定的场景下可以发挥弗成思议的高效率和高性能。

非关系型数据库的紧张产品:

Memcached(key-value):开源的、高性能的、具有分布式内存工具的缓存系统redis(key-value):支持内存缓存、持久化储存、主从集群、分布式等功能Cassandra(Column-oriented):最初由Facebook开拓,用于储存特殊大的数据MongoDB (Document-oriented):一个介于关系数据库和非关系数据库之间的产品

OceanBase是关系型数据库,全兼容MySQL,也便是说学好MySQL便是学好它。
看看OceanBase如今在世界上的地位:

接下来我们来看看MySQL数据库:

MySQL数据库入门

MySQL 简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开拓,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品。

特点

利用C和C++编写,并利用了多种编译器进行测试,担保源代码的可移植性支持多种操作系统,如Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等为多种编程措辞供应了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等支持多线程,充分利用CPU资源优化的SQL查询算法,有效地提高查询速率供应多措辞支持,常见的编码如GB2312、BIG5、UTF8供应TCP/IP、ODBC和JDBC等多种数据库连接路子供应用于管理、检讨、优化数据库操作的管理工具大型的数据库。
可以处理拥有上千万条记录的大型数据库支持多种存储引擎MySQL 软件采取了双授权政策,它分为社区版和商业版,由于其体积小、速率快、总体拥有本钱低,尤其是开放源码这一特点,一样平常中小型网站的开拓都选择MySQL作为网站数据库MySQL利用标准的SQL数听说话形式Mysql是可以定制的,采取了GPL协议,你可以修正源码来开拓自己的Mysql系统在线DDL变动功能复制全局事务标识复制无崩溃从机复制多线程从机

开源 免费 不要钱 利用范围广,跨平台支持性好,供应了多种措辞调用的 API,是学习数据库开拓的首选

安装

系统以Ubuntu为例,其他系统百度有很多教程,在终端中输入如下命令,回车后,然后按照提示输入:

sudo apt-get install mysql-serversudo apt-get install mysql-client

做事器用于吸收客户真个要求、实行sql语句、管理数据库,做事器端一样平常以做事办法管理,名称为mysql。

sudo service mysql start

配置

配置文件目录为/etc/mysql/mysql.cnf

进入conf.d目录,打开mysql.cnf,创造并没有配置进入mysql.conf.d目录,打开mysql.cnf,可以看到配置项

紧张配置项如下

bind-address表示做事器绑定的ip,默认为127.0.0.1port表示端口,默认为3306datadir表示数据库目录,默认为/var/lib/mysqlgeneral_log_file表示普通日志,默认为/var/log/mysql/mysql.loglog_error表示缺点日志,默认为/var/log/mysql/error.log

登录

输入mysql -u root -p

提示输入之前第一条命令设置的密码,涌现如下界面则安装成功

常见定义

主键 :唯一标识一行记录的字段数据行(记录) : 一行记录某个事物的完全信息的数据数据列(字段) : 一列数据类型相同的数据数据表 : 有多少字段和记录组成数据库 : 由多少数据表组成

常见数据类型:

约束

主键primary key:物理上存储的顺序非空not null:此字段不许可填写空值惟一unique:此字段的值不许可重复默认default:当不填写此值时会利用默认值,如果填写时以填写为准外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失落败并抛出非常数据库操作

数据库登录和退出:

数据库的基本操作:

数据表的基本操作:

数据表数据的基本操作:

增 insert into table_name values(),(),();删 delete from table_name where 条件;改 update table_name set key=value where 条件;查 select /查询的字段 from table_name where 条件;

当然,MySQL查询是个大内容,有条件查询、排序、聚合函数、分组、分页、连接查询、自关联查询、子查询等等,如何写好SQL语句又是一门大学问,后面将会降到。
查询的完全格式:

SELECT select_expr [,select_expr,...] [ FROM tb_name [WHERE 条件判断] [GROUP BY {col_name | postion} [ASC | DESC], ...] [HAVING WHERE 条件判断] [ORDER BY {col_name|expr|postion} [ASC | DESC], ...] [ LIMIT {[offset,]rowcount | row_count OFFSET offset}]]MySQL高等进阶

视图

视图便是一个能够把繁芜SQL语句的功能封装起来的一个虚表视图不存储详细的数据基本表数据发生了改变,视图也会随着改变视图可以方便操作,特殊是查询操作,减少繁芜的SQL语句,增强可读性,复用性;

# 视图的定义办法:create view 视图名称(一样平常利用v开头) as select语句;# 查看视图show tables; # 利用视图select from v_goods_info; # 删除视图drop view 视图名字;

事务

1.事务四大特性ACID

原子性(Atomicity)同等性(Consistency)隔离性(Isolation)持久性(Durability)

2.开缘由务

开缘由务后实行修正命令,变更会掩护到本地缓存中,而不掩护到物理表中

begin; 或者 start transaction;

实行SQL语句

3.提交事务

将缓存中的数据变更掩护到物理表中

commit;

4.回滚事务

放弃缓存中变更的数据 表示事务实行失落败 该当回到开始事务前的状态

rollback;

索引

# 查看表中已有索引show index from 表名;# 创建索引alter table 表名 add index 索引名【可选】(字段名,…);create index 索引名称 on 表名(字段名称(长度))# 删除索引drop index 索引名称 on 表名;

优点:

加快数据的查询速率

缺陷:

创建索引会摧残浪费蹂躏韶光和占用磁盘空间,并且随着数据量的增加所耗费的韶光会越来越多

利用原则:

常常发生数据更新的表避免利用过多的索引数据量小的表没有必要利用索引数据量较大同时不会频发发生数据变动的表可以利用索引

三范式

设计关系数据库时,屈服不同的规范哀求,设计出合理的关系型数据库,这些不同的规范哀求被称为不同的范式

各种范式呈递次规范,越高的范式数据库冗余越小。

数据冗余是指数据之间的重复,也可以说是同一数据存储在不同数据文件中的征象

六种范式:

第一范式(1NF):强调的是字段的原子性,即一个字段不能够再分成其他几个字段。
第二范式(2NF):一是表必须有一个主键,二是非主键字段必须完备依赖于主键,而不能只依赖于主键的一部分第三范式(3NF):不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情形。
巴斯-科德范式(BCNF):第三范式的根本上进一步肃清主属性对付码的部分函数依赖和通报依赖第四范式 ( 4NF)限定关系模式的属性之间不许可有非平凡且非函数依赖的多值依赖第五范式(5NF,又称完美范式):肃清了4NF中的连接依赖

E-R模型

E-R模型由 实体、属性、实体之间的关系构成,紧张用来描述数据库中表之间的关系和表构造。
开拓流程是先画出E-R模型,然后根据三范式设计数据库中的表构造