
2009年5月25日
摘要: 一,单选题(每题3分,共45分)
1,地上10块,床上50。那么一个男子给50块钱说明:
A,他有品味B,他很聪明C,他有钱D,他很强壮
2,几个女人在公园里吃棒冰。你认为哪一位最可能是女教师?
A,舔着吃的B,咬着吃的C,含着吃的D,带结婚戒指的
阅读全文
posted @
2009-05-25 14:20 风生水起 阅读(65) |
评论 (0) |
编辑

2009年5月12日
这个问题困扰了我一段时间,项目中经常会出现很奇怪的情况:如果查询数据库有结果返回,查询过程会非常快;但是如果没有结果,很可能会执行很长一段时间以致超时。今天又遇到了这种情况而且今天还算有时间,我就认真跟踪了一下,发现有数据时,执行计划显示index seek,而没有数据返回时,执行计划显示的是Table scan,我对执行计划认真分析比对,感觉找到了其中的原因。
一般好一点的数据库系统都比较智能,他会有一套规则来判断如何执行查询会比较快。对于索引有一个规则是如果join返回的结果数量比较少,查询引擎会选择使用索引来加快速度,但是如果结果数量非常多,应用索引会耗费更多的资源和时间,查询引擎会选择表扫描。而选择执行计划的过程也是会耗费时间的,如果这个过程太长也是会影响查询速度的,所以一般分析引擎只是大概进行估计,在数据量很大的情况下很容易出现误差,而我的问题就是分析引擎的误差引起的。
我的查询涉及到table A(13亿多条数据),B(临时表,几百到几十万条数据)和其他几个几百几千几万的小表,A和B是需要join的,如果B的数据量很大,数据库需要分析的时间就会很多,特别是与A关联后没有结果返回的时候,我想数据库设计者不知是出于什么考虑,反正结果是选择表扫描。
我后来的方案做了一个循环,B表每次取1000条数据与A关联,最后将结果放入一个表中,速度飞快
又碰到另外一种情况,也是大数据量执行超时,查看一下执行计划超大表A总是会先与小表C关联,造成表扫描和不能应用索引。我尝试使用嵌套查询让A和B先关联,但是SQL在执行的时候还是会按照自己的分析让A和C先关联,最后我不得不利用临时表,把它拆成两个SQL,这样牺牲点内存,SQL终于按我的意愿执行了,速度也是飞快。
似乎用with index来强制使用索引更好一些,现在用with index表还不能使用别名。(select * from table with(index =index1) inner join table2 on...)
如果一个列有很多重复行,建立索引后效率也会很低,可以考虑根据情况建立联合索引。
select ... from A
inner join B on A.c1=B.c1
innerjoin C on A.c2=C.c2
上面的情况可以应用A(c1,c2)联合索引。
posted @
2009-05-12 17:39 风生水起 阅读(32) |
评论 (1) |
编辑

2009年5月7日
最近项目中使用到了SqlBulkCopy实现批量复制,在这里,我把部分代码筛选出来简单说明一下,希望对大家研究和使用SqlBulkCopy 有帮助.因为是筛选的代码,不是完整的方法,请大家尽量不要直接拷贝使用,这篇文章的目的上帮大家简单的理解SqlBulkCopy.

/*******************调用SqlBulkCopy实现DataTable到SQL的批量拷贝******************/
if (SqlConn.State == ConnectionState.Closed)

{
SqlConn.Open();
}

//定义SQL事务并嵌入到批量拷贝的工作中
SqlTransaction objSqlTran = SqlConn.BeginTransaction();

//定义SqlBulkCopy:SqlConn为SqlConnection,SqlBulkCopyOptions枚举类型,objSqlTran为调用的事务
SqlBulkCopy objSqlCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, objSqlTran);

//分批次拷贝的行数
objSqlCopy.BatchSize = 10;
objSqlCopy.BulkCopyTimeout = 240;
//目标表名
objSqlCopy.DestinationTableName = "DetailAccountReport";

