存储图数据的数据库 FlockDB

时间:2025-02-03 03:38:29 作者:yincaixxx 综合材料 收藏本文 下载本文

【导语】“yincaixxx”通过精心收集,向本站投稿了5篇存储图数据的数据库 FlockDB,下面是小编整理后的存储图数据的数据库 FlockDB,欢迎大家阅读借鉴,并有积极分享。

篇1:存储图数据的数据库 FlockDB

FlockDB是一个存储图数据的数据库,但是它并没有优化遍历图的操作,它优化的操作包括:超大规模邻接矩阵查询,快速读写和可分页查询。

a high rate of add/update/remove operations

potientially complex set arithmetic queries

paging through query result sets containing millions of entries

ability to “archive” and later restore archived edges

horizontal scaling including replication

online data migration

FlockDB将图存储为一个边的集合,每条边用两个代表顶点的64位整数表示。对于一个社会化网络图,这些顶点ID即用户ID,但是对于“收藏” 推文这 样的边,其目标顶点(destination id)则是一条推文的ID。每一条边都被一个64位的位置信息标识,用于排序。(Twitter在“关注”类的边上用了时间戳标识,所以你的关注者列表时 按时间排序的,最新的在最前面。)

当一条边被“删除”,这条记录并没有从MySQL中真正删除,而是标记为“删除”状态,这会影响到主键值(一个由源ID-source id,状态-position,位置-position构成的组合键)。类似的,用户账户被删除时,他们所有的边都会改为存档(archive)状态,允 许之后被恢复(但是根据服务协议,我们只会保留一段时间)。我们只保留了一个组合主键和一个辅助索引来完成所有的查询。这种表结构优化使得MySQL大放 异彩,并提供给我们可预测的性能。

一条复杂的查询例如“我关注的人里面哪些关注了 总统”能分解成一些单用户查询(谁在关注 总统),并很快响应,

数据根据节点分块,所以这些查询能分别在各自的数据块,通过一个索引过的范围查询得到结果。类似的,遍历一个长结果集是用位置作为游标,而不是用LIMIT/OFFSET,所有页的数据均被索引,访问一样快。

基于进入系统的时间,写操作具有幂等性(不管操作多少次结果都不变的性质,比如取绝对值的函数就具有幂等性)和交换性(操作顺序不影响结果,比如加法就具 有交换性)。因为能交换操作顺序而不影响最终结果,所以我们才能在网络或者硬件临时故障的时候记录下所有操作或者恢复几分钟甚至几小时之前丢失的数据。这 种性质在初次部署是尤其有用。

可交换的写操作简化了新数据块的创建流程。一个新数据块能在即时处理写请求的同时,在后台慢慢从旧数据块导入数据。导入完成时,该数据块即处于“激活”状态,并准备处理读操作。

应用服务器(昵称flapps)用Scala编写,无状态,可水平伸缩。flapps与数据库独立,随着查询负载增加,我们可以增加更多的flapps。Flapps暴露了很少的thrift API给客户端,我们写的Ruby客户端包含更丰富的接口。

我们使用Gizzard库来处理数据分块层。该层将一段源ID映射到物理数据库,对于同一个物理地址的表,通过建立树来处理。写操作在本地登记后即返回,这样数据库崩溃或者出现性能问题能有效跟网站相应时间解耦。

图的每一条边都被存储了两次:一次正向存储(根据源ID做索引和分块),一次反向存储(根据目的ID做索引和分块)。这样类似于“谁在关注我”这样的查询可以跟查询“我在关注谁”一样高效,并且所有结果数据都分布在同一块。

结果是我们拥有了一个可以按需扩展的一般服务器集群。在这个冬天,我们不知不觉已经增加了50%的数据库容量。现在我这个数据库里存储了130亿条边,峰值可承受负载达到每秒2万次写和10万次读。

介绍内容来自 article.yeeyan.org/view/yangxiao/136627

项目主页:www.open-open.com/lib/view/home/1322728059718

篇2:数据库面试题:存储过程

存储过程和函数的区别是什么?

答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。

而函数通常是数据库已经定义的方法,它接收参数并返回某种类型的值,并且不涉及特定用户表,例如聚集函数avg、max、count等,日期时间单数day、month等。

PL/SQL(Procedural Language/SQL, PL/SQL)是编写数据库存储过程的一种过程语言,它结合了SQL的数据操纵能力

和过程化语言的流程控制能力,是SQL的过程化扩展。

综上PL/SQL就是对数据的操纵过程化

存储过程的优点

它是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。

1、由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因而运行效率高,

它提供了在服务器端快速执行SQL语句的有效途径。

2、存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。

3、方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能方便地进行维护。当用户规则发生变化时,只需要修改存储过程,无需修改其他应用程序。

[数据库面试题:存储过程]

篇3:一个将数据分页的存储过程数据库教程

存储过程|分页|数据

CREATE PROCEDURE sp_page

