原文链接:https://www.cnblogs.com/hyd1213126/p/5828937.html
(一)深入浅出理解索引结构

实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

二、何时使用聚集索引或非聚集索引

下面的表总结了何时使用聚集索引或非聚集索引(很重要):

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值

不应

不应

小数目的不同值

不应

大数目的不同值

不应

频繁更新的列

不应

外键列

主键列

频繁修改索引列

不应

事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

三、结合实际,谈索引使用的误区

理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。

1、主键就是聚集索引

这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但笔者认为这样做意义不大。

显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。

从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。如果您的办公自动化系统已经建立的2年,那么您的首页显示速度理论上将是原来速度8倍,甚至更快。

在这里之所以提到“理论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索引)。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):

(1)仅在主键上建立聚集索引,并且不划分时间段:

1.Select gid,fariqi,neibuyonghu,title from tgongwen

用时:128470毫秒(即:128秒)

(2)在主键上建立聚集索引,在fariq上建立非聚集索引:

1.select gid,fariqi,neibuyonghu,title from Tgongwen

2.where fariqi> dateadd(day,-90,getdate())

用时:53763毫秒(54秒)

(3)将聚合索引建立在日期列(fariqi)上:

1.select gid,fariqi,neibuyonghu,title from Tgongwen

2.where fariqi> dateadd(day,-90,getdate())

用时:2423毫秒(2秒)

虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。得出以上速度的方法是:在各个select语句前加:

1.declare @d datetime

2.set @d=getdate()

并在select语句后加:

1.select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

2、只要建立索引就能显著提高查询速度

事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。

从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度

上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。

很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列):

1.(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5''

查询速度:2513毫秒

1.(2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5'' and neibuyonghu=''办公室''

查询速度:2516毫秒

1.(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''

查询速度:60280毫秒

从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

四、其他书上没有的索引使用经验总结

1、用聚合索引比用不是聚合索引的主键速度快

下面是实例语句:(都是提取25万条数据)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''

使用时间:3326毫秒

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000

使用时间:4470毫秒

这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。

2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

用时:12936

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

用时:18843

这里,用聚合索引比用一般的主键作order by时,速度快了3/10。事实上,如果数据量很小的话,用聚集索引作为排序列要比使用非聚集索引速度快得明显的多;而数据量如果很大的话,如10万以上,则二者的速度差别不明显。

3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个:

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-1-1''

用时:6343毫秒(提取100万条)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-6-6''

用时:3170毫秒(提取50万条)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''

用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-1-1'' and fariqi<''2004-6-6''

用时:3280毫秒

4、日期列不会因为有分秒的输入而减慢查询速度

下面的例子中,共有100万条数据,2004年1月1日以后的数据有50万条,但只有两个不同的日期,日期精确到日;之前有数据50万条,有5000个不同的日期,日期精确到秒。

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-1-1'' order by fariqi

用时:6390毫秒

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi<''2004-1-1'' order by fariqi

用时:6453毫秒

五、其他注意事项

“水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。

所以说,我们要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,以使您的数据库能得到高性能的发挥。

当然,在实践中,作为一个尽职的数据库管理员,您还要多测试一些方案,找出哪种方案效率最高、最为有效。

(二)改善SQL语句

很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解。比如:

1.select from table1 where name=''zhangsan'' and tID > 10000和执行select from table1 where tID > 10000 and name=''zhangsan''

一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name=''zhangsan''的,而后再根据限制条件条件tID>10000来提出查询结果。

事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。

虽然查询优化器可以根据where子句自动的进行查询优化,但大家仍然有必要了解一下“查询优化器”的工作原理,如非这样,有时查询优化器就会不按照您的本意进行快速查询。

在查询分析阶段,查询优化器查看查询的每个阶段并决定限制需要扫描的数据量是否有用。如果一个阶段可以被用作一个扫描参数(SARG),那么就称之为可优化的,并且可以利用索引快速获得所需数据。

SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:

列名 操作符 <常数 或 变量>或<常数 或 变量> 操作符列名

列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:

Name=’张三’

价格>5000

5000<价格

Name=’张三’ and 价格>5000

如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,也就是SQL SERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。所以一个索引对于不满足SARG形式的表达式来说是无用的。

介绍完SARG后,我们来总结一下使用SARG以及在实践中遇到的和某些资料上结论不同的经验:

1、Like语句是否属于SARG取决于所使用的通配符的类型

如:name like ‘张%’ ,这就属于SARG

而:name like ‘%张’ ,就不属于SARG。

原因是通配符%在字符串的开通使得索引无法使用。

2、or 会引起全表扫描

Name=’张三’ and 价格>5000 符号SARG,而:Name=’张三’ or 价格>5000 则不符合SARG。使用or会引起全表扫描。

3、非操作符、函数引起的不满足SARG形式的语句

不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外还有函数。下面就是几个不满足SARG形式的例子:

ABS(价格)<5000

Name like ‘%三’

有些表达式,如:

WHERE 价格*2>5000

SQL SERVER也会认为是SARG,SQL SERVER会将此式转化为:

WHERE 价格>2500/2

但我们不推荐这样使用,因为有时SQL SERVER不能保证这种转化与原始表达式是完全等价的。

4、IN 的作用相当与OR

语句:

Select from table1 where tid in (2,3)和Select from table1 where tid=2 or tid=3

是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。

5、尽量少用NOT

6、exists 和 in 的执行效率是一样的

很多资料上都显示说,exists要比in的执行效率要高,同时应尽可能的用not exists来代替not in。但事实上,我试验了一下,发现二者无论是前面带不带not,二者之间的执行效率都是一样的。因为涉及子查询,我们试验这次用SQL SERVER自带的pubs数据库。运行前我们可以把SQL SERVER的statistics I/O状态打开:

1.(1)select title,price from titles where title_id in (select title_id from sales where qty>30)

该句的执行结果为:

表 ''sales''。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

表 ''titles''。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

1.(2)select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)

第二句的执行结果为:

表 ''sales''。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

表 ''titles''。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

我们从此可以看到用exists和用in的执行效率是一样的。

7、用函数charindex()和前面加通配符%的LIKE执行效率一样

前面,我们谈到,如果在LIKE前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替LIKE速度会有大的提升,经我试验,发现这种说明也是错误的: 

1.select gid,title,fariqi,reader from tgongwen where charindex(''刑侦支队'',reader)>0 and fariqi>''2004-5-5''

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。

1.select gid,title,fariqi,reader from tgongwen where reader like ''%'' + ''刑侦支队'' + ''%'' and fariqi>''2004-5-5''

用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。

8、union并不绝对比or的执行效率高

我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16'' or gid>9990000

用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''

2.union

3.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。

看来,用union在通常情况下比用or的效率要高的多。

但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。 

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16'' or fariqi=''2004-2-5''

用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''

2.union

3.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-2-5''

用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。

9、字段提取要按照“需多少、提多少”的原则,避免“select *”

我们来做一个试验:

1.select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4673毫秒

1.select top 10000 gid,fariqi,title from tgongwen order by gid desc

用时:1376毫秒

1.select top 10000 gid,fariqi from tgongwen order by gid desc

用时:80毫秒

由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。

10、count(*)不比count(字段)慢

某些资料上说:用*会统计所有列,显然要比一个世界的列名效率低。这种说法其实是没有根据的。我们来看:

1.select count(*) from Tgongwen

用时:1500毫秒

1.select count(gid) from Tgongwen

用时:1483毫秒

1.select count(fariqi) from Tgongwen

用时:3140毫秒

1.select count(title) from Tgongwen

用时:52050毫秒

从以上可以看出,如果用count()和用count(主键)的速度是相当的,而count()却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总的速度就越慢。我想,如果用count(*), SQL SERVER可能会自动查找最小字段来汇总的。当然,如果您直接写count(主键)将会来的更直接些。

11、order by按聚集索引列排序效率最高

我们来看:(gid是主键,fariqi是聚合索引列):

1.select top 10000 gid,fariqi,reader,title from tgongwen

用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。

1.select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。

1.select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。

1.select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。

1.select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。

从以上我们可以看出,不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的,但这些都比“order by 非聚集索引列”的查询速度是快得多的。

同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。

12、高效的TOP

事实上,在查询和提取超大容量的数据集时,影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作。如:

1.select top 10 * from (

2.select top 10000 gid,fariqi,title from tgongwen

3.where neibuyonghu=''办公室''

4.order by gid desc) as a

5.order by gid asc

这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是10000条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。经笔者在实践中的应用,发现TOP确实很好用,效率也很高。但这个词在另外一个大型数据库ORACLE中却没有,这不能说不是一个遗憾,虽然在ORACLE中可以用其他方法(如:rownumber)来解决。在以后的关于“实现千万级数据的分页显示存储过程”的讨论中,我们就将用到TOP这个关键词。

到此为止,我们上面讨论了如何实现从大容量的数据库中快速地查询出您所需要的数据方法。当然,我们介绍的这些方法都是“软”方法,在实践中,我们还要考虑各种“硬”因素,如:网络性能、服务器的性能、操作系统的性能,甚至网卡、交换机等。

(三)实现小数据量和海量数据的通用分页显示存储过程

建立一个 Web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。

更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。

后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:

01.CREATE procedure pagination1

02.(@pagesize int, --页面大小,如每页存储20条记录

03.@pageindex int --当前页码

04.)

05.as

07.set nocount on

09.begin

10.declare @indextable table(id int identity(1,1),nid int) --定义表变量

11.declare @PageLowerBound int --定义此页的底码

12.declare @PageUpperBound int --定义此页的顶码

13.set @PageLowerBound=(@pageindex-1)*@pagesize

14.set @PageUpperBound=@PageLowerBound+@pagesize

15.set rowcount @PageUpperBound

16.insert into @indextable(nid) select gid from TGongwen

17.      where fariqi >dateadd(day,-365,getdate()) order by fariqi desc

18.select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t

19.where O.gid=t.nid and t.id>@PageLowerBound

20.and t.id<=@PageUpperBound order by t.id

21.end

23.set nocount off

自动化实例写的存储过程

自动化实例写的存储过程
以上存储过程运用了SQL SERVER的最新技术――表变量。应该说这个存储过程也是一个非常优秀的分页存储过程。当然,在这个过程中,您也可以把其中的表变量写成临时表:CREATE TABLE #Temp。但很明显,在SQL SERVER中,用临时表是没有用表变量快的。所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。但后来,我又发现了比此方法更好的方法。

笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》,全文如下:

1.从publish 表中取出第 n 条到第 m 条的记录:

2.SELECT TOP m-n+1 *

3.FROM publish

4.WHERE (id NOT IN

5.    (SELECT TOP n-1 id

6.     FROM publish))

8.id 为publish 表的关键字

从数据表中取出n条到m条记录的方法

从数据表中取出n条到m条记录的方法
我当时看到这篇文章的时候,真的是精神为之一振,觉得思路非常得好。等到后来,我在作办公自动化系统(ASP.NET+ C#+SQL SERVER)的时候,忽然想起了这篇文章,我想如果把这个语句改造一下,这就可能是一个非常好的分页存储过程。于是我就满网上找这篇文章,没想到,文章还没找到,却找到了一篇根据此语句写的一个分页存储过程,这个存储过程也是目前较为流行的一种分页存储过程,我很后悔没有争先把这段文字改造成存储过程:

目前流行的一种分页存储过程

01.CREATE PROCEDURE pagination2

02.(

03.@SQL nVARCHAR(4000), --不带排序语句的SQL语句

04.@Page int, --页码

05.@RecsPerPage int, --每页容纳的记录数

06.@ID VARCHAR(255), --需要排序的不重复的ID号

07.@Sort VARCHAR(255) --排序字段及规则

08.)

09.AS

11.DECLARE @Str nVARCHAR(4000)

13.SET @Str=''SELECT TOP ''+CAST(@RecsPerPage AS VARCHAR(20))+'' * FROM

14.(''+@SQL+'') T WHERE T.''+@ID+''NOT IN (SELECT TOP''+CAST((@RecsPerPage*(@Page-1))

15.AS VARCHAR(20))+'' ''+@ID+'' FROM (''+@SQL+'') T9 ORDER BY''+@Sort+'') ORDER BY ''+@Sort

17.PRINT @Str

19.EXEC sp_ExecuteSql @Str

20.GO

其实,以上语句可以简化为:

1.SELECT TOP 页大小 *

2.FROM Table1 WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id))

3.ORDER BY ID

但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。虽然我可以把它改造为:

1.SELECT TOP 页大小 *

2.FROM Table1 WHERE not exists

3.(select from (select top (页大小页数) * from table1 order by id) b where b.id=a.id )

4.order by id

目前流行的一种分页存储过程

即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。既便如此,用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。

虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了TOP的优势,通过TOP 即可实现对数据量的控制。

在分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。

我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命,使查询语句符合SARG形式。如:

1.Select top 10 * from table1 where id>200

于是就有了如下分页方案:

1.select top 页大小 *

2.from table1

3.where id>

4.(select max (id) from

5.(select top ((页码-1)*页大小) id from table1 order by id) as T

6.)

7.order by id

在选择即不重复值,又容易分辨大小的列时,我们通常会选择主键。下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GID是主键,但并不是聚集索引。)为排序列、提取gid,fariqi,title字段,分别以第1、10、100、500、1000、1万、10万、25万、50万页为例,测试以上三种分页方案的执行速度:(单位:毫秒)

