SQLServer 与 MySQL 做为大部分BI项目的数据来源,用来作为搭建数据仓库的载体。很多BI项目被第三方实施公司忽略的两个点就是数据库性能和项目是否真正给甲方带来价值;在很大程度上BI项目是不需要考虑性能问题的,因为本身的数据量没有达到一个量级,本身的数据库厂商也在做数据库的升级和优化。而真正需要考虑性能的是那些项目本身面对的公司数据体量大、数据来源广、业务处理过程复杂。而在BI工程师和数据工程师以及报表工程师中关注这方面的问题也比较少,研究的重点不在数据库性能方面,而是在清洗数据的复杂过程。
我本身也对数据库性能研究也比较弱,下面是我学习数据库执行计划做的一些笔记,仅代表我自己的一些思路,也许会有错误的地方。
不管是SQL Server 还是MySQL 提到SQL执行效率 都有一个共同的点 就是索引。索引这种东西有好有坏,完全看个人能力;因为索引建好了能带来查询效率的提升,建不好就会比没有索引还要慢。
(SQL Server 版本2016 我已金融数仓数据库为例,MySQL 版本5.7.20 我已world库为例)
这两种数据库创建、删除、修改索引的语句都差不多,我简单的列举一下他们的语句。
首先分别确定数据库中指定表创建有哪些索引
SQL Server:
SELECT column_id,b.name,c.name,d.type_desc,d.nameFROM sys.index_columns AS aLEFT JOIN sys.objects AS b ON a.OBJECT_ID = b.object_idLEFT JOIN sys.syscolumns AS c ON c.colid = a.column_id AND c.id = b.object_idLEFT JOIN sys.indexes AS d ON b.object_id = d.object_id AND a.index_id = d.index_idWHERE b.name = 'ODS_Dim_01_StockList'或者执行execute sp_helpindex @objname = 'ODS_Dim_01_StockList';--执行结果column_id name name type_desc name1 ODS_Dim_01_StockList ts_code NONCLUSTERED StockIndex
MySQL:
mysql> show index from city;+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| city | 0 | PRIMARY | 1 | ID | A | 4188 | NULL | NULL | | BTREE | | || city | 1 | CountryCode | 1 | CountryCode | A | 232 | NULL | NULL | | BTREE | | |+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+2 rows in set (0.00 sec)
创建、删除、修改索引的语句
SQL Server
--创建索引 唯一、聚集、非聚集 联合索引CREATE UNIQUE/CLUSTERED/NONCLUSTERED index 索引名 ON