--text字段增加处理

--创建测试表
create table test(id varchar(3),detail text)
insert into test
select '001','A*B'

--定义添加的的字符串
declare @s_str varchar(8000),@postion int
select @s_str='*C'                 --要添加的字符串
        ,@postion=null                --追加的位置,null 加在尾部,0 加在首部,其他值则加在指定位置

--字符串添加处理
declare @p varbinary(16)
select @p=textptr(detail) from test where id='001'
updatetext test.detail @p @postion 0 @s_str

--显示处理结果
select * from test
go

--删除测试表
drop table test


--text字段的替换处理

--创建数据测试环境
create table test(id varchar(3),txt text)
insert into test
select '001','A*B'
go

--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='*'         --要替换的字符串
        ,@d_str='+'                --替换成的字符串

--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(txt)
        ,@rplen=len(@s_str)
        ,@postion=charindex(@s_str,txt)-1
from test where id='001'

while @postion>0
begin
        updatetext test.txt @p @postion @rplen @d_str
        select @postion=charindex(@s_str,txt)-1 from test
end

--显示结果
select * from test

go
--删除数据测试环境
drop table test

--text字段的添加处理存储过程--全表

--创建测试表
create table [user](uid int,UserLog text)
create table [order](uid int,state bit)

insert into [user]
select 1,'a'
union all select 2,'b'
union all select 3,'c'

insert into [order]
select 1,1
union all select 2,0
union all select 3,1
go

--处理的存储过程
CREATE PROCEDURE spUpdateUserLog
@StrLog text,
@State int
AS
--定义游标,循环处理数据
declare @uid int
declare #tb cursor for select a.uid from [user] a join [order] b on a.uid=b.uid
where state=@state

open #tb
fetch next from #tb into @uid
while @@fetch_status=0
begin
        --字符串添加处理
        declare @p varbinary(16)
        select @p=textptr(UserLog) from [user] where uid=@uid
        updatetext [user].UserLog @p null 0 @StrLog
        fetch next from #tb into @uid
end
close #tb
deallocate #tb
go

--调用示例:
exec spUpdateUserLog '123',1

--显示处理结果
select * from [user]

go

--删除测试环境
drop table [user],[order]
drop proc spUpdateUserLog

/*--测试结果

uid         UserLog   
----------- ----------
1           a123
2           b
3           c123

(所影响的行数为 3 行)
--*/
--text字段的替换处理--全表替换

--创建数据测试环境
create table test(id varchar(3),txt text)
insert into test
select '001','A*B'
union all select '002','A*B-AA*BB'
go

--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='*'         --要替换的字符串
        ,@d_str='+'                --替换成的字符串


--定义游标,循环处理数据
declare @id varchar(3)
declare #tb cursor for select id from test
open #tb
fetch next from #tb into @id
while @@fetch_status=0
begin
        --字符串替换处理
        declare @p varbinary(16),@postion int,@rplen int
        select @p=textptr(txt)
                ,@rplen=len(@s_str)
                ,@postion=charindex(@s_str,txt)-1
        from test where id=@id
       
        while @postion>0
        begin
                updatetext test.txt @p @postion @rplen @d_str
                select @postion=charindex(@s_str,txt)-1 from test where id=@id
        end

        fetch next from #tb into @id
end
close #tb
deallocate #tb

--显示结果
select * from test

go
--删除数据测试环境
drop table test

************************
支持text字段处理的仅有:
下面的函数和语句可以与 ntext、text 或 image 数据一起使用。
函数          语句
DATALENGTH    READTEXT
PATINDEX      SET TEXTSIZE
SUBSTRING     UPDATETEXT
TEXTPTR       WRITETEXT
TEXTVALID


1:替换

--创建数据测试环境
create table #tb(aa text)
insert into #tb select 'abc123abc123,asd'

--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='123' --要替换的字符串
,@d_str='000' --替换成的字符串

--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(aa),@rplen=len(@s_str),@postion=charindex(@s_str,aa)-1 from #tb
while @postion>0
begin
updatetext #tb.aa @p @postion @rplen @d_str
select @postion=charindex(@s_str,aa)-1 from #tb
end

--显示结果
select * from #tb

--删除数据测试环境
drop table #tb

/****************全部替换************************/
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(aa)  FROM  #tb  WHERE aa like '%数据2%'
if @ptrval is not null        -- 一定要加上此句,否则若找不到数据下一句就会报错
UPDATETEXT #tb.aa @ptrval 0 null '数据3'


/****************在字段尾添加**********************************/
--定义添加的的字符串
declare @s_str varchar(8000)
select @s_str='*C'   --要添加的字符串
--字符串添加处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr(detail) from test where id='001'
updatetext test.detail @p null null @s_str


总结:
1:Text字段类型不能直接用replace函数来替换,必须用updatetext
2:字段比较不能用 where 字段 = ‘某数据’,可以用like来代替
3:updatetext时,若@ptrval值为空会出错,需注意。
posted @ 2008-09-16 18:07 肖马辉 阅读(190) | 评论 (0)编辑 收藏
 

Sql Server实用操作小技巧集合

19楼互动空间|4LS` F5s
 
Ld4X7u4nFK r6u0  包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等

  (一)挂起操作

  在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:19楼互动空间 Q]];_H8l
到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager19楼互动空间+J1W @{:F?A} h
删除PendingFileRenameOperations

  二)收缩数据库

--重建索引
&?)PIL-L4S'KF9Cl0DBCC REINDEX19楼互动空间-VQP,sxL mdOe
DBCC INDEXDEFRAG19楼互动空间5eR4Ni&K
--收缩数据和日志
u}l+y&V'{ G%Ed0DBCC SHRINKDB19楼互动空间 x&StK+K8{7q
DBCC SHRINKFILE

  (三)压缩数据库

  dbcc shrinkdatabase(dbname)

  四)转移数据库给新用户以已存在用户权限

exec sp_change_users_login 'update_one','newname','oldname'19楼互动空间3G%V jji0S WdO7M^
go

  (五)检查备份集

RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

  (六)修复数据库

ALTER DATABASE [dvbbs] SET SINGLE_USER19楼互动空间%m ~+[D KjFB
GO
0Ma7Q)z6B:q0DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
'l}.v@7QDu"a8A0GO
!l*a)V0J| RH/d0ALTER DATABASE [dvbbs] SET MULTI_USER
Z&^#rZ#gXt|]0GO


p;}qp#Y'l0--CHECKDB 有3个参数:

--REPAIR_ALLOW_DATA_LOSS

-- 执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。19楼互动空间Zor:GjZ
--REPAIR_FAST 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。

--REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。

--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY

SQL SERVER日志清除的两种方法
L jR;DcN |0在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……

方法一

一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大

1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存

2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定

3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据

方法二

SET NOCOUNT ON
J,P4[3Me{.n:D j0DECLARE @LogicalFileName sysname,19楼互动空间+i8tjMO*s7\g
@MaxMinutes INT,
L@2l4DP bch;`0@NewSize INT

19楼互动空间#~Wx/@M tb%H;A"[\
USE tablename -- 要操作的数据库名
N4jX ^ z,t^/o;v5^0SELECT @LogicalFileName = 'tablename_log', -- 日志文件名19楼互动空间3|Oae~~ a2C
@MaxMinutes = 10, -- Limit on time allowed to wrap log.19楼互动空间8o5IB u#pd:x G
@NewSize = 1 -- 你想设定的日志文件的大小(M)

-- Setup / initialize
4f5dPR(o)Ph'x-JJ0DECLARE @OriginalSize int19楼互动空间G%BUU8^0~5Y`-Ye
SELECT @OriginalSize = size
O,wq+f2WbC0FROM sysfiles
(GX9?Z ^%W$g0WHERE name = @LogicalFileName
/{k};\ _b%q0SELECT 'Original Size of ' + db_name() + ' LOG is ' +19楼互动空间S&u y2qw#l
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
8}Q @.K1L(w0CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
*K8hXUM"Qy%b0FROM sysfiles19楼互动空间7N%w.wV9q
WHERE name = @LogicalFileName
~9i:d4mX0d0CREATE TABLE DummyTrans19楼互动空间\%b$[ D7v7H{
(DummyColumn char (8000) not null)


]sU-x[ y'@k3\}0DECLARE @Counter INT,
B0[4T;\6cd9Je0@StartTime DATETIME,19楼互动空间$W.a'F^ ETK[l
@TruncLog VARCHAR(255)19楼互动空间+F5\3h!`c
SELECT @StartTime = GETDATE(),
j5[*Z T dWO&[$\0@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)19楼互动空间+@s'|'y |+t,d&U
EXEC (@TruncLog)19楼互动空间%C7{R,iP+s NK
-- Wrap the log if necessary.
4s#m @2]W v7c0WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
!}&v_Zp+k)R#G-dV F0AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)19楼互动空间 J1KneZ/hy
AND (@OriginalSize * 8 /1024) > @NewSize
:r {Bc`#V0BEGIN -- Outer loop.
h\ YFU4Bh/D5Xv5y6O2S0SELECT @Counter = 019楼互动空间T*NRf8@
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))19楼互动空间Bj Y1iDTP,P
BEGIN -- update
V B@%K9R/a0INSERT DummyTrans VALUES ('Fill Log')
p)]&` ~C0DELETE DummyTrans
W\-Ns R4LT8h0SELECT @Counter = @Counter + 1
6Msy xWF cf@XC8^_m0END19楼互动空间Yd_ EP,X aW e
EXEC (@TruncLog)
f,ec7[A0{)^0END
#Z5|/|5X9b WY0SELECT 'Final Size of ' + db_name() + ' LOG is ' +19楼互动空间L lQ`%y_
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
6e"Q\;[!i%xE8bQ0CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
J e%~Kwvr0FROM sysfiles
,Iu&N S @0WHERE name = @LogicalFileName
#C&@#sHB_0DROP TABLE DummyTrans19楼互动空间_,K5yG,S KU
SET NOCOUNT OFF

 

删除数据库中重复数据的几个方法19楼互动空间[e-C7n^b _
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……

方法一

declare @max integer,@id integer19楼互动空间 Y&`*_9G9M H#t
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 119楼互动空间.y6h^6} RM
open cur_rows
i m)q i2L:Z0fetch cur_rows into @id,@max19楼互动空间C!Ik)w GI;~X
while @@fetch_status=019楼互动空间!\J[!x.T!]
begin19楼互动空间f eC G;f N$S-u
select @max = @max -1
1~$zT$Di7ZFTai:\0set rowcount @max
c8k4f Axh8@ zx0delete from 表名 where 主字段 = @id
K)c0k7P gbP!E@0fetch cur_rows into @id,@max
9[Ri4F Q+|~(?I0end
,d3Tk$Cba0close cur_rows
Y:N*B,Rp&zY0set rowcount 0

方法二

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。19楼互动空间&Ae J7?M4]spd
1、对于第一种重复,比较容易解决,使用
w qzC jW+w$w0select distinct * from tableName19楼互动空间 zg8G'jb;k]!u
就可以得到无重复记录的结果集。19楼互动空间O&F*]B*at8X#]]
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除19楼互动空间#BK9@4T#B
select distinct * into #Tmp from tableName19楼互动空间/q0AEITHy{[p B
drop table tableName
'}6[5jMUi-b*a0select * into tableName from #Tmp
,y~ ]X#f;R0drop table #Tmp19楼互动空间6}@%r?rn"j`~$C
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
h6p%Y9mN2Xr0Ei~0假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
!p{VE4N'd0select identity(int,1,1) as autoID, * into #Tmp from tableName
o9MI*x+w b GI"F-c0select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID19楼互动空间 m(}R] I ~
select * from #Tmp where autoID in(select autoID from #tmp2)
}J\.Alh!q8~J;r0最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)