@tb        varchar(50), --表名

@col       varchar(50), --按该列来进行分页

@coltype   int,        --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型

@orderby   bit,        --排序,0-顺序,1-倒序

@collist   varchar(800),--要查询出的字段列表,*表示全部字段

@pagesize  int,        --每页记录数

@page      int,        --指定页

@condition varchar(800),--查询条件

@pages     int OUTPUT  --总页数

AS

/*

功能描述:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序

查询可以指定页大小、指定查询任意页、指定输出字段列表,返回总页数

作   者:pbsql

版   本:1.10

最后修改:2004-11-29

*/

DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)

IF @condition is null or rtrim(@condition)=''

BEGIN--没有查询条件

SET @where1=' WHERE '

SET @where2=' '

END

ELSE

BEGIN--有查询条件

SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件

SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件

END

SET @sql='SELECT @pages=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+

') FROM '+@tb+@where2

EXEC sp_executesql @sql,N'@pages int OUTPUT',@pages OUTPUT--计算总页数

IF @orderby=0

SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+

' FROM (SELECT“>'+@tb+@where1+@col+'>(SELECT MAX('+@col+') '+

' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+

@col+' FROM '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col

ELSE

SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+

' FROM '+@tb+@where1+@col+'<(SELECT MIN('+@col+') '+

' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+

@col+' FROM '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+

@col+' DESC'

IF @page=1--第一页

SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+' FROM '+@tb+

@where2+'ORDER BY '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END

EXEC(@sql)

GO

本存储过程高效,曾用500万条数据测试(已建索引),只返回分页只需3秒,影响效率的地方是计算总页数,若不需要可以注释掉

--测试示例

declare @pages int

select identity(int,1,1) id,getdate dt,xx=cast('' as varchar(10)) into #t

from sysobjects

update #t set dt=dateadd(day,id-200,dt),

xx='xxxx'+right('000000'+cast(id as varchar(10)),6)

exec sp_page '#t','id',0,0,'*',10,2,'',@pages output--按id顺序取第二页

exec sp_page '#t','id',0,1,'*',10,2,'',@pages output--按id倒序取第二页

exec sp_page '#t','xx',1,0,'*',10,3,'',@pages output--按xx顺序取第三页

exec sp_page '#t','xx',1,1,'*',10,3,'',@pages output--按xx倒序取第三页

exec sp_page '#t','dt',2,0,'*',10,2,'',@pages output--按dt顺序取第二页

exec sp_page '#t','dt',2,1,'*',10,2,'',@pages output--按dt倒序取第二页

select 总页数=@pages

drop table #t

篇4:管理存储过程数据库教程

12.3.1 查看存储过程

存储过程被创建以后,它的名字存储在系统表sysobjects 中;它的源代码存放在系统表syscomments 中,可以通过MS SQL Server 提供的系统存储过程来查看关于用户创建的存储过程信息。

1通过Enterprise Manager 管理工具同样可以查看存储过程的源代码

其操作如下:

(1) 启动Enterprise Manager, 登录到要使用的服务器。

(2) 选择要创建存储过程的数据库,在左窗格中单击Stored Procedure 文件夹,此时在右窗格中显示该数据库的所有存储过程。

(3) 在右窗格中,右击要查看源代码的存储过程,在弹出的菜单中选择Properties选项,此时便可看到存储过程的源代码。如图12-4 所示:

2 使用sp_helptext 存储过程查看存储过程的源代码

其语法格式如下:

sp_helptext 存储过程名称

例如要查看数据库pubs 是否是存储过程reptq1 的源代码,则执行sp_helptext reptq1。

注意:如果在创建存储过程时使用了WITH ENCRYPTION选项,那么无论是使用Enterprise Manager还是系统存储过程sp_helptext都无法查看到存储过程的源代码。

12.3.2 重新命名存储过程

修改存储过程的名字使用系统存储过程sp_rename。 其命令格式为:

sp_rename 原存储过程名, 新存储过程名

例12-4 :将存储过程reptq1 修改为newproc 其语句为:

sp_rename reptq1, newproc

另外,通过Enterprise Manager 也可修改存储过程的名字,其操作过程与WINDOWS 下修改文件名字的操作类似。即首先选中需修改名字的存储过程,然后右击鼠标,在弹出菜单中选取rename 选项,最后输入新存储过程的名字。

12.3.3 删除存储过程

删除存储过程使用drop 命令,drop 命令可将一个或多个存储过程或者存储过程组从

当前数据库中删除。其语法规则为:

DROP PROCEDURE {procedure}} [,…n]

例12-5: 如将存储过程reptq1 从数据库中删除,则执行:

drop procedure reptq1

12.3.4 执行存储过程

执行已创建的存储过程使用EXECUTE 命令,其语法如下:

[EXECUTE]

{[@return_statur=]

{procedure_name[;number] | @procedure_name_var}

[[@parameter=] {value | @variable [OUTPUT] | [DEFAULT] [,…n]

[WITH RECOMPILE]

各参数的含义如下:

@return_status

是可选的整型变量,用来存储存储过程向调用者返回的值,

@procedure_name_var

是一变量名用来代表存储过程的名字。

其它参数据和保留字的含义与CREATE PROCEDURE 中介绍的一样。

例12-6: 该存储过程被用来将两个字符串连接成一个字符串,并将结果返回。创建存储过程:

12.3.5 修改存储过程

修改以前用CREATE PROCEDURE 命令创建的存储过程,并且不改变权限的授予情况以及不影响任何其它的独立的存储过程或触发器常使用ALTER PROCEDURE 命令。其语法规则是:

ALTER PROC[EDURE] procedure_name [;number]

[ {@parameter data_type } [VARYING] [= default] [OUTPUT]] [,...n]

[WITH

{RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}]

[FOR REPLICATION]

AS

sql_statement [...n]

其中各参数和保留字的具体含义请参看CREATE PROCEDURE 命令。

下面将举一个例子使读者对该命令有更为深刻的理解。

将该段代码输入到SQL Server Query Analyzer 窗口中运行后结果为:

注意:由于在ALERT PROCEDURE中使用了WITH ENCTYPTION保留字,所以在查看修改后的存储过程源代码时看到是一些代码。

篇5:一个将数据导出到EXCEL的存储过程数据库教程

excel|存储过程|数据

/*--数据导出EXCEL

导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件

,如果文件不存在,将自动创建文件

,如果表不存在,将自动创建表

基于通用性考虑,仅支持导出标准数据类型

作者:邹建

--*/

/*--调用示例

p_exporttb @sqlstr='select * from 地区资料'

,@path='c:\\',@fname='aa.xls',@sheetname='地区资料'

--*/

create proc p_exporttb

@tbname sysname,   --要导出的表名

@path nvarchar(1000),  --文件存放目录

@fname nvarchar(250)='' --文件名,默认为表名

as

declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int

declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)

--参数检测

if isnull(@fname,'')='' set @fname=@tbname+'.xls'

--检查文件是否已经存在

if right(@path,1)'' set @path=@path+''

create table #tb(a bit,b bit,c bit)

set @sql=@path+@fname

insert into #tb exec master..xp_fileexist @sql

--数据库创建语句

set @sql=@path+@fname

if exists(select 1 from #tb where a=1)

set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE'

+';CREATE_DB=”'+@sql+'“;DBQ='+@sql

else

set @constr='Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=”Excel 8.0;HDR=YES'

+';DATABASE='+@sql+'\"'

--连接数据库

exec @err=sp_oacreate 'adodb.connection',@obj out

if @err0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@constr

if @err0 goto lberr

/*--如果覆盖已经存在的表,就加上下面的语句

--创建之前先删除表/如果存在的话

select @sql='drop table ['+@tbname+']'

exec @err=sp_oamethod @obj,'execute',@out out,@sql

--*/

--创建表的SQL

select @sql='',@fdlist=''

select @fdlist=@fdlist+',['+a.name+']'

,@sql=@sql+',['+a.name+'] '

+case when b.name in('char','nchar','varchar','nvarchar') then

'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')'

when b.name in('tynyint','int','bigint','tinyint') then 'int'

when b.name in('smalldatetime','datetime') then 'datetime'

when b.name in('money','smallmoney') then 'money'

else b.name end

FROM syscolumns a left join systypes b on a.xtype=b.xusertype

where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp')

and object_id(@tbname)=id

select @sql='create table ['+@tbname

+']('+substring(@sql,2,8000)+')'

,@fdlist=substring(@fdlist,2,8000)

exec @err=sp_oamethod @obj,'execute',@out out,@sql

if @err0 goto lberr

exec @err=sp_oadestroy @obj

--导入数据

set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES

;DATABASE='+@path+@fname+''',['+@tbname+'$])'

exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname)

return

lberr:

exec sp_oageterrorinfo 0,@src out,@desc out

lbexit:

select cast(@err as varbinary(4)) as 错误号

,@src as 错误源,@desc as 错误描述

select @sql,@constr,@fdlist

GO

========================================

NinGoo注:

Excel文件每个工作表不能超过65536条记录

解决办法:

.如果数据量大于65536,可以在调用存储过程前先将要导出的table拆分成几个小的临时table,然后

在分别导出到不同的工作表中

Sybase数据库中存储过程的建立和使用

数据库设计文档范文

数据库参考文献格式

如何掌握 Oracle 中的时间间隔型数据数据库教程

如何无需编程便将数据SQL导出到MYSQL数据库教程

数据库管理英文简历

一个分页存储过程代码

数据管理制度

数据报告

mysql使用存储过程制造测试数据

存储图数据的数据库 FlockDB(精选5篇)

欢迎下载DOC格式的存储图数据的数据库 FlockDB,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档