摘要: 报表无疑是ERP系统中用到的最频繁的单据之一。比如每天采购要打印采购明细帐;仓库每天要导出收货或者出货明细;销售每天要打印订单明细等。故报表的设计在ERP系统开发中占据大半江山。不过笔者在实际工作中也发现,有些开发人员在设计ERP报表时,太过于复杂。 有一次,一家企业向我提出了如下需求:他们希望能够出一份报表,报表的内容包括四个部分。一是成品零件的用量、零件的最小采购量等信息;二是当月零件的采购量信息(详细的采购订单等资料);三是当月零件的出库信息(详细的出货记录);四是零件的安全库存信息。然后,根据这些信息计算出当月需要补下的满足安全库存的数量。从这个需求中可以看出,其主要设计到产品基本资料 阅读全文
posted @ 2011-03-28 15:32 hanmos 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 物化视图,所谓视图实际上是不存储物理信息的(同表相区别,表存储实际的数据和表的索引信息等。),视图仅仅存储 一个select语句而已。而物化视图就要视图也存储实际的数据,这种实际数据,就是索引。oracle 8imssqlserver2000中引入的。比如oracle的函数索引和sqlserver2000的索引视图都是物化视图。原因是这种视图能够显著提高性能,举个例子 一个表: create table mytable (id int not null,name varchar(20) not null) create index idx_mytable on mytable.name 当我. 阅读全文
posted @ 2011-03-28 15:31 hanmos 阅读(583) 评论(0) 推荐(0) 编辑
摘要: 又一篇笔记,以备后用!!需求:有表tb,表有两个字段,分别为:id,value。表中存有数据如下:idvalue 1 a 1 a1 1 a2 2 b 2 b1 3 c1 3 c2 需要通过查询实现:1 a,a1,a2 2b,b1 3c1,c2实现方法: 1、sql2000 使用合并函数: create function f_tb(@id int)returns varchar(8000)asbegin declare @str varchar(8000) set @str = '' select @str = @str + ',' + cast(value as 阅读全文
posted @ 2011-03-27 17:19 hanmos 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 1.1前言目前在软件圈内有这么一个现象,就是:DBA不太懂写PL/SQL,而开发人员写的又是五花八门,而且效率不高。如此以来,造成诸多弊端:1.可读性差。读别人写的一个程序花费的时间,比自己写一个程序的花费时间还要长;非但别人看不懂,时间久了连自己也看不懂了。2.可维护性差。程序越写越长,越改越烂,像懒婆娘的裹脚布,又臭又长。3.可移植性差。今天用oracle写一套,明天换成SQL Server的时候再写一套,众多的数据库开发人员在程序的苦海中重复着低级劳动……4.效率和性能差。一个存储过程或SQL执行效率简直可以让你感觉到对时间的绝望,你很快就理解什么是相对论了。1.2编程规范概述 事实上为 阅读全文
posted @ 2011-03-27 17:11 hanmos 阅读(1613) 评论(0) 推荐(0) 编辑
摘要: 下面再介绍一下数据库锁表及阻塞的原因和处理办法;数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它. 阅读全文
posted @ 2011-03-25 20:22 hanmos 阅读(411) 评论(0) 推荐(0) 编辑
摘要: 写有效率的SQL查询(I)大型系统的生产环境,一般情况下,我们评价一条查询是否有效率,更多的是关注逻辑IO(至于为什么,回头补一篇)。我们常说,“要建彪悍的索引”、“要写高效的SQL”,其实最终目的就是在相同结果集情况下,尽可能减少逻辑IO。1.1where条件的列上都得有统计信息。没统计信息SQLServer就无法估算不同查询计划开销优劣,而只能采用最稳妥的Scan(不管是table scan还是clustered index scan)。一般情况下我们不会犯这种错误——where条件里不使用非索引列是个常识。索引上的统计信息是无法删除的。1.2尽量不使用不等于(!=)或者NOT逻辑运算符。 阅读全文
posted @ 2011-03-10 17:19 hanmos 阅读(3790) 评论(0) 推荐(0) 编辑
摘要: 刚开始用SQL Server的时候,我没有用显示执行计划来对查询进行分析。我曾经一直认为我递交的SQL查询都是最优的,而忽略了查询性能究竟如何,从而对“执行计划”重视不够。在我职业初期,我只要能获取数据就很开心,而不去考虑数据是如何返回的,“执行计划”对我的查询作了什么工作。我以为SQL Server会自己去处理查询的性能问题的。作为一个刚进入IT行业或者刚学到新技术的软件工程师,在编写代码前不太可能有时间去学习其实必须掌握的知识。也许这是因为IT行业竞争太激烈的缘故。随着时间的流逝,数据库容量慢慢变大了。终于某天,客户对应用系统的查询性能感到不满意了。他面带怒容来找我,抱怨由于查询太慢,使得 阅读全文
posted @ 2011-03-02 16:31 hanmos 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 一、操作符优化1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。2、NOT IN操作符 此操作是强 阅读全文
posted @ 2011-03-02 16:13 hanmos 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 今天遇到这样一个细节问题,有个同事为了提高SQL执行效率使用sysindexes.rows来快速的计算表的行数结果发现取出来的行数根本就不是实际表中的行数就好比这样为了获得表中的记录数,一般都使用下面的SQL语句: SELECT COUNT(*) FROM dbo.orders但这条语句会执行全表扫描才能获得行数。 下面的SQL语句不会执行全表扫描一样可以获得行数:SELECT rows FROM sysindexes WHERE id = OBJECT_ID('表名') AND indid < 2网上很多优化文章都推荐这种做法,无可厚非,这种计算 sysindexes 阅读全文
posted @ 2011-02-23 21:24 hanmos 阅读(378) 评论(0) 推荐(0) 编辑
摘要: 通过总结,我发现自己以前很多很模糊的概念都清晰了很多。不论是缓存的数据信息,还是物理保存的信息,他们的基本单位都是数据页。所以理解数据页是最最基础的知识点,本篇博客就介绍跟索引有关的数据页的一些基础知识。数据页的基础知识SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。注意:日志文件不是用这种方式存储的,而是一系列日志记录。数据库被分成逻辑页面(每个页面8KB),并且在每个文 阅读全文
posted @ 2011-02-17 00:43 hanmos 阅读(437) 评论(0) 推荐(0) 编辑