$I&k o#l(WRk l0更改数据库中表的所属用户的两个方法19楼互动空间_H\Q+DH\
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……


5eN;o U { L2EIvD3@0--更改某个表19楼互动空间6O1C_6F+F2S_
exec sp_changeobjectowner 'tablename','dbo'

19楼互动空间 mX p9qq6sZT0F
--存储更改全部表19楼互动空间5@u|`2X}
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
E1Q5O JK0@OldOwner as NVARCHAR(128),19楼互动空间T-zuq:x;s"Z9q_
@NewOwner as NVARCHAR(128)
'zC9p*e;HB'|0AS

DECLARE @Name as NVARCHAR(128)19楼互动空间#j"j)},Nu-x
DECLARE @Owner as NVARCHAR(128)
D(f` k9S B"`0DECLARE @OwnerName as NVARCHAR(128)

DECLARE curObject CURSOR FOR19楼互动空间$W!qeIB]%L4n"n
select 'Name' = name,19楼互动空间1X EKG&Q7~'K1LP/D
'Owner' = user_name(uid)
#pG+c{ k!ll0from sysobjects19楼互动空间#vS[@+t:Q u#V
where user_name(uid)=@OldOwner
5z Lyc2}E!a2B$XXz!O0order by name

OPEN curObject19楼互动空间|x5a;}6o-Ip
FETCH NEXT FROM curObject INTO @Name, @Owner
3F6Kz^@m0WHILE(@@FETCH_STATUS=0)19楼互动空间4TZG$?_a7c\b8f7z6b
BEGIN19楼互动空间?;n9Dn)b_Ln{xo
if @Owner=@OldOwner19楼互动空间%~Qa*E^ W|
begin19楼互动空间#iK0nMuDwn
set @OwnerName = @OldOwner + '.' + rtrim(@Name)19楼互动空间u\W"|J:eX+M
exec sp_changeobjectowner @OwnerName, @NewOwner19楼互动空间D~ r&d$X x ^ }4`.r
end19楼互动空间 kg X?*TJ|0|8C
-- select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner19楼互动空间X)J3m9q!^
END

close curObject
d P9H~ H,`4g!J0deallocate curObject


e je.H z"q0GO


jy(mu ]9[+G K0SQL SERVER中直接循环写入数据19楼互动空间I.s}/}|7P4O
没什么好说的了,大家自己看,有时候有点用处

declare @i int
Zu/J0h g3Z;_ k0set @i=1
bmb#d2e| _kk0while @i<30
L\ ~td^[cr0begin19楼互动空间d-w2sx&q:Q"[
insert into test (userid) values(@i)19楼互动空间$AfOv~9rc#i.t
set @i=@i+1
^(G Ggfv?.F0end

 

无数据库日志文件恢复数据库方法两则
4`/E \%T/P*l0数据库日志文件的误删或别的原因引起数据库日志的损坏

方法一

1.新建一个同名的数据库

2.再停掉sql server(注意不要分离数据库)

3.用原数据库的数据文件覆盖掉这个新建的数据库

4.再重启sql server

5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)

6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
7`6C rZc};\"i$M0数据库的脚本创建一个新的数据库,并将数据导进去就行了.

USE MASTER19楼互动空间6\@mUmJ+u7K
GO

SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
Bm,^mR-z)s~0GO

UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'19楼互动空间r4uR Q I{
Go

sp_dboption '置疑的数据库名', 'single user', 'true'
v3A3\Q6i ]0Go

DBCC CHECKDB('置疑的数据库名')
b Q%H}I1r6os0Go

update sysdatabases set status =28 where name='置疑的数据库名'
*v[$LqXck X0Go

sp_configure 'allow updates', 0 reconfigure with override
9@eyZ l3r;Z0Go

sp_dboption '置疑的数据库名', 'single user', 'false'
q'~(N)o%X4Lx0Go

方法二

事情的起因
E4ta6O(hE0昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的?!

这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。真希望这只是一场噩梦!

没有效果的恢复步骤19楼互动空间yp s*Y} j1t.B?,euV
附加数据库
{"plv3x%}3h_0_Rambo讲过被删除日志文件中不存在活动日志时,可以这么做来恢复:

1,分离被置疑的数据库,可以使用sp_detach_db19楼互动空间w9]#xER,M
2,附加数据库,可以使用sp_attach_single_file_db

但是,很遗憾,执行之后,SQL Server质疑数据文件和日志文件不符,所以无法附加数据库数据文件。

DTS数据导出
0\&]q^8|c~*z0不行,无法读取XXX数据库,DTS Wizard报告说“初始化上下文发生错误”。

紧急模式
V;c^1w e `0怡红公子讲过没有日志用于恢复时,可以这么做:

1,把数据库设置为emergency mode

2,重新建立一个log文件

3,把SQL Server 重新启动一下

4,把应用数据库设置成单用户模式

5,做DBCC CHECKDB

6,如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉

我实践了一下,把应用数据库的数据文件移走,重新建立一个同名的数据库XXX,然后停掉SQL服务,把原来的数据文件再覆盖回来。之后,按照怡红公子的步骤走。

但是,也很遗憾,除了第2步之外,其他步骤执行非常成功。可惜,重启SQL Server之后,这个应用数据库仍然是置疑!

不过,让我欣慰的是,这么做之后,倒是能够Select数据了,让我大出一口气。只不过,组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。”

 

最终成功恢复的全部步骤19楼互动空间m%jL_ s ls`L
设置数据库为紧急模式19楼互动空间v%x}]6Tr6eT
停掉SQL Server服务;

把应用数据库的数据文件XXX_Data.mdf移走;

重新建立一个同名的数据库XXX;

停掉SQL服务;

把原来的数据文件再覆盖回来;

运行以下语句,把该数据库设置为紧急模式;

运行“Use Master

Go

sp_configure 'allow updates', 1

reconfigure with override

Go”

执行结果:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。

 

接着运行“update sysdatabases set status = 32768 where name = 'XXX'”

执行结果:

(所影响的行数为 1 行)

 

重启SQL Server服务;

运行以下语句,把应用数据库设置为Single User模式;

运行“sp_dboption 'XXX', 'single user', 'true'”

执行结果:

命令已成功完成。

 

ü 做DBCC CHECKDB;

运行“DBCC CHECKDB('XXX')”

执行结果:

'XXX' 的 DBCC 结果。

'sysobjects' 的 DBCC 结果。

对象 'sysobjects' 有 273 行,这些行位于 5 页中。

'sysindexes' 的 DBCC 结果。

对象 'sysindexes' 有 202 行,这些行位于 7 页中。

'syscolumns' 的 DBCC 结果。

………

 

ü 运行以下语句把系统表的修改选项关掉;

运行“sp_resetstatus "XXX"

go

sp_configure 'allow updates', 0

reconfigure with override

Go”

执行结果:

在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),

没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。

重新建立另外一个数据库XXX.Lost;

DTS导出向导
N.l2]7[/v` R'w0运行DTS导出向导;

复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;

选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;

所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;

于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;

视图和存储过程是执行SQL语句添加的。

 

维护Sql Server中表的索引19楼互动空间u1g)q5pp!Oo-m;]
在使用和创建数据库索引中经常会碰到一些问题,在这里可以采用一些另类的方法解决…

--第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100%19楼互动空间(C*c(v5]b|&[O&W9n
declare @table_id int
9?P7v3qC1R w0set @table_id=object_id('表名')19楼互动空间&i ^,p8Xr&J9g/d7HY;_
dbcc showcontig(@table_id)

--第二步:重构表索引
}8k*\lK*V0dbcc dbreindex('表名',pk_索引名,100)

--重做第一步,如发现扫描密度/Scan Density还是小于100%则重构表的所有索引19楼互动空间9D;q0J6C?'a
--杨铮:并不一定能达100%。19楼互动空间vYv&pX
dbcc dbreindex('表名','',100)


B"r)F![j0SQL Server补丁安装常见问题19楼互动空间#?%xm9KvH8l
谁碰到问题就看看咯:)

一、补丁安装过程中常见问题


|9_Wp:xF-]*V0如果在安装补丁的时候遇到如下类似错误:

1、安装过程中出现“以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动”,请按照下面步骤解决:

a、重启机器,再进行安装,如果发现还有该错误,请按下面步骤19楼互动空间#H*Qy-R OB,O)yP
b、在开始->运行中输入regedit
Py1Jl#i+na0c、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 位置19楼互动空间 e BjCK.zN'Zt
d、选择文件->倒出,保存
0k*Y&yDv-AX0iuo0e、在右边窗口右击PendingFileRenameOperations,选择删除,然后确认
'u ]f o!z0f、重启安装,问题解决

如果还有同样问题,请检查其它注册表中是否有该值存在,如有请删掉。

19楼互动空间[)Y]4F)^7mC8k
2、在安装SQL Server SP3,有时候会出现:无论用windows认证还是混和认证,都出现密码错误的情况,这时查看临时目录下的sqlsp.out,会发现以下描述:
;eu8XB$d!e)e0[TCP/IP Sockets]Specified SQL server not found.19楼互动空间8h-S\_'RO
[TCP/IP Sockets]ConnectionOpen (Connect()).
z+E*l\ ?7|Ho0其实这是SQL Server SP3的一个小bug,在安装sp3的时候,没有监听tcp/ip端口,可以按照以下步骤进行:

1、打开SQL server客户器网络实用工具和服务器网络工具,确保启用的协议中包含name pipe,并且位置在第一位.19楼互动空间+fEN)Gp
2、确保[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
I&n)ZL?N.Lp X0"DSQUERY"="DBNETLIB".19楼互动空间 x a}c:\
如果没有,请自己建立
tC4@3e7Z+zR03、停止mssql.19楼互动空间6e"\s} lx%v+Z8N
4、进行安装.

这样就可以进行正确安装了。

二、SQL Server补丁版本的检查

SQL Server的补丁版本检查不如Windows 补丁版本检查直接,一个系统管理员,如果不了解SQL Server版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。19楼互动空间5od&L4|H"|k
1、用Isql或者SQL查询分析器登录到SQL Server,如果是用Isql,请在cmd窗口输入isql -U sa,然后输入密码,进入;如果是用SQL查询分析器,请从程序中启动,输入sa和密码(也可以用windows验证)。19楼互动空间)Z*Ja5a#~b0{d
2、在ISQL中输入:
7fKBt*Fl$hN+Bz0Select @@Version;
Yh:VY!j9I-|u7G0go

或者SQL查询分析器中输入(其实如果不想输入,只要打开帮助的关于就可以了:))19楼互动空间)| [A`9t$XEb@
Select @@Version;19楼互动空间6F&A"e$yMT
然后按执行;19楼互动空间!wfSi+a_6T
这时会返回SQL的版本信息,如下:
r7A0U1l&i1@,Sh?0Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
\_L*V c'p0其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下:

8.00.194 -——————SQL Server 2000 RTM19楼互动空间-z/DK-un P4T
8.00.384 -——————(SP1)
NP oWt+\6d)X08.00.534 -——————(SP2)19楼互动空间7Y$A8f qsb5`y
8.00.760 -——————(SP3)

这样我们就能看到SQL Server的正确版本和补丁号了。

我们也可以用xp_msver看到更详细的信息

Sql Server数据库的备份和恢复措施19楼互动空间F"N1p(_o Tt7K
最常用的操作,新手们看看……

一、备份数据库

1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server
2FNN&f/M.m+b02、SQL Server组-->双击打开你的服务器-->双击打开数据库目录19楼互动空间(P?)js6v }}*vjs[
3、选择你的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择备份数据库19楼互动空间6_x+us8C$\ s7@![+s:M
4、备份选项选择完全备份,目的中的备份到如果原来有路径和名称则选中名称点删除,然后点添加,如果原来没有路径和名称则直接选择添加,接着指定路径和文件名,指定后点确定返回备份窗口,接着点确定进行备份

二、还原数据库

1、打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server19楼互动空间xq A Bj)r3u |
2、SQL Server组-->双击打开你的服务器-->点图标栏的新建数据库图标,新建数据库的名字自行取19楼互动空间cwC{"o
3、点击新建好的数据库名称(如论坛数据库Forum)-->然后点上面菜单中的工具-->选择恢复数据库19楼互动空间i9nqA0s r`
4、在弹出来的窗口中的还原选项中选择从设备-->点选择设备-->点添加-->然后选择你的备份文件名-->添加后点确定返回,这时候设备栏应该出现您刚才选择的数据库备份文件名,备份号默认为1(如果您对同一个文件做过多次备份,可以点击备份号旁边的查看内容,在复选框中选择最新的一次备份后点确定)-->然后点击上方常规旁边的选项按钮19楼互动空间@%u5B!L#Z d2A$W
5、在出现的窗口中选择在现有数据库上强制还原,以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置(也可以指定自己的目录),逻辑文件名不需要改动,移至物理文件名要根据你所恢复的机器情况做改动,如您的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\Data,那么就按照您恢复机器的目录进行相关改动改动,并且最后的文件名最好改成您当前的数据库名(如原来是bbs_data.mdf,现在的数据库是forum,就改成forum_data.mdf),日志和数据文件都要按照这样的方式做相关的改动(日志的文件名是*_log.ldf结尾的),这里的恢复目录您可以自由设置,前提是该目录必须存在(如您可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldf),否则恢复将报错19楼互动空间2c!?%S4oP7u
6、修改完成后,点击下面的确定进行恢复,这时会出现一个进度条,提示恢复的进度,恢复完成后系统会自动提示成功,如中间提示报错,请记录下相关的错误内容并询问对SQL操作比较熟悉的人员,一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误,数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作,如果还提示正在使用的错误可以将SQL服务停止然后重起看看,至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复

