关于大数据的建议和SQL的局限性
Posted
技术标签:
【中文标题】关于大数据的建议和SQL的局限性【英文标题】:Suggestions on big data and the limitations of SQL 【发布时间】:2016-09-15 16:36:17 【问题描述】:我开始使用数据库,但我还是新手。
我在(最初)10,000 个机构中面临与销售和访问有关的问题。我目前正在使用 Microsoft SQL。
对于这些机构中的每一个,我想用过滤器按年、月、周、日、产品、地区、机构以及这些过滤器的任何其他可能组合绘制销售和访问图表。我还需要将这些数据与来自同一地区的其他机构的数据相关联,其他条件相同(其他过滤器)。
这 2 个表将来自一个数据库,该数据库通常每个机构每年有 100 万个事务。此数据将被简化并插入到目标数据库中。
作为起点,我考虑了每个表的以下架构:
int EstablishmentId
int RegionId
int Year
int Month
int Week
int Day
int Hour
decimal Value
考虑到数据量,我认为默认情况下 SQL 服务器将无法处理它。我不是数据库方面的专家,所以我寻求了一个解决方案,我发现了分区,按年、月、周、日、产品、区域和机构(可能还有某些组合)进行分区,但显然 SQL 2016 可以处理最多 15000 个分区,因此这是不可能的。
我是来征求意见的,所以我可以寻找可能的解决方案并研究它们。我相信您比我知识渊博,因此您可以通过向我展示更好的方法来为我指明正确的方向。
最后一条信息:我会有更多的桌子。我只介绍最简单的一个。这些表格将包含经过预处理的数据,但数量很大,并带有过滤器的可能性。
提前致谢。
【问题讨论】:
你知道什么是大数据吗?这里有一个提示:这并不意味着您需要处理大量数据。 您可以在手机上运行该数据库... 您的 SQL Server 可以使用适当大小的硬件处理预期的卷。读取处理数十亿行的 sql server dba.stackexchange.com/questions/129223/… 【参考方案1】:SQL Server 可以处理的数据量实际上取决于您运行的硬件类型。您所说的将远远低于在高端硬件上运行 SQL Server 的理论阈值。
我认为您想要对分区执行的操作很可能通过表上的适当索引来完成...我认为您并不真正了解分区的功能用途。
“大数据”解决方案(我不知道您是否打算在技术意义上使用该术语,或者您是否只是在谈论相对数量的记录)可能适合您尝试做的事情,但请理解这不会是一个新手会随便插手和利用的东西。在你的情况下你能做些什么真的取决于从事该项目的开发人员的背景和专业知识。
根据您提供的少量信息,如果我要建议您寻求理解的方向,我会将您指向SQL Server Analysis Services。
【讨论】:
【参考方案2】:不要养成假设对人类来说似乎很大的数字对计算机来说也很大的习惯。使用如下所示的简单脚本很容易测试这些理论。
示例表中的一行将占用 32 个字节的数据 + 行开销 + 索引。 如果我们将其近似为每行 100 字节,那么 1M 行我们将得到 100MB。这不包括数据压缩。
100MB 是小数据,不是大数据。
SQL Server 能够处理的远不止这些,考虑到您希望对数据进行的分析,我认为它是合适的。
COLUMN STORE INDEX 非常适合这种类型的表和那种查询。
在此示例中,我生成 5M 行并在顶部放置一个简单的列存储索引。 在我的笔记本电脑上,我在底部的所有测试查询都在 1 到 3 秒内完成。考虑到我没有额外的索引,也绝对没有调整硬件或分区,我认为这已经足够了。
运行此脚本后,我的测试表占用了大约 24MB。
if object_id('table1') is not null drop table table1;
create table table1(
EstablishmentId int ,
RegionId int ,
Year int ,
Month int ,
Week int ,
Day int ,
Hour int ,
Value decimal
)
;
insert into table1(
EstablishmentId ,
RegionId ,
Year ,
Month ,
Week ,
Day ,
Hour ,
Value)
select n % 100, n % 10, n % 20, n % 12, n % 52, n % 256, n % 24, 55 * n
from (
SELECT TOP (5000000)
n = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
) data
OPTION (MAXDOP 1);
CREATE CLUSTERED COLUMNSTORE INDEX CCIX
ON table1;
exec sp_spaceused 'table1'
select sum(value) from table1 where year between 50 and 5000
select sum(value), year from table1 group by year
select sum(value), year, week from table1 where EstablishmentId = 55 group by year, week
在 SQL Server 2014 Developer Edition 上测试。
编辑:
如果您希望以此挑战为理由来玩“大数据工具”,那就继续吧。这将是一次很棒的学习经历。
【讨论】:
以上是关于关于大数据的建议和SQL的局限性的主要内容,如果未能解决你的问题,请参考以下文章