关于大数据的建议和SQL的局限性

时间:2016-09-15 16:36:18

标签: sql sql-server bigdata database

我开始使用数据库,我仍然是新手。

我在(最初)1万家企业面临与销售和访问相关的问题。我目前正在使用Microsoft SQL。

对于这些机构中的每一个,我想根据年,月,周,日,产品,地区,机构以及这些过滤器的任何其他可能组合来绘制销售和访问的图表。我还需要将这些数据与来自同一地区的其他机构的数据相关联,其他条件相同(其他过滤器)。

这两个表将从一个数据库提供,该数据库通常每个企业每年有100万笔交易。这些数据将被简化并插入目标数据库中。

作为一个起点,我考虑了每个表的以下模式:

int EstablishmentId
int RegionId
int Year
int Month
int Week
int Day
int Hour
decimal Value

考虑到数据量,我认为默认情况下SQL服务器无法处理它。我不是数据库方面的专家,所以我找到了一个解决方案,我发现了分区,按年,月,周,日,产品,区域和建立(以及某些组合,可能)进行分区,但显然SQL 2016可以处理最多15000个分区,因此无法实现。

我在这里征求意见,所以我可以照顾可能的解决方案并研究它们。我相信你比我更了解情况,所以你可以通过向我展示更好的方法来指出我正确的方向。

最后一条信息:我会有更多的桌子。我只是介绍最简单的一个。这些表格将有预处理数据,但数量很大,有过滤器可能性。

提前致谢。

2 个答案:

答案 0 :(得分:1)

SQL Server可以处理的数据量实际上取决于您运行的硬件类型。您所谈论的内容远远低于在高端硬件上运行的SQL Server的理论阈值。

我认为您想要对分区做什么可能会在您的表上使用适当的索引来完成...我认为您并不真正了解分区的功能使用。

“大数据”解决方案(我不知道你是否意味着在技术意义上使用该术语,或者如果你只是谈论相对数量的记录)可能适合你想要做的事情,但是理解这不会是一个新手只会打击和利用的东西。在您的情况下您可以做的事情将取决于从事该项目的开发人员的背景和专业知识。

根据您提供的少量信息,如果我要建议您寻求理解的方向,我会指向SQL Server Analysis Services

答案 1 :(得分:1)

不要习惯于假设一个人类看起来很大的数字对于计算机来说会很大。使用如下所示的简单脚本来测试这些理论非常容易。

示例表中的一行将占用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上测试。

修改

如果您希望将此挑战作为使用“大数据工具”的理由,那么请继续。这将是一次很棒的学习经历。