存档

2006年6月 的存档

[转]SQL Server一些常见性能问题的总结

2006年6月29日 没有评论

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20

5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

6.下面的查询也将导致全表扫描:
select id from t where name like ‘%abc%’
若要提高效率,可以考虑全文检索。

7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2

9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–‘2005-11-30’生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<‘2005-12-1’

10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(…)

13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)

14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

21.避免频繁创建和删除临时表,以减少系统表资源的消耗。

22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

29.尽量避免大事务操作,提高系统并发能力。

30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

具体的SQL语句在很多情况下需要结合实际的应用情况来写,这里不作叙述。

分类: 未分类 标签:

Google拟清仓抛售百度股份

2006年6月23日 没有评论

新浪原文:http://tech.sina.com.cn/i/2006-06-23/07161004381.shtml

结合此前的Google把cn的服务器迁移到北京,以及这条抛售股票的消息,我们能不能讲其代表的信息是Google准备在中国大干一场,开始全面的与baidu竞争了呢?

拭目以待,竞争为用户带来的好处。

分类: 未分类 标签:

评“专家称银行卡跨行查询收费价格偏低”

2006年6月22日 没有评论

原文:专家称银行卡跨行查询收费价格偏低

文章解释了银行收取跨行查询收费的原因,以及每次查询0.3元这个价格的由来,等等。

当中提到原因之一就是“搭车行为”。“搭车行为”指某些银行鼓励用户使用其他行的自动取款机,而自己不准备大量的自动取款机。由于现在自动取款机只有在跨行取款的时候收费,所以大量的查询变成了为某些发卡行免费服务了。当初跨行取款收手续费的时候,一些银行就承诺为其用户提供这个费用,现在跨行查询也收费了,不知道这些银行还有没有这样的承诺了。

我个人觉得这个费用相当不合理。当初在银联创建的时候,可能考虑到这些跨行会产生的费用,但是没有考虑到会有如此大的费用。于是自动取款机最多的几家大的国有银行开始联手银联对跨行取款以及跨行查询收费了。收费没有问题,但是这个费用应该转嫁到银行卡用户的头上吗?不应该,这个费用应该在银行之间进行结算,而不是直接在用户查询以后在用户的户头扣除。这样做的后果直接就是,全行业发卡量萎缩,加剧银行卡的竞争。而各大国有银行敢于这样做,还是因为其大量的自动取款机分布,在因为跨行取款、查询收费的竞争中占有优势的地位,但是这样做难免有垄断资源从银行卡用户头上搜刮利润之嫌疑。

跨行服务的情形,让人不免联想电信业的互联互通。虽说银行也的竞争似乎也如同电信业的竞争一样激烈,但是电信业却没有直接这样直接从羊身上取毛。我们还没有遇见过从网通打电话给铁桶,还要加收跨网费用的情况,在早期的短信收费中,也有过跨网短信费率与同网短信费用有所区别的情况,但是从这几年的趋势看,其费用还是逐步趋同的。

我们这个时候可以看到两个趋势:一个趋势,银行业整体短视,恶性竞争继续加剧,银行小客户的利益受伤害,同时大银行的形象、信誉受到影响。一个趋势,银行业向通信业学习,逐步降低这个费用。

说实话,这么看通信业还是比银行更可亲一些…

分类: 未分类 标签:

抢注live.com的新后缀MSN邮件已经被禁了

2006年6月17日 没有评论

估计已经被抢的差不多了,我抢了3个live.cn的,分别是zc、fatiao、webexpress三个。看见豆腐抢了一个doufu的live.com的,不知道他有没有抢上cn的。我还没想好启用哪个新的做为Messenger的帐号,也许就是单纯当一个邮件呢……谁有live mail的邀请,就给我发一个吧…

中国人民的就是力量大,发动群众抢注live的新后缀服务,能抢先这么多天找到注册的后门,还发动了足够多的人民群众把人家的后门给用爆了。嗯,以后还得这么用…用mvm的话就是,这是一种资源,一定要先占上再说。

分类: 未分类 标签:

WWF的网站使用了新的.NET Framework 3.0的域名