页码

方案1

方案2

方案3

1

60

30

76

10

46

16

63

100

1076

720

130

500

540

12943

83

1000

17110

470

250

10000

24796

4500

140

100000

38326

42283

1553

250000

28140

128720

2330

500000

121686

127846

7168

从上表中,我们可以看出,三种存储过程在执行100页以下的分页命令时,都是可以信任的,速度都很好。但第一种方案在执行分页1000页以上后,速度就降了下来。第二种方案大约是在执行分页1万页以上后速度开始降了下来。而第三种方案却始终没有大的降势,后劲仍然很足。

在确定了第三种分页方案后,我们可以据此写一个存储过程。大家知道SQL SERVER的存储过程是事先编译好的SQL语句,它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。下面的存储过程不仅含有分页方案,还会根据页面传来的参数来确定是否进行数据总数统计。

--获取指定页的数据:

01.CREATE PROCEDURE pagination3

02.@tblName varchar(255), -- 表名

03.@strGetFields varchar(1000) = ''*'', -- 需要返回的列

04.@fldName varchar(255)='''', -- 排序的字段名

05.@PageSize int = 10, -- 页尺寸

06.@PageIndex int = 1, -- 页码

07.@doCount bit = 0, -- 返回记录总数, 非 0 值则返回

08.@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

09.@strWhere varchar(1500) = '''' -- 查询条件 (注意: 不要加 where)

10.AS

12.declare @strSQL varchar(5000) -- 主语句

13.declare @strTmp varchar(110) -- 临时变量

14.declare @strOrder varchar(400) -- 排序类型

16.if @doCount != 0

17.begin

18.if @strWhere !=''''

19.set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere

20.else

21.set @strSQL = "select count(*) as Total from [" + @tblName + "]"

22.end

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:

1.else

2.begin

3.if @OrderType != 0

4.begin

5.set @strTmp = "<(select min"

6.set @strOrder = " order by [" + @fldName +"] desc"

--如果@OrderType不是0,就执行降序,这句很重要!

01.end

02.else

03.begin

04.set @strTmp = ">(select max"

05.set @strOrder = " order by [" + @fldName +"] asc"

06.end

08.if @PageIndex = 1

09.begin

10.if @strWhere != ''''

12.set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "

13.        from [" + @tblName + "] where " + @strWhere + " " + @strOrder

14.else

16.set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "

17.        from ["+ @tblName + "] "+ @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

1.end

2.else

3.begin

--以下代码赋予了@strSQL以真正执行的SQL代码 

