我需要为大量网站实施定制开发的网站分析服务.这里的关键实体是:
每个唯一身份访问者在数据库中都会有一行,其中包含着陆页,时间,操作系统,浏览器,引荐来源,IP等信息.
我需要对此数据库进行聚合查询,例如'COUNT所有以Windows为操作系统且来自Bing.com的访客'
我有数百个网站需要跟踪,这些网站的访问者数量从每天几百到几百万不等.总的来说,我希望这个数据库每天增长大约一百万行.
我的问题是:
1)MySQL是否是一个很好的数据库用于此目的?
2)什么是一个好的架构?我正在考虑为每个网站创建一个新表.或者,如果现有表中的行数超过100万(我的假设是正确的),则可能从单个表开始,然后生成一个新表(每日).我唯一担心的是,如果一个表变得太大,SQL查询会变得非常慢.那么,每个表应该存储的最大行数是多少?此外,MySQL可以处理的表数量是否有限制.
3)是否建议对数百万行进行聚合查询?我准备等待几秒钟来获得此类查询的结果.这是一个好的做法还是有其他方法来进行聚合查询?
简而言之,我正在尝试一种设计大规模数据仓库的设置,这将很重要.如果您了解任何已发布的案例研究或报告,那就太棒了!
从我读过的内容:
表或视图数据访问模式一次提交每一行作为事务.因此,制作一个包传输500万行需要很长时间(30多分钟).
快速加载数据访问模式允许在插入目标时指定批处理行和提交大小.例如,插入500万条记录只需2分钟.
现在出现的问题是加载到DW的SSIS包之一在OLE DB目标中使用表或视图数据访问模式.根据我的理解,这是为了获取它插入的错误行(错误约束)到错误记录表中.因此,我们有一个超过30分钟的过程.反过来,对于相同的动作,快速加载将花费不到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)
# 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)
# 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
我有一个非常复杂的Oracle视图,基于其他物化视图,常规视图以及一些表(我无法"快速刷新"它).大多数情况下,此视图中的现有记录基于日期并且是"稳定的",新记录集具有新日期.
偶尔,我会收到回复日期.我知道那些是什么以及如果我维持一张桌子如何处理它们,但我想保持这个"观点".完全刷新大约需要30分钟,但任何给定日期只需25秒.
我是否可以指定只应更新物化视图的一部分(即受影响的日期)?
我是否必须废弃视图并使用表和过程来填充或刷新该表中的给定日期?
我正在为一家运行基于MS SQL数据库服务器的软件产品的公司工作,多年来我用PHP开发了20-30个非常先进的报告,直接从数据库中获取数据.这非常成功,人们对此很满意.
但它有一些缺点:
我正在考虑逐步采用基于OLAP的方法,可以从Excel或某些基于Web的服务查询.但我想以一种在IT环境中引入最少量新复杂性的方式来实现这一点 - 最少量的不同服务,同步工作等!
我在这方面有一些问题:
1)与工作流程相关:
2)ETL:
3)发展:
我对任何涵盖其中一部分的答案感到满意 - 即使它是一个MS环境,我也很想知道其他技术的优势.
我正在研究数据仓库并寻找使用Python的ETL解决方案.我曾使用过SnapLogic作为ETL,但我想知道是否还有其他解决方案.
这个数据仓库刚刚开始.我还没有带来任何数据.它将很容易超过100演出与我想要加载到它的初始数据子集.
我在阅读文章时经常看到" 增量加载 " 这个词
真正(技术上)意味着什么?这意味着什么?
使用用例的解释是受欢迎的.
我的数据仓库中有一些实体:
人 - 具有属性personId,dateFrom,dateTo和其他可以更改的人,例如姓氏,出生日期等 - 慢慢变化的维度
文档 - documentId,数字,类型
地址 - addressId,city,street,house,flat
(人与文件)之间的关系是一对多,(人与地址)是多对多的.
我的目标是创建历史事实表,可以回答以下问题:
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的Black先生,自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)创建事实表,但我不知道如何加载此表,然后使用此结构获得预期的结果.
我会很高兴得到任何帮助!
现实描述:我们有一个项目列表.在每个项目中都有很多账户.您可以对每个帐户执行大量操作.我确实有以下维度和事实表定义(简化):
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) 我有一个表,每当位置的分数发生变化时,该表就会记录一行。
score_history:
这样做是出于效率的考虑,并且能够简单地检索给定位置的更改列表并很好地实现了该目的。
我正在尝试以非常冗余的格式输出数据,以帮助将其加载到严格的外部系统中。外部系统希望每个位置*每个日期都有一行。目标是代表每个日期每个位置的最后得分值。因此,如果分数在给定日期中更改了3次,则只有最接近午夜的分数才被视为该位置当天的分数。我想这类似于创建关闭业务库存级别事实表的挑战。
我有一个方便的星形模式样式日期维表,其中每个日期都有一行,完全覆盖了此示例期间以及未来的日期。
那张桌子看起来像
dw_dim_date:
因此,如果我在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要求:
我一直在通过子查询和窗口函数来追踪自己的尾巴。
因为我不愿意发布没有任何内容的东西,所以我将分享这个火车残骸,它会产生输出,但没有任何意义...
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) data-warehouse ×10
database ×2
olap ×2
sql ×2
ssis ×2
analytics ×1
data.cube ×1
datahistory ×1
etl ×1
fact-table ×1
mdx ×1
mondrian ×1
mysql ×1
oracle ×1
partitioning ×1
postgresql ×1
python ×1
scalability ×1
sql-server ×1
ssas ×1
star-schema ×1
terminology ×1