1、参考<<T-SQL查询>>创建使用数字辅助表,能方便高效地进行查询操作。
(
@n bigint
)
RETURNS TABLE
AS
RETURN
(
with
L0 as(select 1 as c union all select 1),
L1 as(select 1 as c from L0 as A, L0 as B),
L2 as(select 1 as c from L1 as A, L1 as B),
L3 as(select 1 as c from L2 as A, L2 as B),
L4 as(select 1 as c from L3 as A, L3 as B),
L5 as(select 1 as c from L4 as A, L4 as B),
Nums as(select row_number() over(order by c) as n from L5)
select n from Nums where n <= @n
)
2、应用Linq和Random转换随机序列。
先看一下这个例子:
List<string> randList = new List<string>();
if (list.Count > 0)
{
while (true)
{
Random rand = new Random();
var randomSeq = Enumerable.Repeat(0, 100).Select(r => rand.Next(list.Count)).Distinct();
foreach (var i in randomSeq)
{
if (!randList.Contains(list[i]))
randList.Add(list[i]);
}
if (randList.Count >= list.Count)
break;
}
}
通过Enumerable.Repeat(0, 100).Select(r => rand.Next(list.Count))方法可以每次产生100个最大不大于list.Count的整形序列,然后通过Distinct()排除掉重复值,避免重复遍历随机索引,因为有了Linq的延迟特性,序列可以保证其随机性,不需要进行这样的操作
Random random = new Random(DateTime.Now.Millisecond);
Thread.Sleep(1);
通过控制Repeat(0, N)中的N值还可以减少偱环的次数,提高性能。
3、使用Row_number()进行数据分页:
if OBJECT_ID('dbo.tb0904') is not null
drop table dbo.tb0904
create table dbo.tb0904
(
id int identity(1,1) primary key,
userName nvarchar(20) not null,
userPWD nvarchar(20) not null,
userEmail nvarchar(40) null
)
--插入数据
set identity_insert tb0904 on
declare @count int;
set @count=1;
while(@count<=2000)
begin
insert into dbo.tb0904(id,userName,userPWD,userEmail) values(@count, 'billchen', '123', 'c@c.net');
set @count=@count+1;
end
set identity_insert tb0904 off
--使用Row_number()分页
declare @pageIndex int = 10, @pageSize int = 20;
select * from (
select *, ROW_NUMBER() over(order by id asc) as IDRank from dbo.tb0904) as ID_RowNumber
where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)
--删除临时表
--drop table dbo.tb0904
4、如何查看w3wp进程
我们在对网站进行性能调试时经常需要查看Windows任务管理器中的性能查看cpu的占有率,但是在服务器上存在有多个网站时,就会出现多个w3wp.exe进程,或者一个网站设置了多web园后也会出现多个w3wp,其中的不同就是pid,如何知道哪个pid对应哪个网站了,其实很简单,看如下方法:
对于Windows2003服务器可用 iisapp -a
对于Windows2008服务器可用 %windir%/system32/inetsrv/appcmd list wp
5、使用 chkdsk d: 校验磁盘。
6、如何为IIS7定制错误跳转页。
项目中用户头像原来是在aspx页面中读取用户上传的jpg头像进行动态输出的,但是出于性能的问题,现在需要修改为直接显示jpg图片,这样就不需要通过asp.net进行托管,提高一点性能,但是现在的一个问题就是如果用户没有上传头像就会出现404错误,但实际上是要求显示一个默认头像的,所以有必要修改IIS7的定制错误页,让它指定一个aspx页面如"noimg_default.aspx",然后在aspx页面中加载默认的头像进行输出。
剩下的工作就是如何设置IIS的问题了,对于IIS6就很容易设置,对于IIS7需要注意一个细节就行了。
#Features View --> 404 --> Eidt Custom Error Page --> Execute a URL on this site --> URL --> "/noimg_default.aspx"
#Features View --> 404 --> Edit Pages Settings -->Custom error pages
7、JS获取随机数。
alert(Math.round(Math.random()*10000))
8、永久重定向301。
Response.StatusCode = 301;
Response.Status = "301 Moved Permanently";
Response.RedirectLocation = "http://avatar2.profile.csdn.net/1/C/5/1_billok.jpg";
Response.End();
9、对高开消资源的释放在高访量的情况之下十分重要,虽然是编程中的一个小问题,但是一旦把它放大了就很明显,所以平时写代码时要时刻注意资源的释放的问题。对于实现了IDisposable接口的类必须使用using或者try{}finally{obj.Dispose();}来释放资源,然后对于实现了Close()、Clear()、Abort()方法的类在使用完毕也要及时释放,以下为一些例子:
#释放资源_例子1
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Timeout = RequestTimeout;
string content = null;
try
{
//throw new WebException("测试");//测试
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
content = reader.ReadToEnd();
reader.Close();
}
stream.Close();
}
}
response.Close();
}
}
catch (System.Net.WebException)
{
//TODO:考虑在此添加超时异常的日志
}
finally
{
if (request != null)
{
request.Abort();
request = null;
}
}
#释放资源_例子2
{
userName = userName.ToLower();
string x;
using (System.Security.Cryptography.MD5CryptoServiceProvider md5 =
new System.Security.Cryptography.MD5CryptoServiceProvider())
{
byte[] ori = System.Text.Encoding.UTF8.GetBytes(userName);
byte[] buf = md5.ComputeHash(ori);
x = BitConverter.ToString(buf).Replace("-", string.Empty);
x = "/" + x[0] + "/" + x[1] + "/" + x[2] + "/";
md5.Clear();
}
return x;
}
用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。它的性能明显优于ReaderWriterLock,可与 lock 语句相当。锁定状态之间的转换已得到简化,从而使编程更容易并减少发生死锁的几率。新类支持递归,可简化从 lock 和 ReaderWriterLock 的迁移。
#线程可以进入三种锁定模式:读取模式、写入模式和可升级的读取模式。
#可升级模式适用于线程通常读取受保护资源的内容,但在某些条件满足时可能需要写入的情况。使用可升级锁可以方便的从读锁中升级为写锁,而不需要进行切换,以增加损耗。
# 平时不要把ReaderWriterLockSlim的实例放到try{}块中,以减少性能损耗。
例如:
{
private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
private object Get()
{
object obj = null;
if (rwLock.TryEnterReadLock(100))
{
try
{
//写操作
obj = new object();
return obj;
}
finally
{
rwLock.ExitReadLock();
}
}
return null;
}
private void Add()
{
if (rwLock.TryEnterWriteLock(100))
{
try
{
//写操作
}
finally
{
rwLock.ExitWriteLock();
}
}
}
public void Update()
{
if (rwLock.TryEnterUpgradeableReadLock(100))
{
try
{
//读操作
rwLock.EnterWriteLock();
try
{
//写操作
}
finally
{
rwLock.ExitWriteLock();
}
}
finally
{
rwLock.ExitUpgradeableReadLock();
}
}
}
}
11、Session过期时间的设置。
#Web.config设置:
<sessionState mode="InProc" timeout="30"/>
</system.web>
#IIS设置:网站-->属性-->主目录-->配置-->选项-->会话超时