2006-12-27
TAG:数据库相关

原作者:edobnet

项目介绍
政府一个业务系统,
使用范围全国
数据是区域还存储,最大地方,主业务表,一年有600万,工作流表,1年有几千万,迄今为至系统已经运行三年。
其它全国还有46个地点,数据也比较多
新开发系统主要功能,对业务系统的数据进行分析统计.


所以对性能要求比较高。

我们的简要方案。

建立中间表,通过DTS调度每天共步数据。
中间表设计原则
 记录数同原表一样,减少多表连接,保存运算好的值,如果记录修改,根据修改日志,重新计算中间值


增量同步数据(DTS)
 直接从每天的数据库更改日志读取记录,更新中间表,根据服务器空间程度合理调度DTS,减少数据同步时间。

对中间数据进行运算
 查询不作字段运行,所以运算在生成中间表的过程中已经计算

根据查询,优化索引设计
 根据数据查询特性,对where ,GROUP BY等操作字段进行索引设计,提高查询速度 

 优化数据类型
 大量采用Int提高查询、统计速度 

 优化中间表关键字
 采用Int,提高插入速度


数据文件优化设计,一个主要业务,一个数据文件,建数据文件时,估计数据量,一次建一个比较大的文件,这样所分配的文件就是一个连续文件块,


sql server设置区别大小写。初始内存调到一个比较大的内存。



使用我们的Toolkit开发简单分页,相关压力测试,
 测试服务器配制
 2个至强3.0CPU
 2G内存
 150G硬盘
 Window 2000 Advance Server中文版+SP4
 测试数据ENTRY_WORKFLOW表,数据量2,473,437



 页数  界面显示时间  CPU  Reads I/O  Writes I/O  Duration
 第1页  2-3 S  642  10689  0 390
 第100页  3-4S  626  128001  0 423
  
 ....后页业数太多,没有必要




 压力测试

 并发数 平均每秒请求数 未字节响应毫秒数
 50 45.28 20,095.65
 25 45.41 10,043.12



索引优化测试, 

 对分量值小的数据建索引测试,测试语句,GROUP BY 分量值
  一个字段,大概有6个分量值,没有建索引,4S,建索引<1s
 两个分量,不建索引,3S,建索引,<1S
一般来说,对分量小的字段,不建索引,但是我们对性能要求太高,根据我们的测试,数据对分量范围小的也要建索引。

因为一个统计,有一个很多组合的WHERE,比如有十个指标这样会有十次访问原表,这样性能太低,所以我们把where后的数据作



用中间数据,
十个指标对中间数据作查询,中间数据,我们使用临时表,
经测试,10万条记录,插入操作,临时表需要,16s,表变量需要,40S




select ... into #temp from .......
速度极快,2,500,000条记录,16S