//源表对目标表字段的映射,因为默认是按顺序以及名字匹配,所以这步很重要
objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");
objSqlCopy.ColumnMappings.Add("Num", "SumNum");
objSqlCopy.ColumnMappings.Add("Money", "SumMoney");
objSqlCopy.ColumnMappings.Add("Explain", "Explain");

try

{
//将DataTabel类型的objDT作为源拷贝到目标表
objSqlCopy.WriteToServer(objDT);
objSqlTran.Commit();
}
catch

{
objSqlTran.Rollback();
}
finally

{
objSqlCopy.Close();
SqlConn.Close();
}

return objDT;
说明://源表对目标表字段的映射,因为默认是按顺序以及名字匹配,所以这步很重要
objSqlCopy.ColumnMappings.Add("ProjectDefID", "ProjectDefID");
objSqlCopy.ColumnMappings.Add("Num", "SumNum");
objSqlCopy.ColumnMappings.Add("Money", "SumMoney");
objSqlCopy.ColumnMappings.Add("Explain", "Explain");
注意这里,前面是源表字段,后面是目标表字段.默认是按照顺序和名称匹配的形式,所以要求两个数据集的结构完全一致,但是在现实使用中,很少有完全一致的情况出现,所以这段代码尤其重要.
objSqlCopy.WriteToServer(objDT);
objDT是我们项目中在之前经过处理的DataTable, WriteToServer()支持对DataTable,DataReader,DataRow[]的操作,大家可以灵活运用.
posted @
2009-05-07 15:36 风生水起 阅读(27) |
评论 (0) |
编辑

2009年4月30日
英文状态的单引号“'”作用:
1. 前导零数据的输入。如输入“001”,正常输入“001”时系统会变成“1”。可先输入英文状态的单引号“'”,再输入001。这时系统自动将“001”转化为“文本”类型,但仍可与数值进行运算。如图所示,加法运算。

2. 小写逻辑常量的输入。如输入“true”,正常输入“true”系统会自动转化为大写,这时可先输入英文状态的单引号,再输入“true”。这时系统也将内容转化为文本类型,但仍可作为逻辑常量使用,如用not函数求值。如图2所示。
3. 当输入日期数据时,我们也同样在之前先输入英文状态的单引号,结果如何呢?从图3可看出,系统也自动转换为文本类型,当它与0相加时得到的值与“DATEVALUE()”函数值相同,即将是此日期所对应的序列数。
批量插入:
首先选定区域,然后调用下面的VBA的代码来实现。
Sub Sample()
Selection.NumberFormatLocal = """'""General"
End Sub
批量删除:使用单引号后如果想再将其转换成数值或日期格式时,就有麻烦了。单引号是无法通过查找替换的方法删除的,只能一个一个的删除。下面列举了集中去除单引号的方法:
1. 复制到Word等编辑软件中再拷回来就可以去掉;
2. 将该带单引号的单元格乘以1,然后再设置该单元格的属性就可以了;
3. 在空白单元格右键复制,然后在有单引号的单元格---右键---选择性粘贴---选择加---完成。
posted @
2009-04-30 18:25 风生水起 阅读(376) |
评论 (0) |
编辑

2009年3月19日
判断自己是不是进步了,主要看自己的掌控能力,掌控能力主要有:立场、方向、方法、惯性。
要判断自己能力的进退,与其看事情的成败,不如反省这些掌控力道的消长。
我们健康上出现难关,不是自己吃出来的,就是起居不正常而造成的。我们财务上出现问题,不是太相信别人,就是太放纵自己所造成。我们工作能力不足,不是以前努力不够,就是跳跃成长得太快。我们爱情出现问题,不是没有照顾好自己应该爱的人,就是照顾了太多自己不该爱的人。我们被人欺负,不是自己委曲求全于不应该的人,就是缺少了尊重自己生命的智慧。
posted @
2009-03-19 23:08 风生水起 阅读(37) |
评论 (0) |
编辑
摘要: 时间管理的三大杀手——拖延、犹豫不决、目标不明确。
阅读全文
posted @
2009-03-19 20:30 风生水起 阅读(170) |
评论 (0) |
编辑