2006年6月16日 没有评论

我们知道,WinFX被重新名为.NET Framework 3.0。可见WinFX对于.NET Framework的重要性,虽然我认为3.0和2.0之间的间隔似乎太短了,但是WinFX作为.NET Framework 3.0来讲,当之无愧!

为此,WinFX有了自己的网站:http://www.netfx3.com 。同时,WWF的网站也变为了:http://wwf.netfx3.com 。在这个网站里面,除了我们熟悉的WWF、WCF、WPF以外,还多出来了一个Windows CardSpace(WCS),这是一个什么呢?

鉴于WinFX重新命名为.NET Framework 3.0,以及原来WinFX以及其部件WWF、WCF、WPF有着众多的针对VS2005的扩展,根据.NET Framework 1.0 到 .NET Framework 1.1的升级伴随着VS.NET2002到VS.NET2003的升级,我估计在.NET Framework 3.0的正推出,VS2005会有一个新的本版或者一个大扩展包或者一个ServicePack的产生。随着各种各样的VS2005的扩展插件的产生,VS2005越来越像是一个半成品。

让我们静静期待下一个完美的VS的到来吧!

分类: ASP.NET, WWF 标签: ,

如何申请@live.com和@windowslive.com

2006年6月16日 没有评论

下面内容转自newsmth的社会软件版:

我把我发现的步骤写一下,共大家参考
1、用一个MSN或hotmail账号登录login.live.com,不能用后缀为@msn.com和@hotmail.com的账号登录。
必须是 非微软提供邮件服务的id账号登录才行(不但 .it .jp .fr,甚至 domains的邮件等等 都不可以)
大家可以先用其他账号的邮箱地址注册一个live账号,然后接着下面的步骤操作
2、在地址栏输入https://account.live.com/LoginChangeName.aspx,输入密码即可修改
   成live.com windowslive.com和live.cn的账号。具体分配哪个域名视原来的id国籍而定
如果你原来注册的msn或hotmail是美国的,及改变成后缀为live.com的账号
如果是中国的就是live.cn
3 强调一点 如上操作,原来的id就自动转换成新的id了,也就是说原来的id废掉了。请大家谨慎操作

 

注:上面这两个链接已经都失效了。2010-8-22。

分类: 未分类 标签:

社会型网络你相信他吗?

2006年6月13日 没有评论

信任是需要培养的,你信任一个人,是需要很多交往才能建立,你信任一个商家,是需要很多次交易才能建立。虽然信任很不容易建立,但是信任却很容易破坏,一次不负责任的交往或者一次没有信用的交易,都能破坏已建立的信任。此外我觉得信任是不能传递的,或者是有条件的。你对一个人的信任必须到了极致,你才能信任他信任的其他人。但是不信任是可以传递的,你对于某一件事情没有信任了,对于类似的事情的信任都会降低相当的多。

说完信任,下面就是社会网络。也就是那些邀请制的社区,此外人与人的邀请关系是公开的,这样人与人的邀请关系可以织成一个网。所有的社会网络都标榜着这种社区可以拓展人们的交际范围,成倍的认识圈子内的人,还可以尽可能多的拿到某个人的联系方式。

但是我对此持怀疑态度:你相信社会网络吗?

首先就是信任的问题。这样的社会网络是要建立在足够的信任基础上的。你的交往范围是你的个人隐私,同时你的联系方式更是你的个人隐私。但是社会网络却要把这些都拿出来分享,用以织成关系网。这显然需要对社会网络以及里面参与的人足够信任才好。这里面包含两层信任,一个是对社会网络的服务提供商的信任,一个是对社会网络内的其他人的信任。

其他的就都是信任的衍生效应了。

你对周围的人不足够信任,那你能对你认识的某个人的某个朋友信任吗?很好,这样的话,所谓的社会网络,得到的就不是网状的社会关系,而是结成树状的星型结构。这显然和社会网络的一厢情愿不太一样。