三、收缩数据库

一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
i YZJf$@8J1ez4M01、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存19楼互动空间&p _7e6feV5V
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定
P%IELCD`03、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据

四、设定每日自动备份数据库

强烈建议有条件的用户进行此操作!19楼互动空间S@Q"b"P {3@;n#P
1、打开企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器
.bY?,{ llm0t02、然后点上面菜单中的工具-->选择数据库维护计划器19楼互动空间1Y e:\r`;g/L1F
3、下一步选择要进行自动备份的数据-->下一步更新数据优化信息,这里一般不用做选择-->下一步检查数据完整性,也一般不选择19楼互动空间dx f'asp0C N]
4、下一步指定数据库维护计划,默认的是1周备份一次,点击更改选择每天备份后点确定
({"}/Gf${:HA05、下一步指定备份的磁盘目录,选择指定目录,如您可以在D盘新建一个目录如:d:\databak,然后在这里选择使用此目录,如果您的数据库比较多最好选择为每个数据库建立子目录,然后选择删除早于多少天前的备份,一般设定4-7天,这看您的具体备份要求,备份文件扩展名一般都是bak就用默认的19楼互动空间 z J/DN!G'^ @ A
6、下一步指定事务日志备份计划,看您的需要做选择-->下一步要生成的报表,一般不做选择-->下一步维护计划历史记录,最好用默认的选项-->下一步完成
\Cf8e*ZU%o07、完成后系统很可能会提示Sql Server Agent服务未启动,先点确定完成计划设定,然后找到桌面最右边状态栏中的SQL绿色图标,双击点开,在服务中选择Sql Server Agent,然后点击运行箭头,选上下方的当启动OS时自动启动服务
5? a)[TP B08、这个时候数据库计划已经成功的运行了,他将按照您上面的设置进行自动备份

修改计划:
4p#AuE-r|$|01、打开企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->管理-->数据库维护计划-->打开后可看到你设定的计划,可以进行修改或者删除操作

五、数据的转移(新建数据库或转移服务器)

一般情况下,最好使用备份和还原操作来进行转移数据,在特殊情况下,可以用导入导出的方式进行转移,这里介绍的就是导入导出方式,导入导出方式转移数据一个作用就是可以在收缩数据库无效的情况下用来减小(收缩)数据库的大小,本操作默认为您对SQL的操作有一定的了解,如果对其中的部分操作不理解,可以咨询动网相关人员或者查询网上资料
R'j:rSP4D01、将原数据库的所有表、存储过程导出成一个SQL文件,导出的时候注意在选项中选择编写索引脚本和编写主键、外键、默认值和检查约束脚本选项
4R6yi:t?02、新建数据库,对新建数据库执行第一步中所建立的SQL文件
(c3yyhR#N;t03、用SQL的导入导出方式,对新数据库导入原数据库中的所有表内容

利用数据库日志恢复数据到时间点的操作19楼互动空间#c%c'_Q.~ [4|jz)G
由于不正常的数据丢失,而又不想使用备份数据还原,只要原来有备份且当前日志保存完好,可以采用这个方法试试,说不定可挽回损失……

1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进19楼互动空间2[P1dV)U!p'Bs&}X
进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)19楼互动空间t5R$Y B.i#EaH
backup log dbName to disk='fileName'
#p.[cA%tK:YS"|!K02,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢
;t\\ujA KM0复19楼互动空间C.n.w4@ Y-S2H"?^
restore database dbName from disk='fileName' with norecovery19楼互动空间1vBH2t {1d@f
3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻19楼互动空间y Y'`GS;Vv
restore log dbName from disk='fileName'19楼互动空间%s(YGzdc)f
with stopat='date_time'

以上这些操作都可以在SQL SERVER企业管理器里完成,难度不大。。。

当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那么是无法利19楼互动空间1K-HgUEQ
用上述方法来恢复数据的...

SQL Server2000数据库文件损坏时如何恢复
G @-^ N*R\0S\/_$i0出现这样的问题是比较严重的了,能否修复只能看你的运气……

SQL Server2000中,如果数据库文件(非系统数据库文件)遇到错误的时候,仅适用于非master,msdb的数据库。

说明如下:

1 建一个测试数据库test(数据库类型为完全)19楼互动空间Ay K?y$KJ4q6C
2 建一个表,插入点记录
} TS? A7Jm4X\C0create table a(c1 varchar(2))19楼互动空间5\&`0TQ2qvg
go19楼互动空间*xC4i U S-v[@Dg
insert into a values('aa')
r*B ~(mr4T~6O0go
E,J#C H4h0insert into a values('bb')19楼互动空间1z&t1_Ue cz
go
-{S!F Z8R2p}(i8j2h03 作完全备份,到文件test_1.bak19楼互动空间} xI3qx$L.W!i9G-c$yE
4 在作一点修改
9M1C2j`MEWU _6u/I0insert into a values('cc')
9O bL8l2?8u7u/Z0go19楼互动空间%tbCO"D4bN1v"r$B4_
create table b(c1 int)
Hz"Zr+_1AT(g.}0go19楼互动空间Z0}B0`}"f
insert into b values(1)
&L!a X6^t~+`z0go
M$ex,k P AL%G4b0insert into b values(2)19楼互动空间8uH0[ Mq'{m_7T0r1U
go
x_8l `"x05 shutdown 数据库服务器
,y#T\0x,^ yrU.I Ct06 用ultraedit编辑数据库文件test_data.mdf,随便修改点字节内容,相当于数据库遭到致命的损坏。19楼互动空间6c#fMSEy0u0G
7 启动数据库,并且运行企业管理器,点开数据库,看到test变成灰色,而且显示置疑。
h |0U SBW_08 运行isql -SLocalhost -Usa -P
ws B8m]'nAP01> backup log test TO DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKUP
+Ax ]L z#X"t%J0est_2.bak' WITH NO_TRUNCATE19楼互动空间V!je*M5co8yTMWSa
2>go19楼互动空间D ~"c3z z'm2T
已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。19楼互动空间 V a8[A6vY
BACKUP LOG 操作成功地处理了 2 页,花费了 0.111 秒(0.087 MB/秒)。

9 进行恢复最老的完全备份
1e CaD$gX&w01> RESTORE DATABASE test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQL19楼互动空间HX Z.ow.o
BACKUP est_1.bak' WITH NORECOVERY
(G7M9K.Y1{MsT02> go
,L.x\RI"A.r0已处理 96 页,这些页属于数据库 'test' 的文件 'TEST_Data'(位于文件 1 上)。19楼互动空间v2i g} [
已处理 1 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。
|u_;r:h2O_0RESTORE DATABASE 操作成功地处理了 97 页,花费了 0.107 秒(7.368 MB/秒)。

10 恢复最近的日志
L8};Z'TZ9{"\4c3\01> RESTORE LOG test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKU
u|4U:_!H)bp S.e*_ n ?0P est_2.bak' WITH RECOVERY
,i#l0Jf(z'f0y02> go
GO9{4nwdh0已处理 2 页,这些页属于数据库 'test' 的文件 'TEST_Log'(位于文件 1 上)。
#V I8F2ht'n9bxo/L9L0RESTORE LOG 操作成功地处理了 2 页,花费了 0.056 秒(0.173 MB/秒)。

存储过程编写经验和优化措施
MDj#ah qJ b0f[0经验之谈,看看……

一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。  

  二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。  

  三、内容:  

  1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。  

  2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。  

  3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:   

  a)SQL的使用规范:

   i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

   ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

   iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

   iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

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

   vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

   vii. 尽量使用“>=”,不要使用“>”。

   viii. 注意一些or子句和union子句之间的替换

   ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

   x. 注意存储过程中参数和数据类型的关系。

   xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。   

  b)索引的使用规范:

   i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

   ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

   iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

   iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

   v. 要注意索引的维护,周期性重建索引,重新编译存储过程。  

  c)tempdb的使用规范:

   i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。

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

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

   iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

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

    vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。  

  d)合理的算法使用:   

  根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。