01.set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["

02.+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "])

03.      from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "]

04.      from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

06.if @strWhere != ''''

07.set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ " from ["

08.+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["

09.+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) +" ["

10.+ @fldName + "] from [" + @tblName + "] where " + @strWhere + " "

11.+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

12.end

14.end

16.exec (@strSQL)

18.GO

获取指定页的数据

上面的这个存储过程是一个通用的存储过程,其注释已写在其中了。在大数据量的情况下,特别是在查询最后几页的时候,查询时间一般不会超过9秒;而用其他存储过程,在实践中就会导致超时,所以这个存储过程非常适用于大容量数据库的查询。笔者希望能够通过对以上存储过程的解析,能给大家带来一定的启示,并给工作带来一定的效率提升,同时希望同行提出更优秀的实时数据分页算法。

(四)聚集索引的重要性和如何选择聚集索引

在上一节的标题中,笔者写的是:实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于“办公自动化”系统的实践中时,笔者发现这第三种存储过程在小数据量的情况下,有如下现象:

1、分页速度一般维持在1秒和3秒之间。

2、在查询最后一页时,速度一般为5秒至8秒,哪怕分页总数只有3页或30万页。

虽然在超大容量情况下,这个分页的实现过程是很快的,但在分前几页时,这个1-3秒的速度比起第一种甚至没有经过优化的分页方法速度还要慢,借用户的话说就是“还没有ACCESS数据库速度快”,这个认识足以导致用户放弃使用您开发的系统。

笔者就此分析了一下,原来产生这种现象的症结是如此的简单,但又如此的重要:排序的字段不是聚集索引!

本篇文章的题目是:“查询优化及分页算法方案”。笔者只所以把“查询优化”和“分页算法”这两个联系不是很大的论题放在一起,就是因为二者都需要一个非常重要的东西――聚集索引。

在前面的讨论中我们已经提到了,聚集索引有两个最大的优势:

1、以最快的速度缩小查询范围。

2、以最快的速度进行字段排序。

第1条多用在查询优化时,而第2条多用在进行分页时的数据排序。

而聚集索引在每个表内又只能建立一个,这使得聚集索引显得更加的重要。聚集索引的挑选可以说是实现“查询优化”和“高效分页”的最关键因素。

但要既使聚集索引列既符合查询列的需要,又符合排序列的需要,这通常是一个矛盾。笔者前面“索引”的讨论中,将fariqi,即用户发文日期作为了聚集索引的起始列,日期的精确度为“日”。这种作法的优点,前面已经提到了,在进行划时间段的快速查询中,比用ID主键列有很大的优势。

但在分页时,由于这个聚集索引列存在着重复记录,所以无法使用max或min来最为分页的参照物,进而无法实现更为高效的排序。而如果将ID主键列作为聚集索引,那么聚集索引除了用以排序之外,没有任何用处,实际上是浪费了聚集索引这个宝贵的资源。

为解决这个矛盾,笔者后来又添加了一个日期列,其默认值为getdate()。用户在写入记录时,这个列自动写入当时的时间,时间精确到毫秒。即使这样,为了避免可能性很小的重合,还要在此列上创建UNIQUE约束。将此日期列作为聚集索引列。

有了这个时间型聚集索引列之后,用户就既可以用这个列查找用户在插入数据时的某个时间段的查询,又可以作为唯一列来实现max或min,成为分页算法的参照物。

经过这样的优化,笔者发现,无论是大数据量的情况下还是小数据量的情况下,分页速度一般都是几十毫秒,甚至0毫秒。而用日期段缩小范围的查询速度比原来也没有任何迟钝。聚集索引是如此的重要和珍贵,所以笔者总结了一下,一定要将聚集索引建立在:

1、您最频繁使用的、用以缩小查询范围的字段上;

2、您最频繁使用的、需要排序的字段上。

结束语

本篇文章汇集了笔者近段在使用数据库方面的心得,是在做“办公自动化”系统时实践经验的积累。希望这篇文章不仅能够给大家的工作带来一定的帮助,也希望能让大家能够体会到分析问题的方法;最重要的是,希望这篇文章能够抛砖引玉,掀起大家的学习和讨论的兴趣,以共同促进,共同为公安科技强警事业和金盾工程做出自己最大的努力。

最后需要说明的是,在试验中,我发现用户在进行大数据量查询的时候,对数据库速度影响最大的不是内存大小,而是CPU。在我的P4 2.4机器上试验的时候,查看“资源管理器”,CPU经常出现持续到100%的现象,而内存用量却并没有改变或者说没有大的改变。即使在我们的HP ML 350 G3服务器上试验时,CPU峰值也能达到90%,一般持续在70%左右。

本文的试验数据都是来自我们的HP ML 350服务器。服务器配置:双Inter Xeon 超线程 CPU 2.4G,内存1G,操作系统Windows Server 2003 Enterprise Edition,数据库SQL Server 2000 SP3

(完)

有索引情况下,insert速度一定有影响,不过:

  1. 你不大可能一该不停地进行insert, SQL Server能把你传来的命令缓存起来,依次执行,不会漏掉任何一个insert。
  2. 你也可以建立一个相同结构但不做索引的表,insert数据先插入到这个表里,当这个表中行数达到一定行数再用insert table1 select * from table2这样的命令整批插入到有索引的那个表里。

注:文章来源与网络,仅供读者参考!

人是有思想的,这是人与动物本质的区别。人的社会属性要求我们在操守的规范下实现自我价值,越有这越给予。因此,我们要实现自己的社会价值 。这些都离不开坚定的信仰,有无信仰是一个在精神层面状态好坏的体现,不能觉得一切都无所谓。生活是一面镜子,自己是什么样子很快现行。 用知识武装自己,用信仰升华自己,用爱好装点自己,用个性标识自己。 我就是我,不一样的烟火;我就是我,不一样的水果;我就是我,不一样的花朵;我就是我,不一样的自我。 生活寄语:越努力,越幸运。 做最好的自己!

在entity framework core中,如果两个实体涉及到外键连接,查询的时候默认是只查自身而不会去查询外键表的。如果想要让查询结果包含外键实体,则需要使用include方法来让查询结果包含外键实体。如

_dbContext.ProductStandard
          .Include(o=>o.Product)
          .SingleOrDefault(o => o.Id == id);

这个例子中,Product的Id和 ProductStandard的ProductId字段进行外键连接,想要让查询出来的productStandard携带 Product,则必须使用Include方法来进行声明。

Json.NET
http://json.codeplex.com/
Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换。

Math.NET
http://www.mathdotnet.com/
Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂微分,解方程等等功能。

Faker.Net
https://github.com/jonwingfield/Faker.Net
开发的时候是不是为测试数据烦恼?Faker.Net可以非常方便帮你生成大批量测试数据。例如人员表里面的姓名、性别什么的。

Html Agility Pack
http://htmlagilitypack.codeplex.com/
Html Agility Pack 是CodePlex 上的一个开源项目。它提供了标准的DOM API 和XPath 导航--即使 HTML 不是适当的格式!HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦。

NCrawler
http://ncrawler.codeplex.com/
NCrawler是一款国外的开源网络爬虫软件,遵循LGPL许可协议。其HTML处理使用的是htmlagilitypack开源库,采用xpath的方式处理定位网页元素,十分方便。

SuperWebSocket
http://superwebsocket.codeplex.com/
SuperWebSocket是基于.NET开源Socket框架SuperSocket开发的, SuperSocket所支持的大部分功能在SuperWebSocket中得到了继承。用户可通过SuperWebSocket来快速的构建可靠的,高性能的websocket服务器端应用程序。

SuperSocket
http://supersocket.codeplex.com/
SuperSocket 是 一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用 Socket,如何维护Socket连接,Socket是如何工作的。该项目使用纯 C# 开发,易于扩展和集成到已有的项目。只要你的已有系统是使用.NET开发的,你都能够使用 SuperSocket来轻易的开发出你需要的Socket应用程序来集成到你的现有系统之中。

Quartz.NET
http://www.quartz-scheduler.net/
Quartz.NET 是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而 创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

Lucene.Net
http://lucenenet.apache.org/
Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。

HttpLib
http://httplib.codeplex.com/
一个基于C#语言的http协议的类库,Httplib让异步交互处理数据更容易了。类库的方法包括:上传文件到服务器,获取页面数据等等。

Smart Thread Pool
http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
智能线程池,用SmartThreadPool可以简单就实现支持多线程的程序,由线程池来管理线程,可以减少死锁的出现。SmartThreadPool还支持简单的生产者-消费者模式,当不需要对任务进行持久化时,还是很好用的。

DocX
https://docx.codeplex.com/
DocX是一个用来操作word的轻量级的类库。借助DocX,开发人员可以在不需要安装Microsoft Word的情况下操纵word2007/2010文件。

NPOI

http://npoi.codeplex.com/
NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

PDFsharp
https://pdfsharp.codeplex.com/

PDFsharp 是可以轻松地在 .NET 语言中创建PDF文档的开放源码库。它使用相同的绘制程序来创建 PDF 文档,在屏幕上显示,以及输出到打印机。可以修改、合并、拆分已经存在的 PDF 文件,支持透明图像。

Dapper
https://github.com/SamSaffron/dapper-dot-net
Dapper 是一个轻型的ORM类。代码就一个 SqlMapper.cs文件,编译后就40K的一个很小的Dll.Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超 过了DataTable。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如 果你知道原理也可以让它支持Mongo db。话说,这个ORM,博主自己也一直在使用,确实十分强悍,至少在性能方面,恐怕.NET里面的大多数ORM只能是望其项背了。

NHibernate
https://github.com/nhibernate
NHibernate是现在开发人员用的较多的一个ORM。NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

log4net
http://logging.apache.org/log4net/
log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

SharpSerializer
http://sharpserializer.codeplex.com/
SharpSerializer是一个开源XML和二进制序列化器。SharpSerializer可以序列化Xml和自己的二进制格式,还可以序列化Json等其他文本格式或其他数据加密,压缩,优化等二进制流。

XProxy
http://xproxy.codeplex.com/
XProxy是一个支持插件的基础代理程序集。通过编写简单的插件程序,你将能开发各种各样的代理程序。
XProxy是一个支持插件开发的数据交换机,可以编写插件对中转数据进行处理。内置有NAT插件、加解密插件、反向代理、直接代理、间接代理等插件。

nopCommerce
http://nopcommerce.codeplex.com/releases/view/106146
nopcommerce 是国外的一个高质量的开源b2c 网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现 的,基于xml的多语言版本,非常灵活的语言切换功能,包括在后台都能同时编辑产品的中英文属性,非常适合做外贸,优秀超前的程序架构,性能也非常强大, 自定义的产品名称和分类又有很好的seo优化。综合能力远远高于国内的一些程序架构糟糕的.net商城程序,是二次开发和大型b2c架构的首选。3.0开 始支持多店。

Enterprise Library
https://entlib.codeplex.com/
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework 3.5 开发一套企业库, 目前最新版本为v5.0,支持.NET Framework 4.0,共包括9个Application Block,包括数据访问(Data Access Application Block)、异常管理(Exception Handling Application Block)、数据验证(Validation Application Block)等等,对企业应用开发非常有帮助,也非常实用。

Autofac
http://autofac.org/
Autofac是一款非常优秀的IOC框架,比较于其他的IOC框架,如Spring.NET,等等之类的,它非常的轻量级且性能上也很卓越。

AutoMapper
https://github.com/AutoMapper/AutoMapper
AutoMapper是一个.NET的对象映射工具。主要用于领域对象与DTO之间的转换、数据库查询结果映射至实体对象。

7-Zip
http://www.7-zip.org/
http://sourceforge.net/projects/sevenzip/postdownload?source=dlp
7-Zip 是 一款号称有着现今最高压缩比的压缩软件,它不仅支持独有的 7z 文件格式,而且还支持各种其它压缩文件格式,其中包括 ZIP, RAR, CAB, GZIP, BZIP2和 TAR 等等。此软件压缩的压缩比要比普通 ZIP 文件高 30-50% ,因此,它可以把 Zip 格式的文件再压缩 2-10% 。

.Net PDF 类库

PDFsharp

PDFsharp是一款可以让.NET框架支持的任何语言很容易的创建PDF文件的类库。

ASP.NET FO PDF

FO PDF 是一款C#编写类似于ASP.NET服务器控件的控件。它接受DataTable 和一些其它参数来创建XSL FO,并使用NFOP (Apache FOP Port in J#) PDF Formatter来绘制一个类似PDF Report 的DataGrid 。今后将会增加更多的标签来可以生成XSL FO 。

Report.NET

Report.NET 开源类库包含了生成精确PDF文档的类。它是.NET平台下的C#编写的,可以帮助你创建简单的灵活的PDF文件。你可以从任何ADO.NET的 DataSet取得数据来创建PDF文档。ASP.NET可以用Report.NET来创建动态的PDF响应页面。

SharpPDF

 SharpPDF是可以用来简单的创建PDF文件的C#类库。它创建的文件百分白兼容PDF格式。

iTextSharp

iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件。http://hardrock.cnblogs.com/ 是一个关于 iTextSharp的中文Blog。

工作流

Workflow.Net

 Workflow.Net是使用微软.Net技术基于wmfc标准的创建工作流引擎。

netBPM

 NetBPM是JBpm移植到.net平台下的一款开源工作流软件。NetBpm可以很容易和.Net应用程序集成在一起,可以创建,执行和管理工作流程序。
 Bpm Tool支持将业务模型转换成软件模型。业务开发人员可以使用模型驱动的方法设计,实现,执行和跟踪业务流程。因此开发人员能够更容易的关注业务逻辑的变化。

持久层框架

NHibernate

 NHibernate是一个面向.NET环境的针对关系型数据库的对象持久化类库。 
 NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具。 NHibernate从数据库底层来持久化你的.Net对象到关系型数据库。NHibernate为你处理这些,你不用自己写SQL去数据库存取对象。你 的代码仅仅和对象关联,NHibernat自动产生SQL语句,并确保对象提交到正确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理 数据的时间. NHibernate可以帮助你消除或者包装那些针对特定数据库的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。因此对于那些在 基于.NET的中间层的应用中,它们实现面向对象的业务模型和商业逻辑的应用,NHibernate是最有用的。

FileHelpers Library

FileHelpers Library是一款C#编写的开源 .NET 类库。它使用简单,很容易就可以从固定长度文件或界定记录(CSV)读/写数据。它也支持从不同的数据存储格式(Excel, Access, SqlServer)导入/导出数据。

Websharp

Websharp是国人开源的一款开源持久层框架,它的目标是设计一个基于.Net的通用的应用软件系统的框架,以简化基于.Net平台的企业应用软件的开发。目前,Websharp关注于企业应用软件的以下几个方面:

1、 数据库访问
2、 O/R 映射
3、 AOP
4、 分布式访问

ObjectBroker

ObjectBroker是.NET平台下的一款开源O/R映射框架。它支持对象缓存,1:1, 1:n 和 m:n的关联映射等特性。

Gentle.NET

Gentle.NET是一款开源的与关系数据库(RDBMS)无关的对象持久层框架,可以自动生成SQL和对象结构。它拥有一个SQL工厂用来创建自定义查询、DataView构建助手和卓越的性能和完善的文档。

Ubik

 Ubik是C# 2.0下的ORM持久层框架,当前是WinForms应用程序开发提供的.它支持OPath的子集而可以进行面向对象查询,且包含一个网络事件系统.

NDal

 NDal是一个数据提取层(DAL)框架,它可以运行在.NET和Mono环境下。

Persist.NET

 Persist.NET是C#编写的一款完整的持久层框架。

ObjectBroker

 ObjectBroker是.NET平台下的数据库对象/关系映射(O/R Mapping)框架。

iBATIS.NET

iBATIS.NET帮助你的应用系统创建更好的持久层框架。

Advanced Data Provider

 Advanced Data Provider是为ADO.NET提供的动态数据提供者 。可以让应用程序透明的访问不同的ADO.NET 数据提供者。

OJB.NET

 OJB.NET是一款.NET平台下的对象/关系映射(O/R Mapping)工具。

图表制作

ZedGraph

ZedGraph是C#编写的.NET类库,提供了用户控件和web控件。它可以创建2D的线性图、条形图和饼图。它功能完整且有详细的功能自定义,不过使用默认的选项就足够好用了。

.NET Charts

 一款类似 PieChart, StackBar, LineChart的C#开源图表组件。

NPlot

NPlot是一款.NET下的开源图表类库.它值得称道的地方是优雅且灵活的API设计.NPlot包含了Windows Form控件, ASP.NET控件和一个创建Bitmap图片的类。还有一个可用的GTK#控件。

XSCharting

XSCharting是C#开发的图表组件,提供了多种多样的图表选项。

DaveChart

DaveChart是一个免费的DotNet类库。

NChart

NChart 提供了很多值得应用在商业,教育等多个领域的2 D图表。

WebGis

SharpMap

SharpMap是一款易于使用的地图渲染器,它可以为Web和Windows应用程序渲染GIS数据。SharpMap是使用C#编写,基于.NET 2.0框架上开发的开源项目。

monoGIS

monoGIS将成为Mono平台下的开源完整GIS。已经发布了internet mapserver,OGC WMS实现和一些工具像空间格式转换。

NASA World Wind

NASA World Wind 是C#开发的个人电脑上的开源的3D图形虚拟地球系统。它结合了美国国家航空航天局(NASA)从卫星拍摄的图像,这些图像应用于Blue Marble, Landsat 7, SRTM, MODIS 以及其它更多的地方。

错误:webapi “ObjectContent`1”类型未能序列化内容类型“application/xml; charset=utf-8”的响应正文。
相信用过webapi的对这个错误 已经看在眼里 痛在心里了吧

1.png
我百度也搜了一下 看了一下 然后发现他们的解决办法 并没有什么软用。

然后想起来当时上学的时候 老师讲过这个知识点 然后又找到了 老师 0.0

当时老师写的一个笔记。我直接上截图了。
2.png

在webapiConfig里面加一行代码 就好。
3.png

然后 又是我们熟悉而可爱的json了。

4.png

代码是

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

原文:https://www.cnblogs.com/uglyman/p/6890706.html?utm_source=itdadao&utm_medium=referral

好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了。

或许有的园友在14年的时候收藏过我的一篇“工欲善其事、必先利其器”的博文,时隔3年,已经做了N多更新,那篇文章也已被我删除,迁移至GitHub,重新进行管理。

这篇文章,大家可以推荐、收藏,让更多的人在园内看到,让福利普照。

因为这篇文章,我以后不会更新。

但项目依旧会更新,所以,更好的做法是,请到GitHub上Star:be-a-professional-programmer

前言
成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。

笔者作为一位tool mad,将工作以来用到的各种优秀资料、神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需。

本人喜欢折腾,记录的东西也比较杂,各方面都会有一些,内容按重要等级排序,大家各取所需。

这里的东西会持续积累下去,欢迎Star,也欢迎发PR给我。

Thonatos.Yang整理的GitBook版本,阅读体验更佳:https://thonatos.gitbooks.io/be-a-professional-programmer/

目录
资料篇
技术站点
必看书籍
大牛博客
GitHub篇
工具篇
平台工具
常用工具
第三方服务
爬虫相关(好玩的工具)
安全相关
Web服务器性能/压力测试工具/负载均衡器
大数据处理/数据分析/分布式工具
Web前端
语言篇
Scala
Java
Python
Swift
.NET
C & C++
其他
游戏开发相关
日志聚合,分布式日志收集
RTP,实时传输协议与音视频
资料篇
技术站点
在线学习:Coursera、edX、Udacity、MIT公开课、MOOC学院、慕课网
Hacker News:非常棒的针对编程的链接聚合网站
Techmeme:美国知名科技新闻和博客聚集网站,类似的还有(Panda, Hacker & Designer News)
Reddit - Programming板块:同上
Java牛人必备:Program Creek
Stack Overflow:IT技术问答网站
SegmentFault:中文的技术问答社区
GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核,OpenStack等
码云:支持中文可免费创建私有项目的代码托管平台,可作为备选
LeetCode:来做做这些题吧,看看自己的算法水平如何?这可比什么面试宝典强多了。
LintCode:支持中文的编程题在线训练平台,可作为备选
Kaggle,Topcoder: 机器学习、大数据竞赛
掘金:高质量的技术社区
开发者头条
InfoQ:企业级应用,关注软件开发领域
V2EX: way to explore
国内老牌技术社区:OSChina、博客园、CSDN、51CTO
免费的it电子书:http://it-ebooks.info/
在线学习:http://www.udemy.com/
优质学习资源:http://plus.mojiax.com/
代码练习:http://exercism.io/ and https://www.codingame.com
DevStore:开发者服务商店
MSDN:微软相关的官方技术集中地,主要是文档类
谷歌开发者
码库 - 收录了实用的开源项目及资源
Coding 基于Git的国内代码托管平台,支持私有项目,有项目管理相关功能
必看书籍
SICP(Structure and Interpretation of Computer Programs)
深入理解计算机系统
代码大全2
人件
人月神话
软件随想录
算法导论(麻省理工学院出版社)
离散数学及其应用
设计模式
编程之美
黑客与画家
编程珠玑
The Little Schemer
Simply Scheme_Introducing_Computer_Science
C++ Prime
Effective C++
TCP/IP详解
Unix 编程艺术
技术的本质
软件随想录
计算机程序设计艺术
程序员的自我修养:链接、装载与库
程序员修炼之道
高效能程序员的修炼
《精神分析引论》弗洛伊德
《失控》《科技想要什么》《技术元素》凯文凯利
程序开发心理学
天地一沙鸥
搞定:无压力工作的艺术
大牛博客
awesome-programmers: 各领域大牛,值得纪念的程序员们
云风: 游戏界大牛
王垠: 不少文章喷到蛮有道理
冰河-伞哥: Lisp大牛
R大: 【干货满满】RednaxelaFX写的文章/回答的导航帖]
陈皓: 左耳朵耗子
Jeff Atwood: 国外知名博主
阮一峰: 黑客与画家译者,Web
廖雪峰: 他的Python、Git教程不少人都看过
道哥的黑板报: 安全
国内GitHub上关注度较高的开发者
GitHub篇
Awesome

Awesome: 这是个Awesome合集,常见的资料这里面都能找到
杂七杂八、有用没用的Awesome合集
Awesomeness - 非常不错的语言类学习资料集合
architect-awesome - 后端架构师技术图谱
awesome-ios-ui
awesome-android-ui
Awesome-MaterialDesign
awesome-public-datasets
awesome-AppSec(系统安全)
awesome-datascience
awesome-dataviz - 数据可视化库及资料
awesome-es
awesome-comment - 神注释大全
awesome-hacking - 黑客工具箱
awesome-machine-learning - 机器学习资料
书籍资料

Every Programmer Should Know
Latency Numbers Every Programmer Should Know
system-design-primer: 系统设计入门
free-programming-books 中文版
免费的编程中文书籍索引
《程序员编程艺术 — 面试和算法心得》
GoBooks
Papers we love
自然语言处理NLP推荐学习路线及参考资料
超级棒的机器学习资料(框架,库,软件), 中文翻译版
机器学习(Machine Learning)&深入学习(Deep Learning)资料
Docker资料合集
学习使用Strom
Hadoop Internals
Spark Internals
大数据时代的数据分析与数据挖掘 – 基于Hadoop实现
如何制作操作系统
借助开源项目学习软件开发
几个不错的开源游戏引擎
一起写Python文章,一起看Python文章
R的极客理想系列文章
HTTP接口设计指南
分享自己长期关注的前端开发相关的优秀网站、博客、以及活跃开发者
Readings in Databases
Data Science blogs
日志:每个软件工程师都应该知道的有关实时数据的统一概念
Android Code Path
Android Learn Notes
PHP 类库框架,资料集合
优秀项目

最值得关注的10个C语言开源项目
15款值得学习的小型开源项目
iOS-100个开源组件
十大Material Design开源项目
Android开源项目分类汇总
前端 & Node.js

前端资源
前端开发指南
前端技能汇总
前端资源大导航
收集前端方面的书籍
2014年最新前端开发面试题
简单清晰的JavaScript语言教程,代码示例
JavaScript编程规范
JavaScript必看视频
JavaScript标准参考教程(阮一峰的,整理的不错)
JS必看
AngularJS Guide的中文分支
Angular2学习资料
AngularJS应用的最佳实践和风格指南
React-Native学习指南
七天学会NodeJS
node.js中文资料导航
Nodejs学习路线图
如何学习nodejs
工作,工具

Compiler Explorer
系统管理员工具集合
Pro Git
Nginx开发从入门到精通
Google 全球 IP 地址库
收集整理远程工作相关的资料
Color schemes for hackers
游戏开发工具集,MagicTools
开发者工具箱, free-for-dev
GitHub秘籍
Git风格指南
Bast-App
工具篇
平台工具&框架
Jupyter: IPython Notebook, 有个子项目sparkmagic,可以和Spark集合在一起,类似spark-notebook项目
Swagger: RESTful API设计工具,前后端分离项目必备,顺便推荐下Easy Mock
Flutter: Google出品,高性能跨平台移动应用开发框架
OpenZipkin: 分布式Trace系统,可用于分析服务调用链间的消耗
Phabricator: 软件开发平台,Facebook出品,现已开源,CodeReview神器(从这个往下一直到GitLab之间的工具统统可以忽略了)
Redmine/Trac:项目管理平台
Jenkins/Jira(非开源):持续集成系统(Apache Continuum,这个是Apache下的CI系统,还没来得及研究)
git,svn:源代码版本控制系统
GitLab/Gitorious:构建自己的GitHub服务器
AppVeyor - 云端持续集成工具,可以与GitHub搭配使用
Postman:RESTful,api测试工具,HTTP接口开发必备神器;可替代工具:Insomnia
Lottie: AE动画变原生代码,设计师必备
Sonar:代码质量管理平台
Nessus: 系统漏洞扫描器
gitbook:https://www.gitbook.io/写书的好东西,当然用来写文档也很不错的(发现不少产品的文档就是用的它)
Travis-ci:开源项目持续集成必备,和GitHub相结合,https://travis-ci.org/
Trello:简单高效的项目管理平台,注重看板管理
日志聚合:graylog、ELK(推荐新一代的graylog,基本上算作是开源的Splunk了)
开源测试工具、社区(Selenium、OpenQA.org)
Puppet:一个自动管理引擎,可以适用于Linux、Unix以及Windows平台。所谓配置管理系统,就是管理机器里面诸如文件、用户、进程、软件包这些资源。无论是管理1台,还是上万台机器Puppet都能轻松搞定。其他类似工具:CFEngine、SaltStack、Ansible
jumpserver: 开源堡垒机
Prometheus 监控系统+时序数据库,一般搭配Grafana使用。类似的系统还有Nagios,Zabbix,Ganglia
fleet:分布式init系统
Ansible:能够大大简化Unix管理员的自动化配置管理与流程控制方式。
GeoLite免费数据库
jsHint:js代码验证工具
haproxy: 高可用负载均衡(此外类似的系统还有nginx,lvs)
linux OS性能分析工具:dstat,iostat,iotop,nmon
kimono:将网页信息转换为api接口的工具
集群管理工具:pdsh,ClusterSSH,mussh(可以用它快速管理Hadoop集群)ipa-server做统一的认证管理
influxdb: 分布式时序数据库,结合Grafana可以进行实时数据分析
dot: 程序员绘图利器(是种语言,也是个工具)
Graph::Easy: (Ascii Art工具)字符流程图绘制,实乃程序员装逼神器。其他类似的工具Asciiflow, vi插件:drawit!
spf13-vim: 让你的vim飞起来!
Kubernetes: 容器集群管理系统
Gatling: 服务器性能压力测试工具,类似的还有wrk
systemtap: Linux内核探测工具、内核调试神器
Cygwin:Windows下的类UNIX模拟环境
MinGW:Windows下的GNU工具集
常用工具
EditorConfig: 让我们在各种不同IDE或编辑器下写代码保持风格一致
Mac下的神兵利器
asciinema: 终端录屏神器
Fiddler:非常好用的Web前端调试工具,当然是针对底层http协议的,一般情况使用Chrome等自带的调试工具也足够了,特殊情况还得用它去处理
Charles: Mac上的Web代理调试工具,类似Fiddler
fir.im免费的移动App内测托管平台
wireshark:知名的网络数据包分析工具
PowerCmd:替代Windows Cmd的利器
RegexBuddy:强大的正则表达式测试工具
Soure Insight:源代码阅读神器
SublimeText:程序员最爱的编辑器
Database.NET:一个通用的关系型数据库客户端,基于.NET 4.0开发的,做简单的处理还是蛮方便的
Navicat Premium:支持MySql、PostgreSQL、Oracle、Sqlite和SQL Server的客户端,通用性上不如Database.NET,但性能方面比Database.NET好很多,自带备份功能也用于数据库定时备份。
Synergy : 局域网内一套键盘鼠标控制多台电脑
DameWare:远程协助工具集(我在公司主要控制大屏幕用)
Radmin: 远程控制工具,用了一段时间的DameWare,还要破解,对Win7支持的不好,还是发现这个好用
Listary:能极大幅度提高你 Windows 文件浏览与搜索速度效率的「超级神器」
Clover:给资源管理器加上多标签,我平时工作的时候就用它,像Chrome一样使用资源管理器,甚是方便啊(这是Windows平台的)
WinLaunch:模拟Mac OS的Launch工具
OllyDbg: OD大名鼎鼎的反汇编工具,Win平台
Fritzing:绘制电路图
LICEcap:gif教程制作
Enigma Virtual Box(将exe,dll等封装成一个可执行程序)
Open DBDiff(针对SqlServer)数据库同步
SymmetricDS:数据库同步
BIEE,Infomatica,SPSS,weka,R语言:数据分析
CodeSmith,LightSwitch:代码生成
Pandoc:Markdown转换工具,出书用的。以前玩过docbook,不过现在还是Markdown盛行啊。
Window Magnet[Mac]:增强Mac窗口管理功能,想Win7一样具有窗口拖放到屏幕边缘自动调整的功能
log explorer:查看SqlServer日志
dependency walker:查询Windows应用程序dll依赖项
Shairport4w:将iPhone,iPad,iPod上的音频通过AirPlay协议传输到PC上
ngrok:内网穿透工具
Axure:快速原型制作工具,还有个在线作图的工具国内的一个创业团队做的,用着很不错http://www.processon.com/
Origami: 次世代交互设计神器
百度脑图:http://naotu.baidu.com/
tinyproxy:(Linux)小型的代理服务器支持http和https协议
EaseUS Partition Master:超级简单的分区调整工具,速度还是蛮快的,C盘不够用了就用它从D盘划点空间吧,不用重装系统这么折腾哦。
CheatEngine:玩游戏修改内存值必备神器(记得我在玩轩辕剑6的时候就用的它,超级方便呢)
ApkIDE: Android反编译神器(类似的还有apktool)
HandShaker: 锤子的良心之作:为解决安卓手机与Mac当中文件传输问题,专门开发的SmartFinder文件管理器改进版
翻、墙工具(自|由|门、天行浏览器,免费的VPN:http://www.mangovpn.com/),发现最方便还属Lantern,免费用起来超级方便(更新于2015-08-22)
设计工具:Sketch、OmniGraffle
MindManger:思维导图
MagicDraw: Uml图工具
innotop:MySql状态监测工具
墨刀:比Axure更为简单的原型工具,可以快速制作原型
Karabiner: Mac专用,修改键盘键位的神器,机械键盘必备
Timing:Mac专用,统计你的时间都花在哪了
LaTeX: 基于ΤΕΧ的排版系统, 让写论文更方便
Antlr:开源的语法分析器,可以让你毫无压力的写个小parser
第三方服务
Let's Encrypt: 免费、自动化、开放的证书签发服务
DnsPod:一个不错的智能DNS服务解析提供商
DigitalOcean:海外的云主机提供商,价格便宜,磁盘是SSD的,用过一段时间整体上还可以,不过毕竟是海外的,网速比较慢。国内的就是阿里云了。还有个比较知名的是:Linode,据说速度上比DigitalOcean好很多
移动端推送服务:个推、JPush、云巴
LeanCloud:移动应用开发服务,包括:数据存储、用户管理、消息推送、应用统计、社交分享、实时聊天等服务
Color Hunt: 漂亮炫酷的配色网站,程序员的福音
Heroku: PaaS平台
爬虫相关(好玩的工具)
Phantomjs(Web自动化测试,服务端渲染等)
berserkJS(基于Phantomjs的改进版本)
SlimerJS
CasperJS
selenium
HtmlUnit(开源的java 页面分析工具,也是个Headless的浏览器)
安全相关
sql注入检测:sqlmap、haviji
端口扫描:nmap,
masscan:据说可以6分钟中扫遍整个互联网的端口扫描器
渗透测试:BurpLoader
sqltools: sql漏洞利用工具
snort: 入侵检测
Web服务器性能/压力测试工具/负载均衡器
ab: ab是apache自带的一款功能强大的测试工具
curl-loader: 真实模拟、测试Web负载
http_load: 程序非常小,解压后也不到100K
webbench: 是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力。
Siege: 一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
squid(前端缓存),nginx(负载),nodejs(没错它也可以,自己写点代码就能实现高性能的负载均衡器):常用的负载均衡器
Piwik:开源网站访问量统计系统
ClickHeat:开源的网站点击情况热力图
HAProxy:高性能TCP /HTTP负载均衡器
ElasticSearch:搜索引擎基于Lucene
Page Speed SDK和YSLOW
HAR Viewer: HAR分析工具
protractor:E2E(end to end)自动化测试工具
大数据处理/数据分析/分布式工具
Hadoop:分布式的文件系统,结合其MapReduce编程模型可以用来做海量数据的批处理(Hive,Pig,HBase啥的就不说了),值得介绍的是Cloudera的Hadoop分支CDH5,基于YARN MRv2集成了Spark可直接用于生产环境的Hadoop,对于企业快速构建数据仓库非常有用。
Spark:大规模数据处理框架(可以应付企业中常见的三种数据处理场景:复杂的批量数据处理(batch data processing);基于历史数据的交互式查询(interactive query);基于实时数据流的数据处理(streaming data processing))
除了Spark,其他几个不错的计算框架还有:Kylin,Flink,Drill
Ignite: In-Memory Data Fabric
CarbonData: 华为的孵化项目,支持索引的列式存储
Ceph:Linux分布式文件系统(特点:无中心)
Storm:实时流数据处理,可以看下IBM的一篇介绍 (还有个Yahoo的S4,也是做流数据处理的)
Druid: 实时数据分析存储系统
Ambari: 大数据平台搭建、监控利器;类似的还有CDH
Tachyon:分布式内存文件系统
Greenplum: 基于PostgreSQL的分布式MPP数据库
Mesos:计算框架一个集群管理器,提供了有效的、跨分布式应用或框架的资源隔离和共享
Impala:新一代开源大数据分析引擎,提供Sql语义,比Hive强在速度上
presto: facebook的开源工具,大数据分布式sql查询引擎
SNAPPY:快速的数据压缩系统,适用于Hadoop生态系统中
Kafka:高吞吐量的分布式消息队列系统
ActiveMQ:是Apache出品,最流行的,能力强劲的开源消息总线
MQTT:Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分
RabbitMQ:记得OpenStack就是用的这个东西吧
ZeroMQ:宣称是将分布式计算变得更简单,是个分布式消息队列,可以看下云风的一篇文章的介绍
开源的日志收集系统:scribe、chukwa、kafka、flume。这有一篇对比文章
Zookeeper:可靠的分布式协调的开源项目
Databus:LinkedIn 实时低延迟数据抓取系统
数据源获取:Flume、Google Refine、Needlebase、ScraperWiki、BloomReach
序列化技术:JSON、BSON、Thrift、Avro、Google Protocol Buffers
NoSql:ScyllaDB(宣称是世界上最快的NoSql)、Apache Casandra、MongoDB、Apache CouchDB、Redis、BigTable、HBase、Hypertable、Voldemort、Neo4j
MapReduce相关:Hive、Pig、Cascading、Cascalog、mrjob、Caffeine、S4、MapR、Acunu、Flume、Kafka、Azkaban、Oozie、Greenplum
数据处理:R、Yahoo! Pipes、Mechanical Turk、Solr/ Lucene、ElasticSearch、Datameer、Bigsheets、Tinkerpop
NLP自然语言处理:Natural Language Toolkit、Apache OpenNLP、Boilerpipe、OpenCalais
机器学习:TensorFlow(Google出品),WEKA、Mahout、scikits.learn、SkyTree
可视化技术:GraphViz、Processing、Protovis、Google Fusion Tables、Tableau、Highcharts、EChats(百度的还不错)、Raphaël.js
Kettle:开源的ETL工具
Pentaho:以工作流为核心的开源BI系统
Mondrian:开源的Rolap服务器
Oozie:开源hadoop的工作流调度引擎,类似的还有:Azkaban
开源的数据分析可视化工具:Weka、Orange、KNIME
Cobar:阿里巴巴的MySql分布式中间件
数据清洗:data wrangler, Google Refine
Web前端
Material Design: 谷歌出品,必属精品
Vue.js: 借鉴了Angular及React的JS框架,设计理念较为先进
Sciter: GUI框架,采用自己的HTML/CSS解析器,具有出色的扩展特性和性能,dll压缩后在1~2M
GRUNT: js task runner
Sea.js: js模块化
knockout.js:MVVM开发前台,绑定技术
Angular.js: 使用超动感HTML & JS开发WEB应用!
Highcharts.js, ECharts, Flot: 常用的数据可视化库
D3.js: 是一个基于JavaScript数据展示库(类似的还有P5.js)
Vega: 基于D3的可视化语法
NVD3: 基于d3.js的图表库
Raw:非常不错的一款高级数据可视化工具
Rickshaw:时序图标库,可用于构建实时图表
JavaScript InfoVis Toolkit:另一款Web数据可视化插件
Pdf.js,在html中展现pdf
ACE,CodeMirror:Html代码编辑器(ACE甚好啊)
NProcess:绚丽的加载进度条
impress.js:让你制作出令人眩目的内容展示效果(类似的还有reveal)
Threejs:3DWeb库
Hightopo:基于Html5的2D、3D可视化UI库
jQuery.dataTables.js:高度灵活的表格插件
Raphaël:js,canvas绘图库,后来发现百度指数的图形就是用它绘出来的
director.js:js路由模块,前端路由,Nodejs后端路由等,适合构造单页应用
pace.js:页面加载进度条
bower:Web包管理器
jsnice:有趣的js反编译工具,猜压缩后的变量名,http://www.jsnice.org/
Zepto.js:移动端替代jQuery的东东,当然也可以使用jquery-mobile.
UI框架:Foundation,Boostrap,Pure,EasyUI,Polymer
前段UI设计师必去的几个网站:Dribbble,awwwards,unmatchedstyle,UIMaker
Mozilla 开发者中心:https://developer.mozilla.org/en-US/
图标资源:IcoMoon(我的最爱),Font Awesome, Themify Icons,FreePik,Glyphicons
artDialog:非常漂亮的对话框
AdminLTE:github上的一个开源项目,基于Boostrap3的后台管理页面框架
Respond.js:让不懂爱的IE6-8支持响应式设计
require.js: js模块加载库
select2:比chosen具有更多特性的选择框替代库
AngularUI:集成angular.js的UI库
normalize.css: 采用了现代化标准让各浏览器渲染出的html保持一致的库
CreateJS:Html5游戏引擎
Less,Compass:简化CSS开发
emojify.js:用于自动识别网页上的Emoji文字并将其显示为图像
simditor:一个不错的开源的html编辑器,简洁高效
Sencha: 基于html5的移动端开发框架
SuperScrollorama+TweenMax+skrollr:打造超酷的视差滚动效果网页动画
jquery-smooth-scroll:同上,平滑滚动插件
Animate.css:实现了各种动画效果的css库
Emmet:前端工程师必备,前身为 Zen Coding
React: facebook出品的js UI库
highlight.js:专门用来做语法高亮的库
GoJS: Html5交互式图表库,看demo更适合层次结构的图表。
10 Pure CSS (Mostly) Flat Mobile Devices: http://marvelapp.github.io/devices.css/
CodePen: http://codepen.io/
jsfiddle: http://jsfiddle.net/ 前端js,html,css测试利器
语言篇
折腾中:Scala、Python、Lua、JavaScript、Go

待折腾:

Racket
OCaml
Rust
Julia
Scala
Scala Standard Library API
Scala School!: A Scala tutorial by Twitter
A Tour of Scala: Tutorial introducing the main concepts of Scala
Scala Overview on StackOverflow: A list of useful questions sorted by topic
Programming in Scala,最新的第3版,还没有电子版,电子版是第一版
《Scala for the Impatient》
《Scala in Depth》
《Programming Scala》Dean Wampler and Alex Payne. O’Reilly 2009
Scala By Example
Scala Cheatsheet学习模式匹配的好资料
Glossary of Scala and FP terms
Metascala: A JVM written in Scala
LMS: Program Generation and Embedded Compilers in Scala
parboiled2: 性能很好的parser
Java
常用的IDE:IntelliJ IDEA(强烈推荐),Eclipse,Netbeans
fastutil: 性能更好的Java集合框架
Guava: 谷歌的Java工具包,应用广泛
JMH: Java Benchmark性能测试框架
Vert.x: 性能彪悍的异步非阻塞编程框架
Lagom: 微服务框架,提供了Java、Scala API
jOOQ:java Orm框架
Janino: 超级小又快的Java编译器,Spark的Tungsten引起用的它
Curator:Netflix公司开源的一个Zookeeper client library,用于简化Zookeeper客户端编程,现在已经是apache下的一个独立项目了。Spark的HA也用的这货。
Rx(Reactive Extensions)框架:RxJava(Android中用的比较多), Quasar
FindBugs: 代码静态分析工具,找出代码缺陷
Java反编译工具:Luyten,JD-Gui
Drools: 规则引擎
Jersey: Java RESTful 框架
canal: 阿里巴巴出品,binlog增量订阅&消费组件
Web开发相关:Tomcat、Resin、Jetty、WebLogic等,常用的组件Struts,Spring,Hibernate
Netty: 异步事件驱动网络应用编程框架,用于高并发网络编程比较好(NIO框架,spark 1.2.0就用netty替代了nio)
MINA:简单地开发高性能和高可靠性的网络应用程序(也是个NIO框架),不少手游服务端是用它开发的
Activiti:工作流引擎,类似的还有jBPM、Snaker
Perfuse:是一个用户界面包用来把有结构与无结构数据以具有交互性的可视化图形展示出来.
Gephi:复杂网络分析软件, 其主要用于各种网络和复杂系统,动态和分层图的交互可视化与探测开源工具
Nutch:知名的爬虫项目,hadoop就是从这个项目中发展出来的
web-harvest:Web数据提取工具
POM工具:Maven+Artifactory
Akka:一款基于actor模型实现的 并发处理框架
EclEmma:覆盖测试工具
Shiro:安全框架
joda-time:简化时间处理
parboiled:表达式解析
dozer: 深拷贝神器
dubbo: 阿里巴巴出品的分布式服务框架
jackson databind: json序列化工具(fastjson,simplejson)
Atomikos: 分布式事务管理
BoneCP:性能很赞的数据库连接池组件,据说比c3p0快好多
ProGuard: obconfuscation tool, 强大的混淆工具
S-99:Scala相关的99个问题
Python
PyCharm:最佳Python IDE
Eric,Eclipse+pydev,比较不错的Python IDE
PyWin:Win32 api编程包
numpy:科学计算包,主要用来处理大型矩阵计算等,此外还有SciPy,Matplotlib
GUI相关:PyQt,PyQwt
supervisor:进程监控工具
PyGame: 基于Python的多媒体开发和游戏软件开发模块
Web框架: Django 开源web开发框架,它鼓励快速开发,并遵循MVC设计
Swift
Swift精选资料
43个优秀的开源项目
客户端

糗事百科 Swift
HackerNews Swift
知乎日报app
Framework

Twitter框架
Mac下简单HTTP Server Swifter
小工具

Swift Alarm
Swift Note
Swift RSS Reader
Swift-PM2.5查询app
游戏

Flappy Swift
FanFan Swift
.NET
Xilium.CefGlue:基于CEF框架的.NET封装,基于.NET开发Chrome内核浏览器
CefSharp:同上,有一款WebKit的封装,C#和Js交互会更简单
netz:免费的 .NET 可执行文件压缩工具
SmartAssembly:变态的.net代码优化混淆工具
NETDeob0:.net反混淆工具,真是魔高一尺道高一丈啊(还有个de4dot,在GitHub上,都是开源的)
ILMerge:将所有引用的DLL和exe文件打成一个exe文件
ILSpy:开源.net程序反编译工具
Javascript.NET:很不错的js执行引擎,对v8做了封装
NPOI: Excel操作
DotRAS:远程访问服务的模块
WinHtmlEditor: Winform下的html编辑器
SmartThreadPool:使用C#实现的,带高级特性的线程池
Snoop: WPF Spy Utility
Autofac: 轻量级IoC框架
HtmlAgilityPack:Html解析利器
Quartz.NET:Job调度
HttpLib:@CodePlex,简化http请求
SuperSocket:简化Socket操作,基于他的还有个SuperWebSocket,可以开发独立的WebSocket服务器了
DocX:未安装Office的情况下操作Word文件
Dapper:轻量级的ORM类,性能不错
HubbleDotNet:支持接入数据库的全文搜索系统
fastJSON:@CodeProject,高性能的json序列化类
ZXing.NET:@CodePlex,QR,条形码相关
Nancy:轻量级Http服务器,做个小型的Web应用可以摆脱IIS喽(Nancy.Viewengines.Razor,可以加入Razor引擎)
AntiXSS:微软的XSS防御库Microsoft Web Protection Library
Jint:JavaScript解释器
CS-Script:将C#代码文件作为脚本执行
Jexus:Linux下 高性能、易用、免费的ASP.NET服务器
Clay:将dynamic发挥的更加灵活,像写js一样写C#
DynamicJSON:不必定义数据模型获取json数据
SharpPcap:C#版的WinPcap调用端,牛逼的网络包分析库(自带PacketNotNet用于包协议分析)
Roslyn:C#,VB编译器
ImageResizer: 服务端自由控制图片大小,真乃神器也,对手机端传小图,PC端传大图,CMS用它很方便
UI相关:DevExpress, Fluent(Office 07风格), mui(Modern UI for WPF)
NetSparkle:应用自动更新组件
ConfuserEx: 开源.net混淆工具
ServiceStack: 开源高性能Web服务框架,可用于构建高性能的REST服务
Expression Evaluator:Eval for C#,处理字符串表达式
http://nugetmusthaves.com/
Reactive Extensions (Rx):异步,事件驱动编程包, Rx = Observables + LINQ + Schedulers
C & C++
Thrift:用来进行可扩展且跨语言的服务的开发(类似的还有个Avro,Google protobuf)。
libevent:是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。(对了还有个libev呢)
Boost:不多说了,准C++标准库
ValgrindPtmallocPurify: 调试工具
NetworkServer架构:acceptor->dispatcher->worker(这个不算工具哦)
POCO - 开源的C++类库及应用程序框架的集合,它主要提供简单的、快速的网络和可移植应用程序
breakpad:崩溃转储和分析模块,很多crashreport会用到
UI界面相关:MFC、BCG和QT这类的就不说了,高端一点的还有Html和DirectUI技术:libcef(基于chrome内核的,想想使用html5开发页面,还真有点小激动呢)、HtmlLayout、Duilib、Bolt,非C++的,还有node-webkit也不错,集成了node和webkit内核。
其他
游戏开发相关
MINA:使用Java开发手游和页游服务器(对了还有Netty,也很猛的,都是基于NIO的)
HP-Socket:见有有些页游服务器使用这个构建的
Unreal: 虚幻引擎,C++,基于这个引擎的游戏很多
OGRE:大名鼎鼎的3D图形渲染引擎,天龙八部OL、火炬之光等不少游戏都用了这个引擎
OpenVDB:梦工厂C++的特效库,开源的
cocos2d:跨平台2D游戏引擎
unity3d:跨平台3D游戏引擎,很火的哦
Nodejs:也有不少使用它来开发手游和页游服务器(网易的Pomelo)
日志聚合,分布式日志收集
Scribe:Facebook的(nodejs + scribe + inotify 同步日志)
logstash:强大的日志收集系统,可以基于logstash+kibana+elasticsearch+redis开发强大的日志分析平台
log.io: nodejs开发的实时日志收集系统
Graylog: 易用、功能丰富的日志管理系统, 部署、维护、搜索比ELK简单
RTP,实时传输协议与音视频
RTP,RTCP,RTSP-> librtp,JRTPLIB(遵循了RFC1889标准)
环形缓冲区,实时数据传输用
SDL,ffmpeg,live555,Speex
Red5:用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。