标签: data-warehouse

数据库体系结构,每天有数百万个新行

我需要为大量网站实施定制开发的网站分析服务.这里的关键实体是:

  • 网站
  • 游客

每个唯一身份访问者在数据库中都会有一行,其中包含着陆页,时间,操作系统,浏览器,引荐来源,IP等信息.

我需要对此数据库进行聚合查询,例如'COUNT所有以Windows为操作系统且来自Bing.com的访客'

我有数百个网站需要跟踪,这些网站的访问者数量从每天几百到几百万不等.总的来说,我希望这个数据库每天增长大约一百万行.

我的问题是:

1)MySQL是否是一个很好的数据库用于此目的?

2)什么是一个好的架构?我正在考虑为每个网站创建一个新表.或者,如果现有表中的行数超过100万(我的假设是正确的),则可能从单个表开始,然后生成一个新表(每日).我唯一担心的是,如果一个表变得太大,SQL查询会变得非常慢.那么,每个表应该存储的最大行数是多少?此外,MySQL可以处理的表数量是否有限制.

3)是否建议对数百万行进行聚合查询?我准备等待几秒钟来获得此类查询的结果.这是一个好的做法还是有其他方法来进行聚合查询?

简而言之,我正在尝试一种设计大规模数据仓库的设置,这将很重要.如果您了解任何已发布的案例研究或报告,那就太棒了!

mysql database analytics scalability data-warehouse

12
推荐指数
1
解决办法
4721
查看次数

SSIS - OLE DB目标 - 表或视图加载与快速加载

从我读过的内容:

表或视图数据访问模式一次提交每一行作为事务.因此,制作一个包传输500万行需要很长时间(30多分钟).

快速加载数据访问模式允许在插入目标时指定批处理行和提交大小.例如,插入500万条记录只需2分钟.

现在出现的问题是加载到DW的SSIS包之一在OLE DB目标中使用表或视图数据访问模式.根据我的理解,这是为了获取它插入的错误行(错误约束)到错误记录表中.因此,我们有一个超过30分钟的过程.反过来,对于相同的动作,快速加载将花费不到2分钟.

如果我理解正确,快速加载将无法区分哪一行导致批处理中的错误,而这又导致批处理完全失败?如果是这样,是否有另一种方法来处理这种情况,其中具有错误行的批处理由错误约束重定向,然后以批处理中的良好记录发送到正确的目的地的方式工作到目标,同时仍然发送错误记录到错误日志表中?即使这样做也是个好主意吗?是否更好地咬一口关于它需要的时间?

先感谢您.

ssis data-warehouse sql-server-2008-r2

12
推荐指数
1
解决办法
2万
查看次数

星型模式,规范化维度,非规范化层次结构级别密钥

给出以下星型模式表.

  • 事实上,两个维度,两个措施.

#   geog_abb  time_date amount     value
#1:       AL 2013-03-26  55.57 9113.3898
#2:       CO 2011-06-28  19.25 9846.6468
#3:       MI 2012-05-15  94.87 4762.5398
#4:       SC 2013-01-22  29.84  649.7681
#5:       ND 2014-12-03  37.05 6419.0224
Run Code Online (Sandbox Code Playgroud)
  • 地理维度,单层次结构,层次结构中的3个级别.

#   geog_abb  geog_name geog_division_name geog_region_name
#1:       AK     Alaska            Pacific             West
#2:       AL    Alabama East South Central            South
#3:       AR   Arkansas West South Central            South
#4:       AZ    Arizona           Mountain             West
#5:       CA California            Pacific             West
Run Code Online (Sandbox Code Playgroud)
  • 时间维度,两个层次结构,每个层次结构4个级别.

#    time_date time_weekday time_week time_month time_month_name time_quarter time_quarter_name time_year
#1: 2010-01-01       Friday …
Run Code Online (Sandbox Code Playgroud)

data-modeling data-warehouse star-schema database-normalization data.cube

12
推荐指数
2
解决办法
1136
查看次数

是否可以在Oracle中部分刷新物化视图?

我有一个非常复杂的Oracle视图,基于其他物化视图,常规视图以及一些表(我无法"快速刷新"它).大多数情况下,此视图中的现有记录基于日期并且是"稳定的",新记录集具有新日期.

偶尔,我会收到回复日期.我知道那些是什么以及如果我维持一张桌子如何处理它们,但我想保持这个"观点".完全刷新大约需要30分钟,但任何给定日期只需25秒.