一个存储过程样例,有兴趣可以分析一下!

  1SET QUOTED_IDENTIFIER ON 
  2GO
  3SET ANSI_NULLS ON 
  4GO
  5
  6
  7
  8
  9
 10ALTER     Procedure sp_tg009
 11    /* Param List */
 12    @TE_I_E_FLAG varchar(4),/*进出口方式*/
 13    @TE_PASS_RANGE varchar(4),/*关区范围*/
 14    @TE_C_OUTPUT varchar(4),/*输出方式退单理由输出、申报单位输出、全部输出*/
 15    @TE_END_DATE datetime,/**********申报起止日期********/
 16    @TE_END_DATEEND datetime,/*************************/
 17    @TE_MONI_T varchar(4),/*监控类型*/
 18    @USER_ID varchar(64),
 19    @CUSTOMER_CODE varchar(4),
 20    @PAGE_NUMBER int,
 21    @TOTAL_COUNT int OUTPUT
 22AS
 23
 24/******************************************************************************
 25**        File: 
 26**        Name: sp_tg009
 27**        Desc: 通关业务监控-通关规范监控-报关单退(拒)单管理
 28**
 29**        This template can be customized:
 30**              
 31**        Return values:
 32** 
 33**        Called by: 
 34**              
 35**        Parameters:
 36**        Input                            Output
 37**     ----------                            -----------
 38**        
 39**        Auth: chengdj
 40**        Date: 2005-4-7
 41*******************************************************************************
 42**        Change History
 43*******************************************************************************
 44**        Date:        Author:                Description:
 45**        --------    --------        -------------------------------------------
 46**    2005-04-11    chengdj                add HgDiv function
 47**      2005-04-11    chengdj                
 48*******************************************************************************/

 49SET NOCOUNT ON
 50
 51declare @sqlWhere varchar(4000)
 52set @sqlWhere = ''
 53
 54set @TE_END_DATEEND = DATEADD(Day,1,@TE_END_DATEEND)    --结束日期加一天    
 55set @sqlWhere = @sqlWhere + ' TE_END_DATE  >= '''+ CONVERT(varchar(20),@TE_END_DATE+''' and TE_END_DATE < '''+CONVERT(varchar(20),@TE_END_DATEEND)+''''
 56
 57if @TE_I_E_FLAG <> '-2'        ----进出口
 58    set @sqlWhere = @sqlWhere + ' and TE_I_E_FLAG = '''+@TE_I_E_FLAG+''''
 59
 60if @TE_PASS_RANGE <> '-2'        --关区范围
 61        set @sqlWhere = @sqlWhere + ' and TE_PASS_RANGE  in ( SELECT a.GCL_CODE
 62FROM GL_CUSTOMER_LIST a CROSS JOIN
 63      GL_CUSTOMER_LIST b
 64WHERE (a.GCL_LAYER LIKE b.GCL_LAYER + ''%'') AND (b.GCL_CODE = '''+@TE_PASS_RANGE+''')) '
 65
 66/* if @TE_C_OUTPUT<> '-2'        --输出方式
 67    set @sqlWhere = @sqlWhere + 'and '
 68****************监控类型**********************/

 69
 70    /*if @TE_MONI_T <> '-2'    --监控类型
 71        if @TE_MONI_T = '2'
 72                 set @sqlWhere = @sqlWhere + ' AND  TE_SCENE_FLAG = 1 '
 73        else
 74                set @sqlWhere = @sqlWhere + ' AND  TE_WORKER_FLAG  =  ' +@TE_MONI_T + ' '*/

 75/*
 76CREATE TABLE #TG009(            
 77        TE_PASS_RANGE VARCHAR(4) PRIMARY KEY NOT NULL,
 78        MAN_CLE_COUNT int null,            --人工退单报关单总数
 79        MAN_CLE_TOTAL int null,            --人工退单报关单总数
 80        MAN_CLE_PCT float null,            --人工退单率
 81        ELC_CLE_COUNT int null,            --电子退单总数
 82        ELC_CLE_TOTAL int null,            --电子退单总次数
 83        MAN_MU_COUNT int null,            --多次人工退单报关单数
 84        ELC_CLE_PCT float null,            --电子退单率--
 85        RE_COUNT int null,                --现场拒单报关单总数--
 86        RE_TOTAL int null,                --现场拒单报关单总次数--
 87        RE_PCT float null,                --现场拒单报关单率--
 88        MU_ELC_CEL_EXP float null,        --多次电子退单指数
 89        MU_MAN_EXP float null,            --多次人工退单指数
 90        MU_SEC_EXP float null            --多次现场拒单指数
 91)
 92    */

 93    declare @sql varchar(8000)
 94    declare @groupby varchar(50)
 95    
 96    if @TE_C_OUTPUT  = '1'    --按申报单位
 97         set @groupby = 'TE_AGENT_CODE'
 98    else                        --其它按关区
 99         set @groupby = 'TE_PASS_RANGE'
100         
101         declare @sql2 nvarchar(500)
102           set @sql2 = 'select @COUNT = count(distinct('+@groupby+')) from TG_ENTRY where '+@sqlWhere
103    execute sp_executesql 
104          @sql2,
105          N'@COUNT int output',
106          @TOTAL_COUNT output
107          
108DECLARE @START_ID INT
109DECLARE @END_ID INT
110SET @START_ID = (@PAGE_NUMBER - 1* 15 + 1
111SET @END_ID = @PAGE_NUMBER * 15
112     
113     ----
114     ----
115     -----     
116     if @TE_MONI_T = '1'    --人工退单
117                            set @sql = '
118                    select top '+convert(varchar(20),@END_ID)+ ' '+ @groupby +',IDENTITY(int,1,1) AS TID into #PAGE  from TG_ENTRY where '+@sqlWhere +' group by '+@groupby+ ';
119                    CREATE TABLE #TG009(            
120                        '+ @groupby+' VARCHAR(10) PRIMARY KEY NOT NULL,
121                        MAN_CLE_COUNT int null,    
122                        MAN_CLE_TOTAL int null,
123                        MAN_CLE_PCT numeric(10,2) null,
124                        MU_MAN_EXP numeric(10,2) null,
125                        MAN_CLE_TOTAL1 int null,
126                        MAN_CLE_TOTAL2 int null,
127                        MAN_CLE_TOTAL3 int null
128                        );
129
130                    SELECT '+ @groupby+',TE_CANCEL_FLAG,TE_WORKER_FLAG,TE_END_FLAG,TE_CANCEL_TIME INTO #temp1 FROM TG_ENTRY where'+@sqlWhere+' AND '+@groupby+' in ( select  '+ @groupby +' from #PAGE where TID between '+ convert



 
2006-12-27
TAG:.net

using System;
namespace CSDesingPattern
{
 class Singleton
 {
  private static Singleton mInstance;
  private int x = 0;  
  private Singleton(){}
  public static Singleton GetObject()
  {
   if (mInstance == null)
    mInstance = new Singleton();
   return mInstance;
  } 
  public void SetX(int newVal)
  {
   x = newVal;
  }
  public int GetX()
  {
   return x;
  }
  static void Main(string[] args)
  {
  
   int val;
   Singleton s1 = Singleton.GetObject();
   Singleton s2 = Singleton.GetObject();
   Console.WriteLine("将Singleton对象中的X设置为10");  
   s1.SetX(10);
   val = s2.GetX();
   Console.WriteLine("使用第二个Singleton变量读取X的值 x={0}", val);
   Console.ReadLine();
  }
 }
}

  • 设计要求:

    定义静态成员(指示自身类)

    private static Singleton mInstance;

    定义静态创建函数:

    public static Singleton GetObject()
      {
       if (mInstance == null)
        mInstance = new Singleton();
       return mInstance;
      } 
    用处:保持一个或固定个数的实例:如Asp.Net里的Application




 
2006-12-27
TAG:.net
private void button1_Click(object sender, System.EventArgs e)
        {
            PasteData();
        }

        private void PasteData()
        {
            IDataObject iData = Clipboard.GetDataObject();

            // 探测数据是否是可以使用的格式
            if(iData.GetDataPresent(DataFormats.Text))
            {
                string str = (String)iData.GetData(DataFormats.Text);
                textBox1.Text = str;
            }
        }





 
2006-12-24
TAG:随笔

我一直都相信,daidai是上天赐给我的“礼物”。

从我突发奇想去北京到在培训班遇到daidai,再到放弃工作陪她走过永生难忘的三个月,一步步是机缘巧合也是命中注定。

起初是daidai的一篇文章让我有了怜爱之心,随后的一次在天桥的长谈让我对她有了新的认识,也让我有了要照顾她一辈子的想法,虽然当时我也只是个孩子。

在别人看来这是一段两个孩子的恋爱,甚至有朋友说我们最多只能维持2个月,到今天为止我们已经恋爱了一年,而且坚信我们还会不断刷新这个记录。

刚开始在一起的时候,我还并不适应男朋友的角色,为一些小事情冷落daidai甚至和她吵架,心里还不服气的想:凭什么我要如何如何,当时真象一只骄傲的小牛。

两个人在一起,争吵总是不可避免的,而争吵必然要有一个人放下面子来迁就对方,如果都不低头的话,那么看起来再般配的情侣也会分手。

在每一次我们争吵过后,我总会扮演“失败者”的角色,主动去哄哄daidai开心,对于此有朋友笑我,但我并不认为这是一件多么丢人的事情。

在男孩和女孩的交往当中,女孩永远都是较弱的一面,男孩应当学会包容和宽慰女孩,而不是为了所谓的自尊而选择分手伤害女孩。在未来的日子里,我会一如既往的在daidai面前扮演“我错了的”角色,只因为我爱她。

在这一年里,我们一起经历了很多“磨难”,有一些甚至让我们差一点分手,但谢天谢地我们都成功的闯过去了,那些当时要死要活的事情,现在看来都是多么的可笑,这证明我们都成长了。

现在我再不是一年前倔强任性的奇怪孩子了,而是肩负给一个女孩一辈子幸福的男人。为此我学会了计划未来,对现实社会的妥协,学会了忍让和宽容,学会了如何爱一个人。

我爱daidai,不是因为她是一个怎样的人,而是因为我喜欢与她在一起时的感觉,喜欢她开心时的样子,心疼她生病时憔悴的模样。

我还要感谢daidai,感谢她给我无数次承认错误的机会,感谢她支持我的事业(如果有一天我成功的站在所有人面前,那必定是因为daidai),感谢她包容我的恶癖和种种缺点,感谢她给我洗衣服做饭剪指甲。。。。。感谢她爱我!

在这个世界上,我要成为最爱daidai的人,给她想要的以及幸福所包含的所有东西,为此我要不断的改变自己。

我要逐渐学会生活,关心自己的身体,健康起来,胖起来。

我要学会赞美和理解daidai,她已经做的非常棒了,我没有什么可抱怨的,在我主观认为她做出一些愚蠢事情时,不应该大声指责而是耐心去帮她解决问题。

帮daidai园大学梦,这个一定会放在今年的日程上并坚决执行。

让自己开朗并更有效率起来,事业上有所突破,我希望daidai为我而骄傲,当然我也会为daidai而骄傲,她一点都不比我差。

写这篇文章的现在,我远在鹤壁,我已经有2个月没有和daidai一起出去走走或者逛街了,我很内疚,我不是一个好男朋友,很多事情催使我天天忙于工作,但我想我应该有所改变。

就在今天!

我希望我拿着一大堆玫瑰突然出现在她面前,会让她感觉到06年的圣诞节不同于普通日子,2006年12月24日3点57分我想让daidai知道我有多爱她!





 
2006-12-22
TAG:VooSay相关 网摘

2006年就快要过去了,在这一年里经历了很多事情无论是感情还是事业.

对待感情学会了谦让和妥协,体会了爱的甜蜜和痛苦,也懂得了如何经营感情.有时也有结婚的想法.

事业上选择了一条自己选择的路,这条路很艰难,但这是一条正确的路,无论成功与否都会让我终身受益.

2007年我希望和daidai好好的过日子,更加珍惜和包容彼此,也做好分处两地的准备,我明白这对我们的爱情是一次挑战,但只要对daidai未来有益的,我都应该去做.

如果06年是准备期的话,那么07年就是发展期,开花 绽放 也许还会结果,我和团队其他成员会尽最大努力实现我们07年的目标.

另外我想在07年把英语的学习提到日程,没有时间是借口,只要想总会抽出大把时间的.

2007年是值得所有人期待的,希望大家都在这一年有更大的展获.





 
2006-12-20
TAG:VooSay相关 随笔

进KFC一眼就看到了chen和jin,也许都是做技术的原因,或是在网络上聊的投机,现实中和他们初次见面给我的感觉就很亲切,如同多年老友重逢一般.

chen和jin是有个地(房产搜索引擎)团队的成员,他们的工作很有意思也富有挑战性,我们的交谈一直都围绕技术和互联网,交换彼此的思想,这是一次非常好的交谈,在这个过程中我学到了很多.

chen是一个很腼腆的人,没有过多的心计,是一个典型的程序员而且极其优秀,他辞职创业的目的我想有一部分是来源于对自己技术的挑战,另一部分原因应该是使自己的技术可以创造最大化的价值.而有个地就具有现实明确需求.

jin在网上的名字叫blove,我印象中jin应该是一个很开朗活泼又健谈的白面书生:),事实上我只猜对了后一半,jin是一个热爱技术的家伙,去饭店的一路上都在和我谈关于搜索的技术,同时他对互联网有自己的见解,在言谈当中我收益非浅.

这次他们来京是参加一场投资相关的会议,我真心希望他们可以早日拿到投资并走向成功!

PS:有个地最近新系统将逐步完善,在2个月左右,提供的房产搜索服务将上一个很高的台阶,甚至会比kooxoo在房产搜索领域更优秀,希望大家多给予他们支持!





 
2006-12-18
TAG:随笔 VooSay相关

点击查看原始尺寸

这个店是一个卖手擀面的普普通通河南小店,"博客来"不懂Blog是什么,甚至不会了解互联网是一个什么样的领域,但它比那些互联网上运营BSP的xxx专家之类更坚强的活着,而且还活得很滋润。

点击查看原始尺寸

这是郭伟,认识了很多年,但这是第一次见到真人。

更多照片可以在于洋的鹤壁之旅中找到





 
2006-12-13
TAG:数据库相关

数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……

方法一

declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0


方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用

select distinct * from tableName


  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp


  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)


  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

  查询分析器不能单步调试的的原因

  具体步骤如下:

  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)

  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;

  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置:
  a、在【服务器】上运行dcomcnfg.exe;

  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;

  c、重新启动SQL Server服务;

  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。





 
2006-12-10
TAG:随笔

时间对每一个人都是公平的,但是每一个人运用自己的时间的方式却是不同的。

在这个经济快速发展的时代,对于每一个人来说都是一个绝好的机遇。在我们匆匆忙忙的每一天里,问问自己,你是否真的利用好了自己的时间。

假如你对未来有计划和种种期许,那么你是否开始或已经指定了自己各个阶段的任务?

如果是的,那么你怎么来分配好自己的时间?

在最近通过使用Marlin,我发现我不能很好的掌控好自己的时间对于那些变动性很大的任务。到目前为止,我指定的2个任务都已经过期了,而没有完成的原因很多。

最大的问题是自己掌控自己的时间能力不够,在以后这方面的能力我需要格外注意和努力增加这方面的能力。未来一段时间我会写一些这方面的文章和大家分享。





 
2006-12-09
TAG:数据库相关
我们就选用SQL Server有的Northwind表作为示例。很明显T-SQL函数不能满足这个要求:

useNorthwind

select rand(), productid, productname from Products

这个方法的问题在于Rand()函数在给定命令里所有行都返回相同的值,见Listing A。

你可能不需要得到这样的结果,则可以给rand()函数提供一个种子值。在下面的代码中,我们在Rand()函数中给定每一行的productid作为种子值。

select top 10

rand(productid) as row, productid, productname

from Products

order by row

返回的结果见Listing B.

不论这个命令运行多少次,虽然随机指派的行返回唯一的值,但是我们的得到的productids数字是10进制的。这个方法还没有起作用。

但是,这里提供了另外一个更有用的函数:NewID(),它返回一个GUID(全局唯一标志符)。我们看看Rand()函数被NewID()函数代替后的结果怎么样:

select top 10

newid() as row, productid, productname

from Products

order by row

运行的结果与Listing C中的结果很相似。

你的结果有点不同,因为NewID()在每一次调用的时候都产生一个GUID,因此,如果将上面的命令运行2到3次,得到的结果是不同的。

这个方法是调用NewID()的值作为一列,然后通过NewID()排列这些值。此方法很简单,并且可以应用到不同的场合。例如:你可能需要创建一些有某种特性的产品的列表或随机挑选10个客户或者100个随机挑选出来的订单的详细资料等。

SQL Server不是设计用于产生随机集的,但是其设计是基于数学而非商学的。幸亏有NewID()函数,我们才能够毫不费力地产生随机数据集。





分页 共37页 第一页 上一页 8 9 10 11 12 13 14 15 16 17 下一页 最后一页
wwpizi@gmail.com
emir123456@hotmail.com
emir123456@yahoo.com.cn
我的档案:

访问统计: