2011年9月 的存档
2011九月13

执行语句N次 – GO N

go N :执行批语句N次

Create Table #Temp(SerialNo int identity Primary key, Product varchar(500))
go

Declare @Product varchar(500)
SET @Product='Mouse'
insert into #Temp(Product)
select @Product

GO 20

select * from #Temp
drop Table #Temp
2011九月13

ldf文件与mdf文件放在不同磁盘可提高性能的原因

sql server 评论关闭

磁盘负责三方面,一个将数据写入到日志文件ldf中,然后在check point后写入到mdf, 接着就是大量的读操作。
先写入ldf,是因为sql server的预写日志机制引起的,此机制保证了数据在写入到mdf中前,一定会在ldf中保留一份,这样以后恢复等操作都可进行,故可以说,影响写性能的主要是写入到ldf中的操作。磁盘一边负责随机取数据,一边负责写入数据,磁头转来变去,性能低下,而将ldf文件放在不同的磁盘中,就独立了写操作。
注意:磁盘应是物理上的。

Other logical drive will not benefit because ultimately, it’s the same drive controller and the same physical disc. Hence, if the heads are busy doing random reads for a logical drive D, they won’t be able to perform serial writes on logical drive E on the same physical drive.

Hence, the log should be given the priviledge of it’s own separate physical drive.
引自:
Performance Best practice – Transaction log must on a different drive. But WHY?
Write-Ahead Transaction Log

2011九月9

SET NOCOUNT ON –取消存储过程返回消息提示

sql server 评论关闭

当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不向客户端发送存储过程中每个语句的 DONE_IN_PROC 消息。使用由 SQL Server 2005 提供的实用工具执行查询时,其结果会防止在 Transact-SQL 语句(例如 SELECT、INSERT、UPDATE 和 DELETE)的末尾显示 nn rows affected。

如果存储过程中包含的一些语句并不返回许多实际数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

2011九月4

定义信息查询如存储过程参数-INFORMATION_SCHEMA

sql server 评论关闭
1, INFORMATION_SCHEMA.COLUMNS :存储列定义,包含列类型,长度等信息。
2,INFORMATION_SCHEMA.PARAMETERS:存储过程参数信息。
如:查询行长度:
select
c.table_name,
count(*) columns,
sum(
case data_type
when 'binary' then character_maximum_length
when 'varbinary' then character_maximum_length
when 'char' then character_maximum_length
when 'varchar' then character_maximum_length
when 'nchar' then character_maximum_length
when 'nvarchar' then character_maximum_length
when 'bigint' then 8
when 'int' then 4
when 'uniqueidentifier' then 16
when 'datetime' then 8
when 'bit' then 1
when 'image' then 16
when 'text' then 16
when 'ntext' then 16
end) as avgLen
 from INFORMATION_SCHEMA.COLUMNS c join INFORMATION_SCHEMA.Tables t
ON c.Table_Schema=t.Table_Schema AND c.Table_Name=t.Table_Name
WHERE t.TABLE_TYPE='BASE TABLE' AND c.TABLE_NAME NOT IN('dtproperties','sysdiagrams')
--AND table_name like '%log'
group by c.table_name
order by avgLen desc
go
2011九月2

索引键值存储的信息

sql server 评论关闭

聚集索引叶级别除了保持键值外,还包含所有数据
非聚集索引叶级别只有需要的键值及书签,以“文件号:页号:槽号”的格式定位
查看索引存储:
–打开3604,信息发送到控制台
DBCC TRACEON(3604)
–查看表索引对应的页数明细
DBCC IND (‘brm_lvjian_new’, ‘frmuser’, -1);
–查看页上的数据信息
DBCC PAGE (brm_lvjian_new, 1, 586958, 1);
在Memory Dump下存储着信息。

不过非聚集索引并不一定比聚集索引快,但where条件,select字段都是复合索引字段时,因索引
空间较小,比件聚集索引查找快一些。
如:在frmUser表中DepartmentID上建立非聚集索引
执行:
SELECT departmentid
FROM frmuser
WHERE DepartmentId = 4

SELECT *
FROM frmuser
WHERE DepartmentId = 4

发现前者通过索引查找一步到位,而后者在索引查找后,因还要取其它值,故还要根据索引页键值中的引用,去数据页取值
这提示:SELECT中的字段少一些速度会更快,一是若字段在一索引内,就避免了去数据页的检索,二是避免了大量数据的I/O操作。
复合索引与对字段分别建索引的区别:
1,复合索引整体空间比分别建索引要小。
2,若查询语句对索引内字段查询,复合索引直接得到位置,而分别建索引需要分别查出再连接
并且当SELECT字段也在索引内时,复合索引会直接得出,而分另建索引则需要去数据页重新取。

2011九月1

判断对象类型 -objectpropertyex

sql server 评论关闭

SELECT objectpropertyex (OBJECT_ID(‘VR_bswGoods’), ‘IsView’)
IsSystemTable
IsUserTable
IsView
IsTable
IsTableFunction
IsTrigger