我有一个正在进行的项目需要以下内容:
- 创建规范化样本 rdbms(5 个表)
- 使用 Java 我向每个表输入了 100 万行数据
- 在规范化表上运行两个 OLTP 和两个 OLAP 查询。
- 非规范化表格。
- 对它们运行相同的 OLTP 和 OLAP 查询并比较时间。
OLAP 查询是什么意思?我已经在互联网上搜索过,我能找到的只是我必须制作一个立方体,并在其上应用查询。如何在 RDBMS 上编写 OLAP 查询?我有一个样本: 表格规范化(订单、产品、客户、分支机构、销售)
- 销售:order_id,product_id,数量
- 产品:product_id,name,description,price,sales_tax
- 客户:customer_id,f_name,l_name,tel_no,addr,nic,city
- 分支机构:branch_id,name,tel_no,addr,city
- 订单:order_id、customer_id、order_date、branch_id
我想在上面的表上写一个 OLAP 查询。我将 Oracle Express 与 SQL Developer 结合使用。
最佳答案
有一些 SQL 函数有时称为“分析”、“窗口化”或“OLAP”,具体取决于您使用的 RDBMS。在某些情况下,它们可以提供巨大的性能改进,通常是在您比较同一组数据中的行的情况下,否则这将需要自连接。
当您使用 Oracle 时,我衷心建议您访问 asktom.oracle.com 并搜索“analytics rock”——您会发现一些很好的示例,这些示例解释得很好,而且比阅读 Oracle 文档更容易,which is here.
一些注意事项:它们不是严格意义上的“关系”,因为关系理论不涉及元组的顺序;它们在查询的其他部分之后执行 - 即在过滤和聚合之后;一些数据库在较小程度上实现了它们。
我看到 Oracle 也有一个单独的 OLAP 产品来处理多维数据集,但这是目前企业版的一个单独许可的选项,所以如果您使用的是 Express 版,我认为这不是您所指的。
编辑
这是一个大致基于您的数据模型的简单示例,它展示了如何使用分析函数来获取运行总计,如果没有它们,这并不简单:-
select
o.customerid,
o.orderid,
o.orderdate,
p.price,
sum (p.price) over (partition by o.customerid order by o.orderdate) running_total
from orders o
inner join sales s on o.orderid = s.orderid
inner join product p on s.productid = p.productid
这给出了(对于我输入的一些简单数据):-
CUSTOMERID ORDERID ORDERDATE PRICE RUNNING_TOTAL
-------------------- -------------------- --------- ----- -------------
1 1 01-JAN-12 30 30
1 2 01-MAR-12 30 60
1 3 01-APR-12 30 90
1 4 01-MAY-12 30 120
关于sql - 编写 OLAP SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13900229/