SPL 性能优化基础练习

数据准备

使用到的数据表结构如下:

字段名 含义
Categories [CategoryID] [int] NOT NULL,
[CategoryName] [nvarchar](50) NULL,
[Description] [nvarchar](100) NULL
分类 ID
分类名称
描述
Customers [CustomerID] [nvarchar](10) NOT NULL,
[CustomerName] [nvarchar](50) NOT NULL,
[ContactName] [nvarchar](50) NULL,
[ContactTitle] [nvarchar](50) NULL,
[Address] [nvarchar](50) NULL,
[City] [nvarchar](20) NULL,
[Region] [nvarchar](20) NULL,
[PostalCode] [nvarchar](20) NULL,
[Country] [nvarchar](20) NULL,
[Phone] [nvarchar](30) NULL,
[Fax] [nvarchar](30) NULL
客户 ID
客户名称
联系人
联系人头衔
客户地址
城市
地区
邮编
国家
电话
传真
Employees [EmployeeID] [int] NOT NULL,
[LastName] [nvarchar](50) NULL,
[FirstName] [nvarchar](50) NULL,
[Title] [nvarchar](50) NULL,
[TitleOfCourtesy] [nvarchar](50) NULL,
[Birthday] [date] NULL,
[HireDate] [date] NULL,
[Address] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[Region] [nvarchar](50) NULL,
[PostalCode] [nvarchar](50) NULL,
[Country] [nvarchar](50) NULL,
[HomePhone] [nvarchar](50) NULL,
[Gender] [nvarchar](50) NULL
员工 ID


头衔
尊称
生日
入职日期
地址
城市
地区
邮编
国家
家庭电话
性别
Orders [CustomerID] [nvarchar](10) NULL,
[OrderDate] [datetime] NULL,
[ProductID] [nvarchar](50) NOT NULL,
[Quantity] [int] NULL,
[Unit] [nvarchar](50) NULL,
[Price] [decimal](18, 2) NULL,
[Amount] [decimal](18, 2) NULL,
[EmployeeID] [int] NULL,
[EmployeeName] [string] NULL,
[ShipVia] [nvarchar](20) NULL
客户编号
订单日期
产品编号
数量
单位
单价
金额
员工 ID
员工姓名
运输方式
Products [ProductID] [nvarchar](50) NOT NULL,
[ProductName] [nvarchar](50) NOT NULL,
[SupplierID] [int] NULL,
[CategoryID] [int] NULL,
[QuantityPerUnit] [nvarchar](20) NULL,
[UnitPrice] [decimal](18, 2) NULL
产品编号
产品名称
供应商编号
分类编号
单位数量
单价
Suppliers [SupplierID] [int] NOT NULL,
[CompanyName] [nvarchar](50) NULL,
[ContactName] [nvarchar](50) NULL,
[ContactTitle] [nvarchar](50) NULL,
[Address] [nvarchar](100) NULL,
[City] [nvarchar](50) NULL,
[Region] [nvarchar](50) NULL,
[PostalCode] [nvarchar](50) NULL,
[Country] [nvarchar](50) NULL,
[Phone] [nvarchar](50) NULL,
[Fax] [nvarchar](50) NULL,
[HomePage] [nvarchar](100) NULL
供应商 ID
供应商名称
联系人姓名
联系人头衔
地址
城市
地区
邮编
国家
电话
传真
网址
Areas [Country] [nvarchar](50) NULL,
[Region] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[CityName] [nvarchar](50) NULL,
[PostalCode] [nvarchar](50) NULL
国家
地区
城市
城市名称
邮编

表间关系图如下:

imagepng

因数据库没有通用性,这里把测试数据以文本文件方式提供。小数据表直接用文件,大数据可以用下面的脚本生成。

下载数据 data.zip

目录

1 使用文件存储

1.1 集文件
1.2 组表
1.3 把日期变成小整数
1.4 把枚举字符串变成小整数

2 聚合理解

2.1 COUNT DISTINCT
2.2 DISTINCT
2.3 最大最小值所在的记录
2.4 前 N 名 / 后 N 名
2.5 前 N 名 / 后 N 名所在记录
2.6 冗余分组字段
2.7 每组第一 / 最后一条记录

3 有序存储

3.1 时间有序存储
3.2 有序过滤
3.3 帐户有序存储
3.4 有序 DISTINCT
3.5 有序 COUNT DISTINCT
3.6 有序分组统计
3.7 组内第一条 / 最后一条
3.8 组内复杂判断

4 外键维表

4.1 维表内存化
4.2 维表上的计算
4.3 宽表
4.4 序号化
4.5 维表过滤
4.6 对位序列
4.7 临时维表和区间维表
4.8 外存维表

5 主键关联

5.1 有序归并
5.2 计算交并集
5.3 用主表过滤子表
5.4 用子表过滤主表

6 遍历复用

6.1 基本概念
6.2 应用实践

7 查找任务

7.1 等值查找
7.2 区间查找
7.3 批量查找
7.4 全文索引