我是否可以指定只应更新物化视图的一部分(即受影响的日期)?

我是否必须废弃视图并使用表和过程来填充或刷新该表中的给定日期?

oracle partitioning materialized-views data-warehouse

11
推荐指数
2
解决办法
8158
查看次数

从头开始构建OLAP解决方案时,我应该考虑什么?

我正在为一家运行基于MS SQL数据库服务器的软件产品的公司工作,多年来我用PHP开发了20-30个非常先进的报告,直接从数据库中获取数据.这非常成功,人们对此很满意.

但它有一些缺点:

  • 对于新的变化,它可能是非常发展的
  • 用户无法对数据进行多少实验 - 它被锁定到硬编码视图
  • 大报告可能会很慢

我正在考虑逐步采用基于OLAP的方法,可以从Excel或某些基于Web的服务查询.但我想以一种在IT环境中引入最少量新复杂性的方式来实现这一点 - 最少量的不同服务,同步工作等!

我在这方面有一些问题:

1)与工作流程相关:

  • 从"黑匣子SQL服务器"到"OLAP准备就绪"的良好发展路线是什么?
  • 应该设置哪些服务器和服务,以及应该编写哪些脚本?
  • 哪些是最难/最关键/最耗时的部分?

2)ETL:

  • 我想最好为他们的数据仓库和生产SQL提供单独的服务器?
  • 这些如何保持同步(推/拉)?使用哪些技术/语言?
  • 对我来说,SSIS看起来过于复杂,而且图形工作流对我来说并不吸引人 - 我宁愿喜欢基于文本的脚本来完成这项工作.这可行吗?
  • 或者仅使用一个源和一个目的地的图形客户端是否有利?

3)发展:

  • 从CLI工具可以有效维护多少(数据集成,分析服务)?
  • 设置是否可以轻松地在生产和开发之间来回切换?

我对任何涵盖其中一部分的答案感到满意 - 即使它是一个MS环境,我也很想知道其他技术的优势.

sql-server olap ssis data-warehouse business-intelligence

11
推荐指数
1
解决办法
2158
查看次数

使用Python的ETL

我正在研究数据仓库并寻找使用Python的ETL解决方案.我曾使用过SnapLogic作为ETL,但我想知道是否还有其他解决方案.

这个数据仓库刚刚开始.我还没有带来任何数据.它将很容易超过100演出与我想要加载到它的初始数据子集.

python etl data-warehouse

11
推荐指数
1
解决办法
5921
查看次数

"增量负荷"是什么意思?

我在阅读文章时经常看到" 增量加载 " 这个词

真正(技术上)意味着什么?这意味着什么?

使用用例的解释是受欢迎的.

database terminology data-warehouse

11
推荐指数
1
解决办法
2万
查看次数

如何创建历史事实表?

我的数据仓库中有一些实体:

  1. - 具有属性personId,dateFrom,dateTo和其他可以更改的人,例如姓氏,出生日期等 - 慢慢变化的维度

  2. 文档 - documentId,数字,类型

  3. 地址 - addressId,city,street,house,flat

(人与文件)之间的关系是一对多,(人与地址)是多对多的.

我的目标是创建历史事实表,可以回答以下问题:

  1. 哪些人在规定的日期定义了哪些文件?

2,居民的定义地址在规定的时间间隔内有什么历史?

这不仅适用于DW的设计,但我认为这是DW设计中最难的事情.

例如,布朗小姐的personId = 1,自01/01/2005至02/02/2010以来,documentId = 1且documentId = 2的文档已经存在于addressId = 1的地址,然后移至addressId = 2从2010年2月2日开始生活到当前日期(NULL?).但她自2006年5月4日起将姓氏改为格林夫人,自2007年7月6日起,她的第一份文件记录为documentId = 1至documentId = 3.带有personId = 2的Bl​​ack先生,自2010年2月2日至今日,documentId = 4一直存在于addressId = 1.

对于问题2的查询的预期结果,其中addressId = 1,时间间隔是从01/01/2000到现在,必须如下:

行:

last_name="Brown", documentId=1, dateFrom=01/01/2005, dateTo=04/04/2006

last_name="Brown", documentId=2, dateFrom=01/01/2005, dateTo=04/04/2006

last_name="Green", documentId=1, dateFrom=04/05/2006, dateTo=06/06/2007

last_name="Green", documentId=2, dateFrom=04/05/2006, dateTo=06/06/2007

last_name="Green", documentId=2, dateFrom=06/07/2007, dateTo=02/01/2010

last_name="Green", documentId=3, dateFrom=06/07/2007, dateTo=02/01/2010

last_name="Black", documentId=4, dateFrom=02/03/2010, dateTo=NULL
Run Code Online (Sandbox Code Playgroud)

我有一个想法,用复合键(personId,documentId,addressId,dateFrom)创建事实表,但我不知道如何加载此表,然后使用此结构获得预期的结果.

我会很高兴得到任何帮助!

sql data-warehouse fact-table datahistory

11
推荐指数
1
解决办法
3817
查看次数

OLAP - 计算径流三角形,样本数据和包含的多维数据集(PostgreSQL/Mondrian)

现实描述:我们有一个项目列表.在每个项目中都有很多账户.您可以对每个帐户执行大量操作.我确实有以下维度和事实表定义(简化):

Dimensions and attributes:
 Project
  project_key
  project_name
  industry
  number_of_accounts
 Distance
  distance_key
  distance_in_months
  distance_in_quarters
 Account
  account_key
  project_key
  account_id
Fact Table and attributes:
 Action_Fact_Table
  project_key
  distance_key
  account_key
  action_id
Run Code Online (Sandbox Code Playgroud)

现在,我想使用径流三角形方法来分析数据(它可能不是真正的径流三角形,但方法是相同的).最简单的三角形看起来像:

              Distance in Months
Project name|     1    2    3    4    5    6    7    8    9    10
-------------------------------------------------------------------------
 Project1   |     5   10   15   20   25   30   35   40   45    50
 Project2   |     7   14   21   28   35   42   49   56   63
 Project3   |     2    5    8   11   14   20   25   30
 Project4   |     0    2 …
Run Code Online (Sandbox Code Playgroud)

olap ssas mdx data-warehouse mondrian

11
推荐指数
1
解决办法
1597
查看次数

从仅在值更改时记录的表中推断每日历史值(PostgreSQL 9.3)

我有一个表,每当位置的分数发生变化时,该表就会记录一行。

score_history:

  • id int PK(UUID自动递增int)
  • 时间戳(发生变化时)
  • location_id int FK(值用于的位置)
  • 分数浮动(新分数)

这样做是出于效率的考虑,并且能够简单地检索给定位置的更改列表并很好地实现了该目的。

我正在尝试以非常冗余的格式输出数据,以帮助将其加载到严格的外部系统中。外部系统希望每个位置*每个日期都有一行。目标是代表每个日期每个位置的最后得分值。因此,如果分数在给定日期中更改了3次,则只有最接近午夜的分数才被视为该位置当天的分数。我想这类似于创建关闭业务库存级别事实表的挑战。

我有一个方便的星形模式样式日期维表,其中每个日期都有一行,完全覆盖了此示例期间以及未来的日期。

那张桌子看起来像

dw_dim_date:

  • 日期日期PK
  • 一堆其他列,例如星期数,is_us_holiday等。

因此,如果我在score_history表中只有3条记录...

1, 2019-01-01:10:13:01, 100, 5.0
2, 2019-01-05:20:00:01, 100, 5.8
3, 2019-01-05:23:01:22, 100, 6.2
Run Code Online (Sandbox Code Playgroud)

所需的输出将是:

2019-01-01, 100, 5.0 
2019-01-02, 100, 5.0 
2019-01-03, 100, 5.0
2019-01-04, 100, 5.0 
2019-01-05, 100, 6.2
Run Code Online (Sandbox Code Playgroud)

3要求:

  1. 即使该天没有分数记录,每个位置每天也要排一行。
  2. 如果当天有分数记录,则午夜之前的最后一个应该是该行的分数值。如果出现平局,则两者中的较大者应“获胜”。
  3. 如果当天的分数记录为零,则分数应为最近的先前分数。

我一直在通过子查询和窗口函数来追踪自己的尾巴。

因为我不愿意发布没有任何内容的东西,所以我将分享这个火车残骸,它会产生输出,但没有任何意义...

SELECT dw_dim_date.date,
       (SELECT score 
        FROM score_history 
        WHERE score_history.happened_at::DATE < dw_dim_date.date 
           OR score_history.happened_at::DATE = dw_dim_date.date 
        ORDER BY score_history.id desc limit 1) as last_score
FROM dw_dim_date
WHERE dw_dim_date.date > '2019-06-01' …
Run Code Online (Sandbox Code Playgroud)

sql postgresql data-warehouse postgresql-9.3

11
推荐指数
1
解决办法
242
查看次数