当前位置: 首页 > news >正文

ORACLE数据库星型模型设计实例

一、星型模式核心设计原则

  1. 1 张事实表 + N 张维度表
  2. 事实表存度量(数值)+ 维度外键
  3. 维度表扁平、宽表、不嵌套(拒绝雪花)
  4. 统一使用代理键(SK)
  5. 事实表按时间分区
  6. 维度表用位图索引,事实表用位图连接索引
  7. 一致性维度贯穿全仓库
  8. 先原子粒度,后汇总

二、业务案例(零售销售)

  • 事实:销售流水
  • 维度:时间、商品、门店、会员

表名规范:

  • 维度:DIM_XXX
  • 事实:FACT_XXX

三、完整建表 SQL(Oracle 11g/12c/19c 通用)

1. 创建时间维度

CREATE TABLE DIM_DATE ( DATE_SK NUMBER(10) PRIMARY KEY, CALENDAR_DATE DATE NOT NULL, YEAR_NUM NUMBER(4) NOT NULL, MONTH_NUM NUMBER(2) NOT NULL, DAY_NUM NUMBER(2) NOT NULL, WEEK_NUM NUMBER(2) NOT NULL, QUARTER_NUM NUMBER(1) NOT NULL, IS_WEEKEND CHAR(1) NOT NULL, CREATE_TIME DATE DEFAULT SYSDATE ); CREATE BITMAP INDEX IDX_BM_DATE_YEAR ON DIM_DATE(YEAR_NUM); CREATE BITMAP INDEX IDX_BM_DATE_MONTH ON DIM_DATE(MONTH_NUM);

2. 创建商品维度

CREATE TABLE DIM_PRODUCT ( PRODUCT_SK NUMBER(10) PRIMARY KEY, PRODUCT_NK VARCHAR2(32) NOT NULL, -- 业务编码 PRODUCT_NAME VARCHAR2(100) NOT NULL, CATEGORY1 VARCHAR2(50) NOT NULL, CATEGORY2 VARCHAR2(50) NOT NULL, BRAND VARCHAR2(50) NOT NULL, PRICE NUMBER(10,2) NOT NULL, IS_CURRENT CHAR(1) NOT NULL, -- SCD2 EFF_START_DATE DATE NOT NULL, EFF_END_DATE DATE NOT NULL, CREATE_TIME DATE DEFAULT SYSDATE ); CREATE BITMAP INDEX IDX_BM_PROD_CATEGORY1 ON DIM_PRODUCT(CATEGORY1); CREATE BITMAP INDEX IDX_BM_PROD_BRAND ON DIM_PRODUCT(BRAND);

3. 创建门店维度

CREATE TABLE DIM_STORE ( STORE_SK NUMBER(10) PRIMARY KEY, STORE_NK VARCHAR2(32) NOT NULL, STORE_NAME VARCHAR2(100) NOT NULL, PROVINCE VARCHAR2(50) NOT NULL, CITY VARCHAR2(50) NOT NULL, CHANNEL_TYPE VARCHAR2(20) NOT NULL, CREATE_TIME DATE DEFAULT SYSDATE ); CREATE BITMAP INDEX IDX_BM_STORE_CITY ON DIM_STORE(CITY);

4. 创建会员维度

CREATE TABLE DIM_MEMBER ( MEMBER_SK NUMBER(10) PRIMARY KEY, MEMBER_NK VARCHAR2(32) NOT NULL, MEMBER_NAME VARCHAR2(50) NOT NULL, SEX CHAR(1) NOT NULL, AGE_GROUP VARCHAR2(20) NOT NULL, MEMBER_LEVEL VARCHAR2(20) NOT NULL, CREATE_TIME DATE DEFAULT SYSDATE ); CREATE BITMAP INDEX IDX_BM_MEM_SEX ON DIM_MEMBER(SEX); CREATE BITMAP INDEX IDX_BM_MEM_LEVEL ON DIM_MEMBER(MEMBER_LEVEL);

四、创建分区事实表(核心)

CREATE TABLE FACT_SALES ( DATE_SK NUMBER(10) NOT NULL, PRODUCT_SK NUMBER(10) NOT NULL, STORE_SK NUMBER(10) NOT NULL, MEMBER_SK NUMBER(10) NOT NULL, SALES_AMT NUMBER(18,2) NOT NULL, -- 销售额 SALES_QTY NUMBER(10) NOT NULL, -- 销量 COST_AMT NUMBER(18,2) NOT NULL, -- 成本 PROFIT_AMT NUMBER(18,2) NOT NULL, -- 利润 CREATE_TIME DATE DEFAULT SYSDATE ) PARTITION BY RANGE (DATE_SK) ( PARTITION P202501 VALUES LESS THAN (20250201), PARTITION P202502 VALUES LESS THAN (20250301), PARTITION P_MAX VALUES LESS THAN (MAXVALUE) ); -- 位图连接索引(Oracle 星型转换关键) CREATE BITMAP INDEX IDX_BM_SALES_DATE ON FACT_SALES(DIM_DATE.DATE_SK) FROM FACT_SALES, DIM_DATE WHERE FACT_SALES.DATE_SK = DIM_DATE.DATE_SK; CREATE BITMAP INDEX IDX_BM_SALES_PRODUCT ON FACT_SALES(DIM_PRODUCT.PRODUCT_SK) FROM FACT_SALES, DIM_PRODUCT WHERE FACT_SALES.PRODUCT_SK = DIM_PRODUCT.PRODUCT_SK;