posted @ 2008-09-01 10:11 肖马辉 阅读(218) | 评论 (0)编辑 收藏
 
select datediff(dd,'2008-06-01',dateadd(mm,1,'2008-06-01')
posted @ 2008-08-28 16:12 肖马辉 阅读(107) | 评论 (0)编辑 收藏
 

1、小富即安、目光短浅的校内网

在校内开放API之前,我看错了两件事情:一个是低估了国内web2.0小网站开发app的热情;一个是高估了国内SNS网站商业眼光。

校内网在国内能够成功,我觉得机遇是主要的原因:王兴搞校内网的时候,国家教委开始管制各大高校的BBS,在校学生们无处可去,校内网刚好补上,而那些离校的学生面对ChinaRen和5460两个烂得不能再烂的同学录,也只能选择校内网。因此校内网的成功与其说是真人网络和定位大学生市场的成功,还不如说是国家教委和清华师兄张朝阳赐了王兴这个机会。而王兴离开校内创办海内至今没有起色,也很说明了这个问题,校内的成功不是网站模式的拷贝成功,而是机遇的成功。

BTW:我个人觉得互联网创业当中的机遇是很重要的,王志东离开新浪以后至今没有翻身已经很说明问题了。互联网成功的创业人士离开原来公司独自创业失败的例子我手里还有两个,因为认识就不方便点名了。总之,成功的人不要觉得自己很了不起,你的成功多半是走了狗屎运。我到很佩服马化腾和丁磊,从不讳言自己是走了狗屎运的。

校内网本质不是Facebook模式,而是社区网站,虽然他也做了必要的隔离,但是总体而已,UGC在校内还是占了很重要的部分,特别是校内和mop整合的很紧密。我看过王兴创办海内的一个采访:记者问他为什么创办海内,他说校内网虽然抄袭Facebook,但是本质上还是抄袭MySpace的,而他更看好Facebook,所以创办海内,真正抄袭Facebook。这段话我当时不理解,但是后来我明白了,你仔细研究校内网,他的确是一个披了Facebook皮的MySpace网站,他的社区性质很明显。

校内的社区性质决定了他绝不会走Facebook的商业模式,为什么呢?如果你像我一样自己辛辛苦苦创办了一个社区网站,积累了这么多会员出来,那么你绝对没有开放网站、开放用户的决心。因为这样一个社区已经可以让你真金白银的赚很多钱了,如果你现在彻彻底底的转型搞应用平台,等于是放弃了现在可以触手可及的利益,而去博一个更伟大的赌注。或者用武侠小说的典故来形容就是,你想修炼吸星大法绝世神功的话,就必须先把自己辛苦练了二十年的内功废掉,你说除非逼到绝路,谁会愿意冒这个险?

校内的两难困境就在这里,不过对于陈一舟来说,他一点不为难,因为他是一个连眼前利益都不肯放弃的人。所以校内的霸王条款一点都不奇怪,奇怪的只是把别人当傻瓜这究竟是自己的智商问题,还是别人的智商问题呢?

不过坦白说,校内现在的条件很好,积累了足够多的用户,又融了4.5亿美元的资金,完全有资格去做平台,而不必担心什么风险,更何况国内web2.0小网站空前高涨的app开发热情和淘宝网的经验也证明了Facebook的商业战略在中国完全有实现的可能性。但是以陈一舟的性格和现在校内网的做法,我可以断定校内会亲自切入若干垂直领域,例如电子商务,旅游,网络招聘,web网游,在赚那么丁点小钱的同时,放弃了成为真正的中国Facebook的可能性。我想,如果把陈一舟换成了马云,马云一定会选择走平台的道路,所以说性格决定命运呀。


2、命运难测的开心网

前面说了开心网是真正气质上符合Facebook克隆的网站,实际上开心网成功的唯一秘诀就是抄袭Facebook抄的最谦虚,最真诚,抄到了位。开心网最火的买卖朋友和争车位这两个应用都是抄袭自Facebook的“Friends for sale”和“Parking War”,号称开心网贴心的注册后提示邮箱登录链接,其实也是原封不动的抄了Facebook。而开心网不过是忠实的抄袭了Facebook就已经惊人的成功了,由此可见国内互联网的作弊家们,给点专业精神好不好,你抄也得抄像点嘛。

开心网唯一的问题就是商业模式,CPC广告在国内更加行不通,如果说Facebook还能用CPC赚到1.45亿的话,那么开心压根就不用指望广告费。如果走Facebook的平台战略,构建一个巨大的应用平台,通过app商家来收费的话,这条路太长了,需要的投资太大。马云的成功毕竟也有孙正义和Yahoo累计十多亿美元的砸钱。孙正义已经给陈一舟砸了4.5亿了,不可能再给开心网了。

所以我猜测开心网的商业模式会走第三条路,就是自己做web小游戏,最终转型成为一个SNS型的休闲web网络游戏网站。但是这条路会走的很累:一是web网游市场竞争的激烈程度完全不低于SNS网站;二是纯做小游戏的开发成本很高。

目前开心网的小游戏都是自己开发的,但是这种小游戏是有一个新鲜期的,用户一开始玩活跃度很高,但是过了新鲜期,就逐渐觉得没有意思了,用户经过了一段时间的活跃期,就会逐渐消沉下去,开心网现在已经开始出现这种问题了。所以传统网游的生命周期即便不断更新也不过3-5年而已,这种web小游戏的生命周期就更短了,不过1-3个月而已。你要保持网站用户的活跃度,就要不停的开发下去,因此开发成本会越来越高。

Facebook最聪明的地方就是他自己不开发app,只鼓励app开发商去开发,因此Facebook没有这个开发成本的巨大负担。开心网要想摆脱这个困境,还是必须走Facebook平台战略,可以说开心不走平台战略就没有大的前途,但是开心要走平台战略,这个目标就太大,实现难度过高。所以Facebook的模式不是那么容易抄的,你真想做Facebook的话,你不开放平台是根本玩不下去的,但你开放平台你没有足够的资金支撑,你也玩不下去。


3、失败的海内网

王兴现在的处境很尴尬。王兴创办海内网的时候,已经意识到要避免成为一个社区网站了,但是由于他一开始没有从app切入,导致了海内以他不期望的方式成为了一个IT同人社区了。但是他又非常不愿意接受这一点,极力摆脱。不过他不做IT同人社区,有的是人做,于是5GSNS出来了,海内上面的大批IT大牛都跑了。不知道现在王兴究竟是高兴多一点,还是失落多一点呢。

海内网和下面要提到的所有SNS克隆网站相比,有一个本质不同:海内不提供网站公共信息的广播,你看不到朋友之外的信息,他还是以Facebook那种模式,引导你去和自己熟人去社交。但不幸的是海内的用户们毕竟是在中国BBS泡大的一代,你不用app去勾引他们,他们在海内只想着卧底发文搞UGC,而不是拉自己的哥们上来虚情假意的社交。失败,这真的是很失败呀。

4、画虎类犬的UCHome、一起、蚂蚁、5GSNS等等

一言以蔽之,这些网站的创始人心里都有一个执念:“BBS是可耻的,BBS是没有商业价值的,BBS是没品的,我作为一个有品的互联网资深人士,我得创造有品的互联网生活方式”

小戴同学在discuz!论坛上面写了很长的一篇帖子(不过比我这篇文章短),讲他为什么要开发UCHome,中心思想就是BBS过时了,BBS缺点太大,我发现Facebook做社区比BBS更优越,所以我现在开发了UCHome。

谢文就不用说了,一直鼓吹他的三个代表精神:代表互联网的物质生活,代表互联网的精神生活,代表互联网的社会生活的一个超级web2.0社区,不知道他还有没有八荣八耻?总之谢文导师明枪明棒的要搞社区,结果却套了一个Facebook的皮上来。其实您大可不必,你要是不抄Facebook的皮,我就把你和豆瓣、51.com放在一起看了。这搞的不伦不类的,还不如光明正大的说我要抄Facebook呢,何必呢?自己都没有搞清楚自己要干啥的人。

麦田师兄比谢导师还没方向感,整天琢磨poke小药丸去了。我记得麦田说过一句话,说他之所以搞蚂蚁,就是因为他太烦BBS了,麦田的优点就是太天真,天真的随便讲真话。

5GSNS这个就不说,还不如用discuz!得了。

那么他们为什么要用Facebook的皮来做社区呢?

1、BBS的确有很大的缺陷
凡是运营过BBS的人都知道BBS的“劣币驱逐良币”的问题,低手充斥会导致高手的离开、社区的衰落。用Facebook的皮可以很大程度上隔离用户,解决BBS最大的痼疾。

2、可以改进很多BBS没有做好的功能
比方说集中的信息更新通知功能,个性化推荐,更好的社区好友互动功能等等。

这些好处都是看得见的,再加上很多人本身对BBS的强烈排斥,更加倾向于用Facebook之皮来做社区网站了。我得必须承认,虽然UCHome这个克隆完全曲解了Facebook之本意,但是UCHome也不失为一个不错的改良版本的社区软件。

但是我得说,作为一个非盈利性质的社区来说,用UCHome可能比BBS更好,但是对于一个有商业期望的网站来说,用UCHome做社区,无疑于自杀。为什么呢?

因为Facebook之皮本身是用来实现熟人之间的社交的,因此他是一个封闭的工具,非常不利于信息的传播!

传统的BBS要盈利,已经有两条被证明过康庄大道:

1、BBS转型做网络媒体,以BBS为基础成为网络媒体的成功案例简直多得数不过来:

新浪网的前身就是一个四通利方体育沙龙BBS;
网易的前身也是一个大BBS,我在98年还注册过账号灌水;
IT媒体类的网站,最近被收购的IT168,PCPOP哪个不是靠BBS起家的?太平洋电脑网也是BBS起家;
CSDN也是BBS起家,一开始是程序员大本营光盘的技术支持论坛;
被IT168买过去的ITPUB,ChinaUnix也是BBS;
JavaEye也是BBS起家;

2、BBS转型做电子商务

阿里巴巴网站一开始就是一个BBS,是马云亲自敲定要做BBS的;
篱笆网也是BBS,不用说了;
搜房网也是BBS起家

BBS起家的互联网网站太多了,这本来就是一条光明的大道。为什么这些互联网资深人士畏之如虎呢?

1、BBS的运营难度和成本都比较高
要运营好一个BBS,站长需要非常高超的平衡能力,以及一个得力的运营团队,能把一个BBS运营好是极难的事情,这里面的门槛非常高,太多人想回避这个难度走捷径,造假,灌水,吵做,流量是上来了,社区的商业价值没有了。而且BBS需要持续不断的投入,一旦运营投入不足,BBS的人气就难以为继。

2、越是互联网资深人士越希望用网站独特的功能取胜,不战而屈人之兵,越想避免商业上的短兵相接和踏实的运营。
对互联网特别有感觉的人,往往希望用自己的长处作为核心竞争力,希望用卓越的网站功能和体验去吸引用户,战胜对手,而不屑于没有技术含量的日常运营工作和类似传统销售的营销方式。我感觉自己身上就存在这样的毛病,而且我也从上述很多人的言论当中感受到了这一点。网站毕竟是公司,要遵守商业规则,踏踏实实的运营和赚钱比整天想着用杀手锏网站功能去击败对手更重要。

而且我也强烈的感觉到一点:走捷径成功的网站往往商业模式会难产,一点一点打拼上来的网站商业模式都是顺理成章的。上面提到这么多从BBS起家的网站哪个不是踏踏实实运营了五六年以后成功的?而2005年风光无限的博客网站现在纷纷倒闭,博客网站的运营难度根本无法和BBS相比,因此催生商业模式也更难。


用Facebook之皮运营的社区网站,其用户创造内容的传播途径是受阻的,因此无法成功的转型成为一个网络媒体,这BBS第一条商业模式就堵死了;其做电子商务网站其用户传播的途径又受限于朋友之内,传播范围太小,无法形成有效营销,这BBS第二条商业模式也堵死了。5GSNS要搞网络招聘,但是网络招聘市场的水非常深,我可以告诉大家的就是:截止目前为止,所有的垂直招聘社区无一成功的,5GSNS在走一条没有商业前途的路,真要搞招聘,不能按照5GSNS现在这种搞法。


六、社区网站做SNS

Facebook的前景是光明的,但是中国能不能出一个Facebook,现在看来并不是那么乐观。

大多数披着Facebook皮的社区网站都是瞎凑热闹,如果作为兴趣爱好搞搞Facebook之皮类型的社区网站,玩玩也好,但是要想搞一个有商业前景的社区网站,我奉劝一句,还是别用UCHome,这是一条死路。

另外还有一个有意思的趋势:一些以BBS起家的社区网站也开始SNS化,开始引入Facebook模式:

一个是TechWeb用UCHome架设了一个社区,这个我就觉得很搞笑了,明明有自己的BBS,还搞UCHome自己抢自己的用户?

另外一个稍微高明一点,CSDN把个人空间和个人博客改用Facebook之皮来实现了。其实这层皮并不重要,重要的是你怎么给社区的用户提供好的个性化推荐、好的个人信息聚合、好的朋友交流工具,这些我在CSDN个人空间尚未看到。


七、SNS之我见

国内真正在做SNS的网站并不多,SNS这条也不好走,但如果能成功,就是一个the big thing,但是还看不出来候选者。

那些批着Facebook之皮的社区网站,我预测将有一半以上在两年之内死掉,另外一半会改回BBS。

社区网站做SNS悠着点好,先想清楚了再做,要做就做得有点创新,别蛮干,上来就扒别人的按钮和CSS。 SNS是2008年中国互联网最火爆的现象了,无数的SNS网站一夜之间纷纷涌现,前仆后继,慰为壮观:校内、海内、开心、一起、蚂蚁以及无数的Facebook克隆SNS网站陷入了一场空前惨烈的厮杀当中,每个人都生怕错过互联网下一个the big thing的机会,一波接一波的抄袭、炒做和竞争令人应接不暇、眼花缭乱。我也未能免俗,从2006年就一直关注SNS网站的发展,在2007年下半年就开始用Facebook,也一直在不断思索:究竟SNS网站的未来是什么呢?这场空前混乱的SNS大战会有什么样的结果呢?在中国,一个成功的SNS模式应该是什么样的呢?先阐述一下自己的观点,期待抛砖引玉:


一、引子

早在博客概念还如日中天的2005年,国内就已经有一大批克隆MySpace的SNS网站了,比方说uuzone,圈网等等,当2006年MySpace以5.8亿美元的高价被新闻集团收购之后,国内的Myspace克隆网站达到了一个高潮。但是这种类型的SNS网站模式在国内一直不太成功,难以病毒式传播,需要依靠大规模用户推广和不断的线下活动组织,所以逐渐式微了。除了已经关门的之外,其他的已经无一例外的改头换面克隆Facebook了。此时当其他网站还在盯着博客概念和MySpace的时候,王兴已经全盘克隆Facebook推出了校内网,眼光很独到。

但是直到2007年微软以2.4亿美元购买了Facebook的1.5%股份,这才真正引爆了国内的Facebook热潮,此前言必称MySpace的谢文也从此改口,言必称Facebook了。从2007到现在一年时间不到,国内的Facebook克隆SNS网站已经是忽如一夜VC来,千万SNS缤纷开了。这些众多的SNS网站当中,除了51.com和豆瓣之外,几乎无一例外的先后抄袭MySpace和Facebook,特别是从王兴开始,把抄袭发展到了毫无道德底线的程度:连按钮和CSS样式表都直接拿来就用,开创了互联网抄袭无底裤的新时代,从中国互联网的历史贡献来说,王兴可以和周鸿祎相提并论,都是划时代的开创者。

现在的SNS都长着一副Facebook的嘴脸,这真的十分无趣,国外的Web2.0网站类型非常丰富,光是SNS类型的还有twitter,friendfeed,friendster,ning等等,干吗光盯着Facebook抄阿?所以我的第一个话题是:


二、Facebook的成功秘诀是什么?

这几年时不时有人问我:JavaEye的成功秘诀是什么?也有很多人告诉我他们发现了JavaEye成功的秘密是XXX,在他们看来,只要按照这个XXX去做,也可以创办一个成功的技术网站,但我没有发现有人成功过:这不是因为他们找错了秘诀,而是因为网站的成功并不是光靠一个秘诀。

JavaEye的发展历史分为几个阶段:从2003年9月创立到2006年8月是第一个阶段,这个阶段的JavaEye靠的是个人铁腕管理;从2006年9月到2007年9月是第二个阶段,这个阶段的JavaEye靠的是web2.0概念的社区改造;从2007年10月开始是第三个阶段,这个阶段的JavaEye靠的是不断精益求精的功能和品质服务。以后JavaEye还会有很多发展阶段,跨越每个不同的发展阶段都需要独特的核心竞争力(或者说秘诀)。

现在国内克隆Facebook的一些SNS网站就犯了上面同样的问题:王兴认为Facebook的成功秘诀是发展大学生用户市场,所以他搞了校内网;当王兴卖掉校内创办海内的时候,他又认为Facebook的成功秘诀是真人社区,这一点也被谢文反复的吹捧;而戴志康显然认为Facebook的成功秘诀是去中心化的社区形态,所以他搞了一个UCenter Home出来;而从开心网开始,大家又突然发现Facebook的成功秘诀原来是上面的Web小游戏,于是一窝蜂的抄袭Facebook的热门小游戏;当然还有很多人认为Facebook的成功秘诀在于开放平台;不过最搞笑的还是麦田师兄(他是我大学同系高4届的学长),把一个poke功能当成了Facebook成功的全部秘密,很有点像古代学会写一二三,就以为“万”字要写一万笔的笨学生。所以不同的人看Facebook,会得出不同的结论,所谓:“横看成岭侧成峰,远近高低各不同”。

其实这些看法都对,但是又都不准确:Facebook在每个发展阶段都有导致他成功的原因:在Facebook发展的第一个阶段,面向校园市场和实名注册是他成功的原因;在Facebook发展的第二个阶段,采用去中心化的封闭式设计又能够很好的隔离不同类型的用户;在Facebook发展的第三个阶段,是开放平台推动了他的腾飞,是web小游戏让他的用户群迅速的扩大。因此就算要抄袭Facebook,也应该认识到Facebook成功的每个阶段,要抄就抄得全面点,别把着一个poke就以为自己得到了成仙药丸。


三、Facebook究竟是什么?

那么Facebook本质上是什么东西呢?现在的Facebook对用户来说是一个社交工具,而不是一个社区;如果我们抛开用户的身份,从互联网网站类型去看,Facebook是一个应用平台,而不是一个社区网站。因此目前国内的SNS网站当中,只有开心网最接近Facebook,只有开心和海内没有企图去成为一个社区网站,其他所有的SNS网站都背离了这一点。

我在2007年下半年,总是不断的收到一些朋友的Facebook邮件邀请,一开始不为所动,到后来开始不胜其扰,最后注册了一个账号。但是注册账号以后发现Facebook就是一个空白的网站,根本不知道可以干吗,于是又是长期的不登陆,直到一个朋友给我发来了Facebook上面的Vampire的app邀请,Vampire是一个吸血鬼的小游戏,你可以咬别人组建你的吸血鬼军队,还可以和别的军队作战。就这么一个小游戏,立马让我明白了Facebook是怎么个玩法,马上促使你把自己的MSN/Gtalk的朋友都拉过来玩,于是一个你熟识朋友的在线圈子很快就组成了。

现在很多的开心网用户看到上面这一段,肯定觉得似曾相识,他们就是这样开始用开心的,这里的互动关键点是什么呢?是作为一个网站,用户为什么会来你的网站?

因为你的网站有大牛?还是因为你的网站有高质量的文章和讨论?还是因为你的网站提供了很多吸引他的机会和资源?

如果用户是因为这样的理由来你的网站,那你抄袭Facebook就太失败了。因为你的网站核心竞争力还是在于“内容”,还是要依靠UGC。那么一个封闭的社区、一个去中心化隔离用户的社区要创造高质量的UGC就太难了。
Facebook靠的是你的朋友在上面活动,你可以参与他们的活动,这就是全部的理由。至于搞什么活动不重要,写不写什么文字也不重要,唯一重要的是你需要Facebook这样一个tool来保持和你朋友之间的关系。

虽然Facebook不仅仅限于认识的朋友,但是其主要目的就是提供给熟识的朋友进行交流之用,因此Facebook本身并不提供任何全站的公共信息广播,也不开放匿名访问,你和自己认识的朋友之间的交流本来就是私密性的,这些信息本来就是被保护起来的。

而且尤其重要的一点就是Facebook并不鼓励UGC(用户创造内容),这是和其他web2.0网站的本质区别。Facebook真正鼓励是你和你的朋友在Facebook上面“发生了互动的行为”,而不是“互动的所创造的内容”。

用这个标准你去衡量一下,就会发现开心网是唯一神似Facebook的网站,而其他网站,特别是UCenter Home简直就是拙劣的Facebook模仿者,他完全没有领会Facebook的本质,完全用自己做社区软件的思路去套Facebook,搞出来的UCHome压根就是一个社区网站,这一点大家看看5GSNS:

1、你为什么去5GSNS,因为你想看keso或者其他大牛写的文章
2、你为什么去5GSNS,因为你知道keso或者其他大牛现在在干吗
3、你为什么去5GSNS,因为上面有互联网行业的招聘信息

说白了就是一句话:高质量的内容和资源在吸引你,所以要保持高质量的内容和资源,你必须依靠高质量的会员持续的UGC,那么我请问你,这和一个BBS有本质区别吗?或者我这样问你,keso不用UCHome,而是discuz!,会妨碍你访问5GSNS吗?会妨碍你泡在这个网站上面并且发贴吗?所以小戴同学换汤不换药呀。


四、Facebook怎么赚钱?

据说Facebook现在全球注册会员有6000多万了吧,网站流量也排名全球前10了,这样的网站赚钱是不难的,难的是用简单的商业模式持续的赚大钱。无论是Facebook在网站上面搞搞电子商务卖卖商品也好,搞搞网络招聘卖卖人头也好,搞搞游戏卖卖道具也好,都能赚钱,但是这些商业模式有问题:

1、无论是电子商务、网络招聘、网络游戏或者其他的什么商业模式,都是划分具体的用户群体去赚特定人群的钱,无形之中,潜在客户就少了一大半,Facebook坐拥6000万会员,商业模式的覆盖面必须广,去赚小众的钱就是个失败的商业模式。

2、进入特定的分众领域,以Facebook这样的通用SNS网站来说,竞争力根本不及专业的垂直网站,你做电子商务做不过ebay,做网络招聘做不过monster,做网络游戏做不过爆雪,都只能吃点残羹冷炙。而且这种专业领域,你Facebook根本没有积累,你需要花多么大的代价才能摸清楚这里面的水有多深呀。

3、你做这些垂直领域的生意,其实就是和Facebook平台上面的开发商在抢生意,这是一个大忌,会破坏整个Facebook平台的商业生态链条。而这个大忌,校内网正在不遗余力的去犯。

那Facebook怎么办?靠广告吗?广告是一条路,但光靠广告不行。Facebook在2007年广告收入是1.45亿美元。这个收入水平和Yahoo这样的门户网站无法相提并论,也远远不足以盈利和上市。

其实在网络广告市场,已经被证明的广告模式只有两种:搜索引擎的关键字广告和媒体网站的媒体广告,也就是Google模式和Yahoo模式,或者说国内的百度模式和新浪模式。前者依靠拍卖广告关键字赚钱,后者依靠网络媒体内容平台传播影响力。

而Facebook的精准广告投放只能依靠CPC(每点击成本)来计费,而我们知道Google的adsense收入是非常可怜的,他的主要广告收入来自竞价排名。Facebook的非UGC特性决定了他是一个没有内容的网站,无法像媒体网站那样卖内容广告,作为一个对比,开放式的SNS网站MySpace就不同了,他的网站互动产生了巨大的UGC,所以他的广告收入是Facebook的3倍以上。因此光靠广告收入,对于Facebook来说非常的不够。

那么Facebook的钱途在哪里?

Facebook的真正钱途在于从app开发商身上赚钱!我们看看淘宝网是怎么赚钱的就知道了:淘宝网开店不收费,但是你想成为诚信商家,你想进驻淘宝商城,你想在淘宝的搜索上面靠前,你想获得淘宝的高级服务,那么请乖乖交钱。而淘宝上面的大商家是很愿意掏这笔钱的,因为淘宝这个平台可以让他赚到更多的钱。

Facebook现在就是一门心思做平台,不做应用,尽量能开放的数据全部开放出去,不遗余力的培养app开发商,为app开放商创造最好的赚钱途径。Facebook就是一个巨大的网店,而app开发商就是上面免费租赁店面的商家,兜售自己的玩具,吸引用户来玩。app开发商可以去做网络招聘、app开发商可以去做机票预定、app开发商可以去做电子商务,现在Facebook上面已经有几万个app了,其中真正赚钱的app还不是特别丰富。等到Facebook平台上面有100万个赚钱的app商家的时候,Facebook再面向app商家推出增值服务,你可以想像一下到时候Facebook赚钱是多么容易的事情。

所以Facebook并不需要直接从注册用户身上赚钱,而是把面向用户的细分垂直领域的赚钱机会统统留给app商家,同时也把这些细分领域的成本、风险和时间统统节省了,Facebook只要把自己的平台做的足够好,给app商家提供足够好的免费服务和增值服务,就可以坐在家里收钱了,压根不需要自己亲自一个细分领域一个细分领域辛苦的开拓。从这一点来看,校内是多么的愚蠢和短视。为什么现在Facebook这么全心全意的伺候app开发商,当然是因为app开发商将来就是Facebook的衣食父母呀。

posted @ 2008-08-01 11:29 肖马辉 阅读(207) | 评论 (1)编辑 收藏
 
说是支持1亿pv/天,也许有点夸张,也是为了吸引您能点进来,如果您能认真看完相信也不会让您失望,当然,肯定有很多“高手”会对此会嗤之以鼻,没关系,有很多眼高手低的人总喜欢评论别人却从不会看清自己。

如果大家真想支持我、支持中国人开源项目,请把该文贴到自己的博客中或者收藏本文,记得包含文档的下载地址!!!!!!!谢谢。

我说的系统主要是构建在hibernate之上的高效数据库缓存系统,其中包含了分布式解决方案,该系统已经应用在舍得网上了,没有发现大问题,本人也相信该系统已经足够强大,应付数百万IP/天的应用都不是问题,我这么说肯定有人会对此表示怀疑,其实系统到底能撑多少IP/天不在于系统本身而是在于使用该系统的人。

代码看上去很简单,其实却是两年经验的总结,整过过程也遇到了很多难点,最后一一解决了,所以也请各位珍惜他人的劳动成果。本系统非常简洁易用,主程序 BaseManager.java不到1000行代码,用“精悍”来形容绝对不为过,1000行代码却包含了数据库对象的缓存、列表和长度的缓存、按字段散列缓存、update延时更新、自动清除列表缓存等功能,用它来实现像论坛、博客、校友录、交友社区等绝大部分应用网站都足够了。

我在理想状态下做了压力测试,在没有数据库操作的jsp页面(舍得网新首页)里可以完成2000多requests每秒(正常情况可能有1/1000的 request有数据库查询,其余999/1000都是直接从缓存里读取),物品详情页每秒可完成3000多requests,纯静态html页面也只能完成7000多requests/秒,我对首页进行了三个小时的压力测试,完成了24850800个requests,java一点事都没有,内存没有上涨。按照2000个requests/秒算,一天按15小时计算,那么每天能完成3600*15*2000=1亿零8百万requests,当然这是理想状态,实际状态就算打一折,还能完成1000万pv/天,要知道,这只是一个普通1万3千块钱买的服务器,内存4G,CPU2个,LinuxAS4系统, apache2.0.63/resin2.1.17/jdk6.0的环境。

现在进入正题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

为什么要用缓存?如果问这个问题说明你还是新手,数据库吞吐量毕竟有限,每秒读写5000次了不起了,如果不用缓存,假设一个页面有100个数据库操作, 50个用户并发数据库就歇菜,这样最多能支撑的pv也就50*3600*15=270万,而且数据库服务器累得半死,搞不好什么时候就累死了。我的这套缓存系统比单独用memcached做缓存还要强大,相当于在memcached上再做了两级缓存,大家都知道memcached很强了,但是吞吐量还是有限,每秒20000次get和put当遇到超大规模的应用时还是会歇菜,本地HashMap每秒可执行上百万次put和get,在这上面损耗的性能几乎可以忽略不记了。温馨提示:能不用分布式的时候就不要用分布式,非用分布式的时候再考虑用memcached,我的缓存系统在这方面都已经实现了,改个配置就可以了,有兴趣的可以仔细测试测试!

一般数据库缓存在我看来包含四种。第一种:单个对象的缓存(一个对象就是数据库一行记录),对于单个对象的缓存,用HashMap就可以了,稍微复杂一点用LRU算法包装一个HashMap,再复杂一点的分布式用memcached即可,没什么太难的;第二种:列表缓存,就像论坛里帖子的列表;第三种:长度的缓存,比如一个论坛板块里有多少个帖子,这样才方便实现分页。第四种:复杂一点的group,sum,count查询,比如一个论坛里按点击数排名的最HOT的帖子列表。第一种比较好实现,后面三种比较困难,似乎没有通用的解决办法,我暂时以列表缓存(第二种)为例分析。

mysql和hibernate的底层在做通用的列表缓存时都是根据查询条件把列表结果缓存起来,但是只要该表的记录有任何变化(增加/删除/修改),列表缓存要全部清除,这样只要一个表的记录经常变化(通常情况都会这样),列表缓存几乎失效,命中率太低了。

本人想了一个办法改善了列表缓存,当表的记录有改变时,遍历所有列表缓存,只有那些被影响到的列表缓存才会被删除,而不是直接清除所有列表缓存,比如在一个论坛版(id=1)里增加了一个帖子,那么只要清除id=1这个版对应的列表缓存就可以了,版id=2就不用清除了。这样处理有个好处,可以缓存各种查询条件(如等于、大于、不等于、小于)的列表缓存,但也有个潜在的性能问题,由于需要遍历,CPU符合比较大,如果列表缓存最大长度设置成10000,两个4核的CPU每秒也只能遍历完300多次,这样如果每秒有超过300个insert/update/delete,系统就吃不消了。

在前面两种解决办法都不完美的情况下,本人和同事经过几个星期的思索,总算得出了根据表的某几个字段做散列的缓存办法,这种办法无需大规模遍历,所以 CPU符合非常小,由于这种列表缓存按照字段做了散列,所以命中率极高。思路如下:每个表有3个缓存Map(key=value键值对),第一个Map是对象缓存A,在A中,key是数据库的id,Value是数据库对象(也就是一行数据);第二个Map是通用列表缓存B,B的最大长度一般1000左右,在B中,key是查询条件拼出来的String(如start=0,length=15#active=0#state=0),Value是该条件查询下的所有id组成的List;第三个Map是散列缓存C,在C中,key是散列的字段(如根据userId散列的话,其中某个key就是userId= 109这样的String)组成的String,value是一个和B类似的HashMap。其中只有B这个Map是需要遍历的,不知道说明白了没有,看完小面这个例子应该就明白了,就用论坛的回复表作说明,假设回复表T中假设有字段id,topicId,postUserId等字段(topicId就是帖子的id,postUserId是发布者id)。

第一种情况,也是最常用的情况,就是获取一个帖子对应的回复,sql语句应该是象
select id from T where topicId=2008 order by createTime desc limit 0,5
select id from T where topicId=2008 order by createTime desc limit 5,5
select id from T where topicId=2008 order by createTime desc limit 10,5
的样子,那么这种列表很显然用topicId做散列是最好的,把上面三个列表缓存(可以是N个)都散列到key是topicId=2008这一个Map 中,当id是2008的帖子有新的回复时,系统自动把key是topicId=2008的散列Map清除即可。由于这种散列不需要遍历,因此可以设置成很大,例如100000,这样10万个帖子对应的所有回复列表都可以缓存起来,当有一个帖子有新的回复时,其余99999个帖子对应的回复列表都不会动,缓存的命中率极高。

第二种情况,就是后台需要显示最新的回复,sql语句应该是象
select id from T order by createTime desc limit 0,50
的样子,这种情况不需要散列,因为后台不可能有太多人访问,常用列表也不会太多,所以直接放到通用列表缓存B中即可。

第三种情况,获取一个用户的回复,sql语句象
select id from T where userId=2046 order by createTime desc limit 0,15
select id from T where userId=2046 order by createTime desc limit 15,15
select id from T where userId=2046 order by createTime desc limit 30,15
的样子,那么这种列表和第一种情况类似,用userId做散列即可。

第四种情况,获取一个用户对某个帖子的回复,sql语句象
select id from T where topicId=2008 and userId=2046 order by createTime desc limit 0,15
select id from T where topicId=2008 and userId=2046 order by createTime desc limit 15,15
的样子,这种情况比较少见,一般以topicId=2008为准,也放到key是topicId=2008这个散列Map里即可。

总结:这种缓存思路可以存储大规模的列表,缓存命中率极高,因此可以承受超大规模的应用,但是需要技术人员根据自身业务逻辑来配置需要做散列的字段,一般用一个表的索引键做散列(注意顺序,最散的字段放前面),假设以userId为例,可以存储N个用户的M种列表,如果某个用户的相关数据发生变化,其余N -1个用户的列表缓存纹丝不动。以上说明的都是如何缓存列表,缓存长度和缓存列表思路完全一样,如缓存象select count(*) from T where topicId=2008这样的长度,也是放到topicId=2008这个散列Map中。如果再配合好使用mysql的内存表和memcached,加上F5设备做分布式负载均衡,该系统对付像1000万IP/天这种规模级的应用都足够了,除搜索引擎外一般的应用网站到不了这种规模。

再次申明:系统到底是不是强大不在系统本身而在于使用该系统的人!!!

这个缓存系统是我和同事几年经验的总结,看似简单,其实也没那么简单,把它作为开源有下面几个目的:第一,真的希望有很多人能用它;第二:希望更多的人能够完善和改进它;第三:希望大家能聚到一起为通用高效数据库缓存构架作出贡献,毕竟,数据库操作是各种应用最常用的操作,也是最容易产生性能瓶颈的地方。

Zip包中包含了配置方法和测试用的jsp,只要把它配置成一个web应用就可以快速调试并看到缓存的力量了,文档和下载地址是http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html。群组的地址是http://groups.csdn.net/shedewang_db_cache

配置说明文件在docs/开始配置.txt里有说明。

最后啰嗦一句,如果大家真想支持我、支持中国人开源项目,请把该文贴到自己的博客中或者收藏本文,记得包含文档的下载地址!!!!!!!谢谢。thank you and Good luck。
posted @ 2008-07-28 10:16 肖马辉 阅读(293) | 评论 (0)编辑 收藏
 
select * from bookReview a where rid=(select top 1 rid from bookReview where isbn=a.isbn order by commendtimes desc,rid desc)
posted @ 2008-07-25 14:30 肖马辉 阅读(115) | 评论 (0)编辑 收藏
 
--死鎖 /****************************************************************************************************************************************************** 死鎖指兩個以上事務相互阻塞相互等待對方釋放它們的鎖,SQL Server會通過回滾其中一個事務並返回一個錯誤來自已解決阻塞問題,讓其他事務完成它們的工作。 整理人:中国风(Roy) 日期:2008.07.20 ******************************************************************************************************************************************************/ set nocount on ; if object_id('T1') is not null drop table T1 go create table T1(ID int primary key,Col1 int,Col2 nvarchar(20)) insert T1 select 1,101,'A' insert T1 select 2,102,'B' insert T1 select 3,103,'C' go if object_id('T2') is not null drop table T2 go create table T2(ID int primary key,Col1 int,Col2 nvarchar(20)) insert T2 select 1,201,'X' insert T2 select 2,202,'Y' insert T2 select 3,203,'Z' go 生成表數據: /* T1: ID Col1 Col2 ----------- ----------- -------------------- 1 101 A 2 101 B 3 101 C T2: ID Col1 Col2 ----------- ----------- -------------------- 1 201 X 2 201 Y 3 201 Z */ 防止死鎖: 1、 最少化阻塞。阻塞越少,發生死鎖機會越少 2、 在事務中按順序訪問表(以上例子:死鎖2) 3、 在錯誤處理程式中檢查錯誤1205並在錯誤發生時重新提交事務 4、 在錯誤處理程式中加一個過程將錯誤的詳細寫入日誌 5、 索引的合理使用(以上例子:死鎖1、死鎖3) 當發生死鎖時,事務自動提交,可通過日誌來監視死鎖 死鎖1(索引): --連接窗口1 --1步: begin tran update t1 set col2=col2+'A' where col1=101 --3步: select * from t2 where col1=201 commit tran --連接窗口2 --2步: begin tran update t2 set col2=col2+'B' where col1=203 --4步: select * from t1 where col1=103 commit tran --連接窗口1:收到死鎖錯誤,連接窗口2得到結果: /* 訊息 1205,層級 13,狀態 51,行 3 交易 (處理序識別碼 53) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。 */ --連接窗口2:得到結果 /* ----------- ----------- -------------------- 3 103 C */ 處理方法: --在t1、t2表的col1條件列建索引 create index IX_t1_col1 on t1(col1) create index IX_t2_col1 on t2(col1) go --連接窗口1 --1步: begin tran update t1 set col2=col2+'A' where col1=101 --3步: select * from t2 with(index=IX_t2_col1)where col1=201 --因表數據少,只能指定索引提示才能確保SQL Server使用索引 commit tran --連接窗口2 --2步: begin tran update t2 set col2=col2+'B' where col1=203 --4步: select * from t1 with(index=IX_t1_col1) where col1=103 --因表數據少,只能指定索引提示才能確保SQL Server使用索引 commit tran --連接窗口1: /* ID Col1 Col2 ----------- ----------- -------------------- 1 201 X (1 個資料列受到影響) */ --連接窗口2 /* ID Col1 Col2 ----------- ----------- -------------------- 3 103 C (1 個資料列受到影響) */ 死鎖2(訪問表順序): --連接窗口1: --1步: begin tran update t1 set col1=col1+1 where ID=1 --3步: select col1 from t2 where ID=1 commit tran --連接窗口2: --2步: begin tran update t2 set col1=col1+1 where ID=1 --4步 select col1 from t1 where ID=1 commit tran --連接窗口1: /* col1 ----------- 201 (1 個資料列受到影響) */ --連接窗口2: /* col1 ----------- 訊息 1205,層級 13,狀態 51,行 1 交易 (處理序識別碼 54) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。 */ 處理方法: --改變訪問表的順序 --連接窗口1: --1步: begin tran update t1 set col1=col1+1 where ID=1 --3步: select col1 from t2 where ID=1 commit tran --連接窗口2: --2步: begin tran select col1 from t1 where ID=1--會等待連接窗口1提交 --4步 update t2 set col1=col1+1 where ID=1 commit tran 死鎖3(單表): --連接窗口1: while 1=1 update T1 set col1=203-col1 where ID=2 --連接窗口2: declare @i nvarchar(20) while 1=1 set @i=(select col2 from T1 with(index=IX_t1_col1)where Col1=102);--因表數據少,只能指定索引提示才能確保SQL Server使用索引 --連接窗口1 /* 訊息 1205,層級 13,狀態 51,行 4 交易 (處理序識別碼 53) 在 鎖定 資源上被另一個處理序鎖死並已被選擇作為死結的犧牲者。請重新執行該交易。 */ 處理方法: 1、刪除col1上的非聚集索引,這樣影響SELECT速度,不可取. drop index IX_t1_col1 on t1 2、建一個覆蓋索引 A、drop index IX_t1_col1 on t1 B、create index IX_t1_col1_col2 on t1(col1,col2) 通過SQL Server Profiler查死鎖信息: 啟動SQL Server Profiler——連接實例——事件選取範圍——顯示所有事件 選擇項: TSQL——SQL:StmtStarting Locks——Deadlock graph(這是SQL2005新增事件,生成包含死鎖信息的xml值) ——Lock:DeadlockChain 死鎖鏈中的進程產生該事件,可標識死鎖進程的ID並跟蹤操作 ——Lock:Deadlock 該事件發生了死鎖


阻塞分析:
http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx
posted @ 2008-07-22 12:59 肖马辉 阅读(199) | 评论 (0)编辑 收藏
 
本文来自:http://www.cnblogs.com/sumtec/archive/2008/06/26/1223460.html
博客园技术帖子太多了,这是我真实的感受。也许是因为博客园定位于技术博客,所以会把其他内容划分到别的区里面,这一直是我觉得最不爽的地方。因为这样,有可能很多优秀的文章就被埋没了。其实完全可以都集中在首页显示,不好的刷下来,好的顶上去。以前说是没有人管,那也确实是有心无力。现在有点人力资源了,我觉得还是希望赶紧考虑一下这方面的事情。我写这个随笔的时候,就犹豫,该不该发在首页?最后还是觉得发吧,我觉得我想和大家交流的这些内容,估计还是会对一部分人产生一定帮助的。其实,我还想听听dudu的创业经验谈。

好,牢骚发完了,回到正题。

今天一晚上连着看了十几个简历,看得我头都大了。什么?不就是看看简历么,有什么好头痛的?没错,以前我也这么想的,可最近公司做了一个有关招聘的培训,才知道面试之前、之中、之后的工作事项有这么多。于是,最近的面试就要好好做功课准备准备了。可当我真看这么多简历的时候,就有点麻木了。不是么?平时已经够忙的了,各种大小事务纷涌而至,而且我所在部门还是“重要且紧急”甚至“不重要但紧急”事项的窗口。可想而知,当你看一堆的简历的时候,就多么的期望你面前的简历最好能够回答你一切想要知道的问题。可是偏偏最头痛的是,大部分的简历给我带来的问题,比我想要知道的答案还要多。

举例说明之前,先说说我从培训中得到的知识吧:
一个公司,尤其是靠脑力挣钱的公司,其人力相关成本是极高的。这里面,自然也包含了招聘和解雇的成本。不要以为招聘成本就是一个HR员工的成本,还应该包括:
1、因为面试,需要占用的人力资源成本;
2、因为试用失败,所支付的资金成本和时间成本;
3、因为最终雇佣了错误的人,所造成的资金损失,人力资源损失等。

具体数字我还真忘了,但是可以肯定的是,最终找到的合适员工,和你面试过的候选人之比,是非常小的,所以说招聘成本高。这还不包含招聘后,该员工所占用空间所需要花费的资金成本,该员工造成规模扩大之后的管理成本等。由此可见,招聘是一件多么重要的事情。比如说,找到一个合适的人,可以完成十个不合适的员工才能完成的工作量,前者的人力成本比后者的要明显低很多。那么为什么我们不多花一点经历,来认真对待招聘的事情呢?据我所知,很多公司的招聘工作,可能主要是HR那边出力,然后具体相关部门的主管进行面试。实际上这是有很大问题的,应该是相关部门主管要在面试前做很多的功课,具体做什么这里不多说了,只说一个:你打算问候选人什么问题?

问题有哪些呢?这个我也不多列,至少得有下面这几个吧(不限于此):
1、简历中有什么疑点?例如工作经历断档等;
2、过去的工作中,面对了什么问题,如何处理(而不是假大空的问:如果你是经理,你能面对压力吗?回答:能!@_@)

其中,我发现最有趣的一个问题是,很多人的简历中普遍存在一个(套)疑点:你回报的上级是什么人,职责是什么,你管理多少人,职责是什么,在你所在的工作中具体做什么事情?
很多人的简历都是这么列的:
2007.1-2008.1   北京XXX公司
职位:程序员
工作内容:用ABC.NET、OrnDB技术以及JUNK语言,构建了一个BC结构的XXX项目,该项目采用了0.5层的技术,实现了XXX、YYY、ZZZ的功能。全程参与了该项目的开发。

那么,我上面的疑点,一个都没有解决。还有一个更严重的问题,是使用大量烂掉的关键字,例如:熟悉、精通、理解——当我面对这些词的时候,几乎已经看到发腻,甚至都搞不清楚到底是熟悉比精通厉害呢,还是理解才是万岁。最糟糕的莫过于列出了一大堆的熟悉精通理解,我看到这样的情况,就想不明白,到底哪个才是你最强的方面,哪一个是你最弱的方面,基本上说了等于没说一样。

好,反过来说,如果你是求职者,如何从几百上千份的简历中脱颖而出呢?除了不要犯上述的常识性错误,还要注意突出你的不同之处。如何突出呢?要看你的工作经验如何了。

如果你是刚毕业的毛头小子

记住,不要列出一大堆的在校工作项目,尤其不要列你的毕设。中国大学的毕设水平有多烂,大家心知肚明,你又何苦把它统统列出来让人鄙视一番呢?很不幸我当年就犯了这个错误。虽说现在想起来,我的毕设水平仍然有资格说是比普通的学生好上那么一点点,可是如果和真正的、成功的商业系统比起来,那都是小菜一碟。你向往的某个公司真的会觉得你做过的文件拷贝程序感兴趣吗?那只是一个程序,不是系统,因此人家不会觉得你做过什么。很不幸,我以前曾经也做过类似的事情。不过,我并不是说不列,列出一条你认为最自豪的就可以了。虽然比不上商业系统,但这足以证明你是一个积极的人,真正做过一点事情的人,不是那种浑浑噩噩过一生的人。其他的项目,一笔带过就行了,写多了简直是浪费你的精力和版面,也浪费面试官的时间和感情。

除此之外,你还可以提供程序的源代码(全部或部分),这是展示你的程序风格的一个很好的方式。不过建议你在给出这样的代码之前,仔细地考虑一下,你是否应该规整规整,重构重构?对于一个企业,要决定是否聘用一个员工,是一件很严肃的事情,因此真正面试之前,理应进行相应的准备工作。那么当你去准备面试的时候,也更应该如此了。我收到过一个源代码,里面写了一些.NET其实已经提供的功能,除此之外也出现了一些很长的方法,还有一些遗留的、被注释掉的代码,写着这个没有做出来。这样的代码其实在向你的主顾宣示着:其实我很糟糕,看,我的代码就是这么糟糕,甚至于我来面试了,我也不乐于稍微修饰一下。您觉得这样能获得你想要的工作吗?如果是你不在乎的工作,那另当别论,可你都不在乎这样的工作,为什么要投这份简历呢?
 
你应该重点展示什么呢?相对于有经验的人来讲,缺乏经验是你的缺点,同时也是你的优点。在雇主看来,你就是一张白纸,未来在这张白纸上可能会画出一幅很棒的画。可并不是每一张白纸都有同样的结果,原因在于纸张的质量。上好的纸张应该是好的东西点拨一下,就能自然展开,而糟糕的东西不会被画上去。糟糕的纸张则相反,美好的东西画了半天没反应,糟糕的东西不知道怎么自动就有了。这个比喻还不太直接,直白的说,雇主期望你是这样的一个人:
1、你很勤奋并且你很好学
2、你很好学并且一学就会
3、你学会了不止,还学得很精
4、学得很精了不止,还态度好

一个不勤奋的不好学的人,如何展望未来能给公司带来价值呢?一个好的公司,会有一些培训,纵然没有,也会要求你自学。如果你学了半天都不会,你是勤奋好学那也没有用。这个一学就会,其实是平日长时间进行自学锻炼的结果,我也没有一个“银弹”供你解决这个问题。接下来,你不仅仅要学会了,还要精。所谓的精,就是你能说出道道来,能说出个所以然来。我非常头痛的一点是,每次我面试都会问“interface”你是怎么理解的,其结果十有八九就是大眼瞪小眼。可是这些人的简历上,会写着自己会X、Y、Z还会三层结构,那interface是干嘛使的、为什么存在怎么会说不出来呢?每天花点时间,先把这些最基本的思想弄清楚了,你才可能找到一份好工作。也许会花你几个月的时间,不过如果不花时间做这样的事情,你花多少时间也找不到一份你觉得满意的工作的。最后一点其实是很重要,有句话:态度决定行为,行为决定习惯,习惯决定性格,性格决定命运。如果你整天懒懒散散,上面交待你做的事情不到最后一天不做,又或者没有明确的利益你就不做事情,这样的态度肯定会决定你没有什么好命运的(含着金钥匙的除外,这种人不需要找工作)。

上面这些是刚毕业的学生的写简历时的一些基本思路。

如果你是工作几年,有了一定经验,甚至是丰富经验的人

那么很显然,你的优势在于经验。这个经验不在于你坐过了什么项目,而是你用什么知识、工具做了个多大规模的事情,其间遇到些什么样的困难,最后如何克服了。很多的简历里面,都只是说作了一个什么项目。至于说这个项目有多复杂,你负责其中的什么内容,你在其间使用了什么知识和工具,遇到什么困难,统统不说。这样的结果就是我看完了还是等于什么都不知道,就算你说我05-08年期间参与的项目有Windows Server 2008,Visual Studio 2008,那又怎么样呢?我心里面也许会觉得,可能其实你只不过作了其中里面一个很小很小的部分,比如写了一个计算器,或者 OpenFileDialog。这样对于你是不利的,因为如果另一个和你竞争的候选人,把他的经历写得比较具体,那也许就会约见他而不约见你。

当我看过这么多的简历之后,我就觉得,如果我再找工作的时候,我就会用PPT把我这几年做的工作列出来,把我参与过的最大的一个系统的拓扑图画出来,把我遇到过并解决过的问题举一个出来,把我参加过的某个重要培训以及心得列出来。这样的PPT,至少让人能看得津津有味,直到我参与过什么样的事情,也能证明我能胜任我想要争取的岗位。说到这里,我也想提一下,我认为,文字太多其实不是好事,所以简历文字要精炼在精炼。详细列出10个项目,你说有多少人能耐着性子看完?几乎没有。详细列出1个项目呢?我觉得大部分人应该还是愿意看的。所以你觉得用同样多的文字,粗略列出10个项目好呢,还是详细介绍1个?我建议剩余的可以一笔带过,附带说明如果面试时有兴趣了解,可以详细说明。同时,图片比文字的说明力强多了,为什么不多摆几个图片呢?一个拓扑图,基本上就能把你的项目复杂度给说清楚了,用文字可得要写好大一段,是否能看得明白还不一定。图基本上瞄一眼就明白,文字可得要反复琢磨,对于面试官来讲前者绝对是赏心悦目,后者绝对是折磨人。

与刚出道的人比起来,你的劣势在于经验。经验多了难免容易坐享其成,不愿意接受新东西,或者有自觉牛X的感觉。
先说前者。我遇到过工作多年的候选人,面试时问3.5的东西例如linq、WCF等一问三不知,倒是不停的说很古董的解决方案。不懂就算了,有的东西还强装了解,说出来的不对。其实不知道就不知道好了,多数企业需要的是踏实的人,不希望你掩盖真相。俗话说有问题不可怕,有问题不知道不解决才可怕。也许你也是对很多最新的知识不了解,毕竟工作经验多的人,可能会负责比较多的事情。公司也可能不愿意冒风险使用新技术,平时也没有时间学习,怎么办?其实解决的办法很简单:开始投简历之前,赶紧先多学习一些新的东西。宁愿少工作一两个月,也要先把这些工作做好,磨刀不误砍柴工嘛。再说了,也算给自己放个假。当然了,如果工作中有机会,或者能够争取机会,那是再好不过的。
再说后者。平时自己给自己打气,没人的时候,或者对着老婆的时候,你可以自觉牛X一下,但是写简历的时候千万不要。先不说面试官是否比你厉害,这样的感觉面试官至少会判断你态度有问题。其次,你要真那么牛X,为什么还要去面试呢?猎头早该找上门来啦,准东家早就对你求贤若渴啦,三顾茅庐啦。嗯,有人会觉得,牛X怎么可能写简历里面呢?我举一个例子,我就看到一些简历,会罗列很多会的东西。其实完全没有必要,首先,这么十几个技术知识里面,总有强弱之分,列出强的那么两三个就够了。再牛X,面试官也没有时间问你超过5个以上的技术知识,所以你也没必要列超过5个。其次,这就是一种想告诉别人“我其实是很牛 X的”。如果万一别人问到的,就是你列出的那十几个技术中最弱的那一个,而恰好面试官最强的就是这项,后果可想而知。

工作经历比较多的人当中,还有一部分的是有创业经历的,我也可以分享一下。对于这种候选人,面试官最担心的恐怕是“你的心很野”的问题。因此,如果你能够把你的人生规划说清楚,也许更能打动面试官。此外,由创业经验的人,一定不是平常人。不是平常人有两种:一种是非常优秀,只是暂时失败;还有一种,就是想法偏执,其实运气再好,也就那样。前者后者该如何写简历,我没有什么可以分享的,因为我还没有仔细想过。但有一点,无论前者后者,都是很重要的:就是要承认你的失败,同时还要总结原因。理由是,不承认失败的人,感觉不太踏实,或者不太现实;而没有总结的人,有可能就是总结能力欠缺,或者从来不做总结。当然,其实这些问题有没有创业经历的候选人,都有这种“维度”——即需要衡量的方面。但是有创业经历在简历上,无疑就在提醒面试官这方面的问题。你不解答这些问题,如果面试官忘了问,那么这个困惑就会存在,你就很可能会被刷下来。我已有的案例中,就有一个我觉得个方面都不错的,结果上司担心他干一段时间还会再次创业,于是没有考虑。

最后,当你面试的时候,一定要想办法弄清楚面试官的困惑点,要解答这些困惑点,才能得到你想要的工作。当然了,我上面说的那些,都是假设你已经比较有料的情况。如果你自觉能力不足,简历再好,面试能力再强,也是不能解救的,试用期必定暴露问题。因此,能力不足的,首先补能力,这篇文章恐怕对你帮助不大。
posted @ 2008-07-21 16:58 肖马辉 阅读(114) | 评论 (0)编辑 收藏
 

 

DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM @t a,@t_Level b
    WHERE a.PID=b.ID
        AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort

posted @ 2008-07-10 09:42 肖马辉 阅读(322) | 评论 (0)编辑 收藏
 
Dim MyReg As RegExp

Private Sub Form_Activate()
Text1.SetFocus
End Sub

Private Sub Form_Load()
Set MyReg = New RegExp
MyReg.IgnoreCase = True
MyReg.Pattern = "^[\w-\.]+@\w+\.\w+$"
End Sub

Private Sub Text1_LostFocus()
If Not MyReg.Test(Text1) Then
MsgBox "无效的输入"
Text1.SetFocus
End If
End Sub
其中Pattern定义了输入的有效性规则,表示在@之前允许输入字母、下划线、数字及连接符,在小数点前后只能输入字母、数字及下划线。

 
posted @ 2008-07-07 17:41 肖马辉 阅读(656) | 评论 (0)编辑 收藏
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页