博客状态
  • 随笔 - 4
  • 文章 - 0
  • 评论 - 4346
  • Trackbacks - 1267

 

2007年6月20日

SQL引发的血案

先看如下2中SQL写法:
(1)
declare @monthstart datetime
declare @monthend datetime
declare @minID int
declare @maxID int

set @monthstart= ‘2006-06-20 17:02:00’
set @monthend= ‘2006-07-20 17:02:00’

select @minID = min(postid),@maxID = max(postId) from table_posts where postdate between @monthstart and @monthend
 select @minID,@maxId

(2)
declare @minID int
declare @maxID int
select @minID = min(postid),@maxID = max(postId) from table_posts where postdate between '2006-06-20 17:02:00' and '2006-07-20 17:02:00'
select @minID,@maxID

这2条语句执行结果会有区别么?
有?回复告诉俺啥区别被。
没有。俺也这么想滴。

再描述一下俺查询滴数据量。俺查询滴那个表的数据量是近200万,不算多。

好啦,现在答案揭晓:第一条执行速度N慢,相对于第二条来说,多浪费20多秒的时间。
你别问俺为啥,俺也郁闷,至今未找到根子。不过在轻舞flash老哥的帮助下,还是找到了两者差距的所在。第一条逻辑读9万多,比第二条多9万多。汗一个。。。。
不是啥子数据库服务器的缘故,就算是俺也不知道,因为服务器不是俺设置的。

但你非得在查询条件中使用变量怎么办?牛人自有牛人的办法。还是flash老哥给的方法,贴出来共享。不过上面的问题谁碰到过可要联系俺啊。

另类解决方案闪亮登场:
declare @monthstart datetime
declare @monthend datetime
declare @minD int
declare @maxID int
declare @sqlcom varchar(8000)
set @monthstart='2006-06-20 17:02:00'
set @monthend='2006-07-20 17:02:00'

set @sqlcom='select min(postid) as minId, max(postId) as maxId from forums_posts where postdate between '''+Convert(varchar(16),@monthstart,121) +''' and '''+ Convert(varchar(16),@monthend ,121)+''''
print @sqlcom

exec(@sqlcom)

走过,路过,要记得留过。。。
鄙视看帖不回的,俺多辛苦的文章啊!

PS:
可能是表的问题,因为我在另一个表执行类似第一条那样的语句,速度很快。另一个表的字段同样有索引。
PS:
以上2种不同的语句,如果不带Min、Max函数,则他们时间上相差无几。而且读盘一样。难道是Min、Max函数搞怪?

2007年6月1日

程序错误:将截断字符串或二进制数据。

今日同事说论坛后台编辑不了,我跟踪一下,发现程序并无异常报告。分析后认为是数据库错误,于是执行SQL语句排错。经测试,发现修改字段时,使用较长的字符串时报如下错误:

将截断字符串或二进制数据。
语句已终止。

记得以前也碰到过这样的错误,确实是数据库错误。从错误信息提示分析,容易让人以为是非法字符引起的,我初步也这么认为(呵呵,以前碰到这个错误的原因不记得了!),于是排除几个认为非法的字符(还好仅仅是几个字符,不然我也不会找到真正的原因了。),F5,错误信息依旧,于是看某个字段的长度,将测试字符串缩短后F5,执行成功!看来报这个错是输入的数据超过字段长度的缘故了。从错误提示信息分析,根据“截断”2字就容易让我以为是输入了非法字符,但经过这次测试,我觉得“截断”应该是某个东西过长,过大,而被截断一部分的意思,而不是我们理解的“过滤掉”这个意思。

我根据自己想法进行了几个测试。首先在输入数据末尾使用空格,以此是输入数据超过字段长度,F5,以为会报错,显示执行成功!换一种方式,将空格放输入数据中间,报错!难道SQl中有Trim?呵呵,哪位高人指点一二?

2007年3月15日

利用userData实现客户端保存表单数据[转的]

对于多数网页制作的朋友,实现在客户端保存在网页表单上的信息,比较多的是采用Cookie技术来实现,这些功能例如:下拉列表框选择的选项,文本框输入的数据等。事实上,我们可以利用微软DHTML默认行为中的userData行为来实现这个功能。 


因为很多网友问到这样的问题,整理了一下,并提供了三个示例。下面将就该行为的使用做一个介绍: 


UserData 行为(userData Behavior): 


1、说明: 

userData行为通过将数据写入一个UserData存储区(UserData store)来保存数据,userData可以将数据以XML格式保存在客户端计算机上,如果你用的是 Windows 2000 或者 Windows XP,是保存在C:\Documents and Settings\Liming\UserData\文件夹下(如果操作系统不是安装在C盘,那么C就应该是操作系统所在的分区)。 


该数据将一直存在,除非你人为删除或者用脚本设置了该数据的失效期。 


userData行为提供了一个比Cookie更具有动态性和更大容量的数据结构。每页的UserData存储区数据大小可以达到64 Kb,每个域名可以达到640 Kb。 

userData行为通过sessions为每个对象分配UserData存储区。使用save和load方法将UserData存储区数据保存在缓存(cache)中。一旦UserData存储区保存以后,即使IE浏览器关闭或者刷新了,下一次进入该页面,数据也能够重新载入而不会丢失。 

出于安全的考虑,相同协议使用同一个文件夹保存UserData存储区数据。 

For security reasons, a UserData store is available only in the same directory and with the same protocol used to persist the store. 


在HTML、HEAD、TITLE和STYLE标记上应用了userData行为后使用save和load方法将会出错。 
Setting the userData behavior (proposed) class on the HTML, HEAD, TITLE, or STYLE object causes an error when the save or load method is called. 


必须在行内或者文档的HEAD部分宣告如下样式: 


   <STYLE> 
      .userData {behavior:url(#default#userdata);} 
   </STYLE> 


userData行为可用于Microsoft? Win32?和Unix平台上的IE 5.0以上版本,不支持Netscape。 


2、语法: 

HTML     <ELEMENT STYLE="behavior:url('#default#userData')" ID=sID> 

Script     object.style.behavior = "url('#default#userData')" 

             object.addBehavior ("#default#userData") 

注:sID参数是一个可以描述该标记的唯一id。ID是可选的,但如果有,可以在脚本中方便地对该标记加以控制。 


3、成员: 


expires 

  设置或取得使用userData行为保存数据的失效日期。 

    脚本语法:对象ID.expires = 参数 

    参数是一个使用UTC(Universal Time Coordinate,世界调整时间)格式表示失效日期的字符串。该属性可以读写,没有默认值。浏览器会对比这个日期和当前日期,如果到期,该数据就自动失效。 


getAttribute() 
  取得指定的属性值。 


load(存储区名) 
  从UserData存储区载入存储的对象数据。 


removeAttribute() 
  从对象中删除指定的属性值。 


save(存储区名) 
  将对象数据存入一个UserData存储区。 


setAttribute() 
  设置指定的属性值。 


XMLDocument 
  取得存储该对象数据的XML DOM引用。 


具体用法可以查看MSDN(http://msdn.microsoft.com) 4、示例

示例一:文本框标记的应用(Microsoft)
<HTML>
            <HEAD>
            <STYLE>
            .userData {behavior:url(#default#userdata);}
            </STYLE>
            <SCRIPT>
            function fnSaveInput(){
            var oPersist=oPersistForm.oPersistInput;
            oPersist.setAttribute("sPersist",oPersist.value); //将oPersist.value存储为sPersist属性
            oPersist.save("oXMLBranch");  //存储在名为oXMLBranch的UserData存储区
            }
            function fnLoadInput(){
            var oPersist=oPersistForm.oPersistInput;
            oPersist.load("oXMLBranch");  //载入在名为oXMLBranch的UserData存储区
            oPersist.value=oPersist.getAttribute("sPersist"); //将sPersist属性赋值给oPersist.value
            }
            </SCRIPT>
            </HEAD>
            <BODY>
            <FORM ID="oPersistForm">
            <INPUT CLASS="userData" TYPE="text" ID="oPersistInput">
            <INPUT TYPE="button" VALUE="Load" onclick="fnLoadInput()">
            <INPUT TYPE="button" VALUE="Save" onclick="fnSaveInput()">
            </FORM>
            </BODY>
            </HTML>
 [Ctrl+A 全选,提示:你可修改代码后运行] 
 
 
示例二:Checkbox标记的应用
<style>
            .userData {behavior:url(#default#userdata);}
            </style>
            <input type=checkbox id=chkbox1 class=userData>
            <script>
            var obj=document.all.chkbox1;
            obj.attachEvent('onclick',saveChecked)
            function saveChecked(){
            obj.setAttribute("bCheckedValue",obj.checked);
            obj.save("oChkValue");
            }
            window.attachEvent('onload',loadChecked)
            function loadChecked(){
            obj.load("oChkValue");
            var chk=(obj.getAttribute("bCheckedValue")=="true")?true:false;
            obj.checked=chk;
            }
            </script>
 [Ctrl+A 全选,提示:你可修改代码后运行] 
 
 
示例三:Select标记的应用 <style>
            .userData {behavior:url(#default#userdata);}
            </style>
            <select id="select1"  class="userData">
            <option>option1</option>
            <option>option2</option>
            <option>option3</option>
            <option>option4</option>
            </select>
            <script>
            var obj=document.all.select1;
            obj.attachEvent('onchange',saveSelectedIndex)
            function saveSelectedIndex(){
            obj.setAttribute("sSelectValue",obj.selectedIndex);
            obj.save("oSltIndex");
            }
            window.attachEvent('onload',loadSelectedIndex)
            function loadSelectedIndex(){
            obj.load("oSltIndex");
            obj.selectedIndex=obj.getAttribute("sSelectValue");
            }
            </script>
 [Ctrl+A 全选,提示:你可修改代码后运行]  

初识Web Garden与Web Farms

        今天跟老板讨论工作的时候,俺问老板是不是可以使用Cache来暂时保存数据,然后再一次性插入数据库中,以避免频繁操作数据库导致的性能问题。老板否定了俺的说法。老板说Cache不靠谱,容易丢失,并且网站配置使用了Web Garden,而且还是多服务器,Cache不能共享,俺一下就蔫巴了,还真是个问题。。。。

不过俺没搞懂老板说的Web Garden是虾米咚咚,于是Google一把,终于明白了,原来Web GardenIIS6的一个功能。

 

Google一把,搜到MSDN的关于Web Garden的英文文档(http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/659f2e2c-a58b-4770-833b-df96cabe569e.mspx?mfr=true),大概浏览了一下,加上老板所说,对Web Garden有了初步的了解。同时也获得了另一个名词:Web Farms

Web GardenIIS6 Web Garden 指的是一个应用程序可以成多个进程(w3wp.exe)来执行,一次请求使用其中的一个。用这个的主要目的是提高程序的可用性。当其中一个进程发生错误,那么也不会影响其他进程。发生错误的进程可以根据规则关闭,而其他的进程则可以继续工作。(引用别人滴,俺自己还没理顺怎么解释它。)

Web Farms:这个嘛,没找到资料,但大部分程序都是用这个方式的。

 

写的仓促,看过的人若不知所云,当俺是火星人好了。

 

 

版权所有 © wangzhe