五、典型查询 SQL(星型模型标准写法)

案例:按年月 + 品类 + 城市统计销售额

SELECT d.YEAR_NUM, d.MONTH_NUM, p.CATEGORY1, s.CITY, SUM(f.SALES_AMT) AS TOTAL_SALES, SUM(f.SALES_QTY) AS TOTAL_QTY FROM FACT_SALES f JOIN DIM_DATE d ON f.DATE_SK = d.DATE_SK JOIN DIM_PRODUCT p ON f.PRODUCT_SK = p.PRODUCT_SK JOIN DIM_STORE s ON f.STORE_SK = s.STORE_SK WHERE d.YEAR_NUM = 2025 GROUP BY d.YEAR_NUM, d.MONTH_NUM, p.CATEGORY1, s.CITY ORDER BY TOTAL_SALES DESC;

六、Oracle 星型模型必须开启的参数

ALTER SYSTEM SET STAR_TRANSFORMATION_ENABLED = TRUE SCOPE=BOTH; ALTER SYSTEM SET OPTIMIZER_FEATURES_ENABLE = '19.1.0'; -- 按你版本

执行计划里出现:STAR TRANSFORMATION说明星型优化生效。


七、设计要点总结(背会就能用)

  1. 维度表一定用代理键
  2. 事实表只存外键 + 数字
  3. 维度扁平、不嵌套
  4. 事实表必须按时间分区
  5. 低基数字段建位图索引
  6. 用位图连接索引提速
  7. 统一维度,全局复用
  8. 先原子事实,后汇总表
http://www.jsqmd.com/news/592532/

相关文章:

  • 20251909 2024-2025-2 《网络攻防实践》实验三
  • 硬件工程师避坑指南:从选型到焊接,搞定晶振不起振的10个实战细节
  • 项目管理系统项目模板权限模板报表模板怎么做才能快速复制
  • 2025届必备的十大AI学术神器实际效果
  • BiliTools哔哩哔哩工具箱2026年:跨平台资源管理终极解决方案与完整指南
  • 百考通:精准匹配当前主流技术方向与行业需求,让研究更顺畅
  • 2026届必备的AI辅助论文神器实测分析
  • [特殊字符]C/C++内存管理深度解剖:从内存布局到new/delete底层,吃透面试必考核心
  • Emby高级功能终极解锁指南:免费获得完整Premiere体验的完整教程
  • 我受够了要给不同的Agent喂信息了
  • 拆解 OpenHands(14)--- Microagents
  • Synology Photos人脸识别功能突破全解析:跨设备适配与性能优化指南
  • [特殊字符]C++模板初阶通关:泛型编程核心,告别冗余代码!
  • WechatRealFriends:微信单向好友智能检测与关系管理工具
  • 探索Ryujinx:在PC上免费畅玩Switch游戏的完整指南
  • 从CAD到Web地图:LibreDWG解析DWG的坑我都帮你踩完了(Python实战)
  • AGV 自动充电是什么
  • Windows Defender Control深度解析:开源Windows Defender管理工具完全指南
  • Xilinx DDR4与DDR3多通道读写防冲突设计:高效稳定,支持最高8通道并行操作
  • 百考通:AI精准赋能,让研究更顺畅
  • LRCGet:三步解决离线音乐库歌词同步难题的终极免费工具
  • Visual C++运行库终极修复指南:一劳永逸解决DLL缺失问题
  • GeoServer实战:如何用MBTiles扩展包发布高德/谷歌多层级地图(含WPS扩展配置)
  • 从Excel到工资条:工资条生成器的数据处理之道
  • 通用GUI编程技术——Win32 原生编程实战(二十三)——GDI 双缓冲技术:消除闪烁完全指南
  • HTTP308重定向陷阱:URL路径中的隐藏斜杠问题
  • Ubuntu 24.04 挂载第二块磁盘并扩展 LVM 系统盘
  • AI深度协作:让快马平台解析真空行者理论中的复杂算法并生成优化代码
  • 实战集成:快马生成nodejs模拟api,用gitbash合并到现有企业项目
  • # 发散创新:基于事件驱动架构的实时日志监控系统设计与实现在现代软件开发中,**事件驱动编程模型**正逐步