posts - 136,  comments - 256,  trackbacks - 7
  2009年6月19日
     摘要: 让你成功的九个心理定律  阅读全文
posted @ 2009-06-19 22:51 风生水起 阅读(17) | 评论 (0)编辑
  2009年6月8日
     摘要: 基础知识  阅读全文
posted @ 2009-06-08 14:59 风生水起 阅读(45) | 评论 (0)编辑
  2009年5月26日
     摘要: 读书摘要  阅读全文
posted @ 2009-05-26 15:40 风生水起 阅读(28) | 评论 (0)编辑
  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月20日
     摘要: SQLServer2005查找定位性能瓶颈和性能调优的一些方法  阅读全文
posted @ 2009-03-20 10:34 风生水起 阅读(157) | 评论 (0)编辑
  2009年3月19日
判断自己是不是进步了,主要看自己的掌控能力,掌控能力主要有:立场、方向、方法、惯性。
要判断自己能力的进退,与其看事情的成败,不如反省这些掌控力道的消长。

我们健康上出现难关,不是自己吃出来的,就是起居不正常而造成的。我们财务上出现问题,不是太相信别人,就是太放纵自己所造成。我们工作能力不足,不是以前努力不够,就是跳跃成长得太快。我们爱情出现问题,不是没有照顾好自己应该爱的人,就是照顾了太多自己不该爱的人。我们被人欺负,不是自己委曲求全于不应该的人,就是缺少了尊重自己生命的智慧。
posted @ 2009-03-19 23:08 风生水起 阅读(37) | 评论 (0)编辑
     摘要: 时间管理的三大杀手——拖延、犹豫不决、目标不明确。  阅读全文
posted @ 2009-03-19 20:30 风生水起 阅读(170) | 评论 (0)编辑
<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

即使你拥有人人羡慕的容貌,博览群书的才学,挥之不尽的财富,也不能证明你的强大,因为心的强大,才是真的强大。

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类

随笔档案

文章分类

收藏夹

Friends

Studying

积分与排名

  • 积分 - 86853
  • 排名 - 684

最新评论

阅读排行榜

评论排行榜