你对社会网络的服务上信任吗?一般使用MSN的有过这样的经历,就是某个朋友向你的MSN或者Hotmail发送某个社会网络的邀请,显然是对MSN里面所有的人发出了邀请。但是这个肯定不是你这个朋友自己发送的,而是那个社会网络发送的。那么那个社会网路就拿到了你所有的联系人。可是社会网络能保证不利用这些信息作恶吗?我想每个社会网络都拍胸脯,但是事实呢?

估计最近不少朋友都被某个社会网络以不同的MSN帐号加过,然后做一句广告就走人。很多人认为微软泄露了我们的MSN地址,微软的MSN不应该开放API,但是实际上呢?你的信任的人把你的MSN泄露给了本不该信任的社会网络。

适用我前面的理论:不信任是可以传递的。那么我对于所有的社会网络都失去信任了……而且我一开始就不是很信任,现在更不信任了……

分类: 未分类 标签:

院士应该是学术领袖,而不是利益代言人

2006年6月12日 没有评论

在水母看到一篇文章:《七年投资换回"空心"产业 国产Linux前景堪忧》。仔细在网上搜了一下倪光南先生的简历,倪先生是中国工程院的院士,中科院计算所的博士生导师,近年来致力于Linux的推广工作。

凭借倪先生在中文信息化方面所作的工作,成为中国工程院院士是实至名归的,但是现在致力于Linux的推广工作做得事情有些令人不解。作为学界一领袖人物,引领技术方向。但从其在新闻媒体看到的言论,无一不是为某种利益的代言。

分类: 未分类 标签:

小心黑客攻击

2006年6月11日 没有评论

上次说到的easyjf的站长在自己的blog里面说:为了庆祝世界杯,把本来不开源的网站代码都公开了。虽然这个包不是最新的代码,使上个月打包的,但是根据日志显示,最近对代码的主要修改在功能的增加上面,那么可以这样理解,安全防护方面的改进并不多。

这一事件是很敏感的,为什么这样说呢?一个没有开源的产品,现在开源,如果没有详细的测试,一定时间的各方面考验,那么这样的开源是对自己的不负责任。我们可以有几个联想:第一个,Win2000的代码泄露,没超过一个星期的时间出现了一个新病毒、新蠕虫的高潮,只因新产品中保留的大约60%的代码被人看到,漏出了新的漏洞;第二个,动网论坛,如果你的网站安装了动网论坛,不管什么版本,你必须跟着动网的新版本进行升级,因为动网有开源版本,我就曾有这样的经历,偷懒装上去一个就不在更新了,结果在一个安全顾问的招聘启事诱发下,网站首页给改掉了。

我在这里为easyjf提醒,前一段80前与80后的论战引起了不小的波澜,这么短的时间内开放网站的源码,很不明智。

分类: 未分类 标签:

CPU的负载与对其他电子设备的干扰

2006年6月10日 没有评论

昨天买了一个全波段的数码显示收音机,两节充电野马2200mah电池。收音机26元,电池30元。收音机还不如电池值钱。

收听中波的时候,发现在一米以内,笔记本对于收音机的干扰还是很大的。开始的时候发现如果敲击键盘的话,收音机就会有啸叫。我还在纳闷为什么敲击键盘就会对收音机的中波有干扰的时候,发现不只是敲击键盘才有干扰,而是CPU的负载高就会有干扰。看来CPU高负载的情况下,消耗的电能不都是做计算和转化为热能了,还有不少的能量变成电磁波发射到了空间当中。估计台式机不会有那么大的干扰,毕竟外面有一个作屏蔽的铁盒子。

剩下的联想就是这些发射出来的频率会不会对人的身体有害呢?记得有人说笔记本电脑长时间放在腿上,会将温度传递到下身,杀精,影响生育。现在看来不只热量,还有辐射……那些可怜的小生命,真的很脆弱。以后加油站应该也写上一条,停车的时候除了不要打开手机,也不能玩游戏了…

在剩下来的担心就是安全上面的,我想足够精尖的技术可以远程感知CPU里面的计算都是什么,搞一个模拟环境就能把所有的东西泄露出来……

一个CPU对于收音机的干扰,居然引发我如此多的联想,看来我的脑子还没有锈住!

分类: 未分类 标签: