 |
| |
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
一个存储过程样例,有兴趣可以分析一下!
1 SET QUOTED_IDENTIFIER ON 2 GO 3 SET ANSI_NULLS ON 4 GO 5 6 7 8 9 10 ALTER 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 22 AS 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 *******************************************************************************/ 49 SET NOCOUNT ON 50 51 declare @sqlWhere varchar(4000) 52 set @sqlWhere = '' 53 54 set @TE_END_DATEEND = DATEADD(Day,1,@TE_END_DATEEND) --结束日期加一天 55 set @sqlWhere = @sqlWhere + ' TE_END_DATE >= '''+ CONVERT(varchar(20),@TE_END_DATE) +''' and TE_END_DATE < '''+CONVERT(varchar(20),@TE_END_DATEEND)+'''' 56 57 if @TE_I_E_FLAG <> '-2' ----进出口 58 set @sqlWhere = @sqlWhere + ' and TE_I_E_FLAG = '''+@TE_I_E_FLAG+'''' 59 60 if @TE_PASS_RANGE <> '-2' --关区范围 61 set @sqlWhere = @sqlWhere + ' and TE_PASS_RANGE in ( SELECT a.GCL_CODE 62 FROM GL_CUSTOMER_LIST a CROSS JOIN 63 GL_CUSTOMER_LIST b 64 WHERE (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 /**//* 76 CREATE 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 108 DECLARE @START_ID INT 109 DECLARE @END_ID INT 110 SET @START_ID = (@PAGE_NUMBER - 1) * 15 + 1 111 SET @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 下一页 最后一页
|


|