SQL2005 Anerlysis Service的处理维度中一个BUG的分析

BUG的帽子虽然不能随便扣,大部分情况下,开发者行为才是不可信因素,但是我google整个中英文互联网也没有发现一个和合理的解释,姑且把它认为是BUG了

 

硬件环境:IBM 3650 4G内存

系统平台:Windows2003,SQL2005

运行环境:SQLServer2005数据库(下文称为原始库),SQLServer Anerlysis Service(下文成为SSAS)

 

描述:

无数应用库向原始库定时分发数据,SSAS通过原始库处理多维数据集。从任何角度讲都应该把原始库和ssas分开两台服务器,但是由于某些问题一直没有处理,暂不考虑他们之间负载的影响。由于以前数据量不是很大,系统稳定运行了1年多。

 

问题由来:

有两个表的数据量逐月增加,目前都为千万左右。多维数据集处理作业开始不稳定,经常失败,且频率上升。

 

问题描述1:

两个表对应的维度处理失败,开始的时候报内存超过13xxM限制。

 

解决办法1:

修改了ssas服务器配置文件和系统虚拟内存大小后稳定。

 

问题描述2:

随着数据量进一步增长,经常发生维度处理缓慢,甚至半天都无法完成,而一旦这两个维度处理成功则接下来作业正常。

 

解决办法2:

分析了好长时间,加上google,也没有发现问题所在。于是从结构和处理过程上分析。

 

分析内容:

1、两张表对应的两个维度都在键属性处理中,生成了索引完毕后数个小时没有反映,按照处理过程,这时应该处理对应的层次结构。

2、还有一个奇怪的问题:我的表中有800万数据,他在处理中读取了800万数据后,会显示已读取1600万数据,差不多翻了一倍。

3、观察OLAP数据文件,OLAP/DATA/数据库名/维度名/ 目录下的文件,这时会有两套文件存在,一套为上次成功处理的文件,一套为正在处理中的文件,文件名已递增的数字前缀区分,后面的都一样。

3.1 而这时比较两套文件会发现,目前处理中的每个文件几乎都为上次成功文件的两倍大小。

3.2 新处理文件的部分文件大小为0K,而老文件为几十M,文件名大致为 数字前缀.维度名.xxx.fact.map.xxx

3.3 终止当前响应缓慢的处理后,新的文件会被删除。

4、此时系统剩余内存大致在500M到1G之间波动,SQLSever内存使用稳定在1G多,而Msmdsrv.exe也就是ssas的进程占用内存在1G到1.5G之间波动,应该不关运行环境的事情。

 

判断:

于是很容易从逻辑上把这几个特征关联起来,操作系统还没有达到不能忍受的地步,问题出在SSAS本身。

索引生成后无法为事实表的维度生成层次结构,怀疑SQL把上次处理过的结果和本次带处理的结果叠加导致数据量翻倍。于是生成的维度文件中有大量键属性重复,而无法生成层次结构,导致几个文件无法生成一直0K,处理程序数个小时没有反映。

不解的是,这个问题不是必然发生...(这是我把它定为Bug的最大理由)

 

尝试解决:

把上次的结果清掉,我没有测试调整维度处理对话框中的处理选项,只是把两个维度的属性作了调整,强制重新发布,这样上次处理的结果将被删掉,这个维度全部重新处理,问题得到解决。

 

之后再想调整处理属性发现不论用什么方式处理,即便是以前失败的处理方式,也没有再发生问题...调整处理选项参数的方法只能等待下次问题再现的时候了,可能是明天也可能是很久以后:(

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 SQL 一个过程(存储过程或函数)的最大行数通常取决于所使用的数据库管理系统(DBMS)的限制。不同的 DBMS 有不同的限制。 例如,在 MySQL ,存储过程的最大行数默认为 65,535 行,但可以通过设置 max_sp_recursion_depth 参数来增加行数。在 Microsoft SQL Server ,存储过程的最大行数为 2,097,152 行。 总之,具体的行数限制取决于使用的 DBMS,可以查看相应的文档以获取更多信息。 ### 回答2: 在SQL一个存储过程的代码行数没有明确的限制。实际上,一个存储过程可以包含任意数量的代码行,具体取决于存储过程的复杂性和功能需求。 存储过程是一段预定义的SQL代码块,用于执行特定的数据库操作。它可以包括声明变量、定义流程控制逻辑、使用循环、条件语句和各种SQL语句等。 存储过程的长度通常是根据数据库管理系统的限制来确定。不同的数据库管理系统可能会有不同的代码行数限制。例如,MySQL数据库存储过程的最大长度为64KB,Oracle数据库一个存储过程的最大长度为2GB。 总体而言,编写存储过程时应该遵循一些最佳实践,以提高代码的可读性和可维护性。这包括使用注释、模块化设计、避免冗余代码和保持代码简洁性等。此外,过长的存储过程可能会导致执行效率下降,因此也应该考虑将代码拆分为多个存储过程或使用其他方式进行性能优化。 总之,在SQL,存储过程的代码行数没有明确的限制,而是取决于数据库管理系统的限制和实际需求。 ### 回答3: 在SQL,最大可写的行数取决于数据库管理系统(DBMS)的限制。一般来说,对于大多数常见的DBMS,没有明确的行数限制。然而,实际上编写一个过程时,最大可写的行数还是会有一些限制。 首先,SQL过程的行数限制很大程度上取决于DBMS对于SQL代码长度的限制。每个DBMS都有自己的限制,例如Oracle数据库在PL/SQL过程的限制为32000个字符。 其次,行数的限制还会受到DBMS内存和存储限制的影响。当过程的代码行数超过DBMS的内存和存储限制时,可能会导致运行时错误或性能问题。 此外,实际情况还需考虑到代码的可读性和可维护性。如果一个过程的代码行数过多,不仅会导致代码难以理解和调试,还会增加维护的难度。因此,在编写SQL过程时,建议尽量保持代码简洁、清晰和可读性。 总之,SQL过程的最大行数没有固定的限制,取决于DBMS的限制、内存和存储限制以及代码的可读性和可维护性。在实际应用,应根据需求和DBMS的限制来合理规划和设计SQL过程的代码行数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值