Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

在引用链接服务器时
SELECT * FROM SERVER.brm_lvjian.dbo.frmUser
这种引用将分散到各个存储过程中,若对链接服务器、数据库、表有任何修改,都有逐一修改各分散的地方,维护不方便。
此时,可利用视图做一个封装,那么在以后改变时,只需改变此视图即可。
CREATE VIEW [dbo].[DB201_frmUser]
AS
SELECT * FROM SERVER.brm_lvjian.dbo.frmUser

使用:
SELECT * FROM DB201_frmUser

或者使用同义词
CREATE SYNONYM brm_lvjian_frmUser
FOR SERVER.brm_lvjian.dbo.frmuser

SELECT * FROM brm_lvjian_frmUser

DROP SYNONYM brm_lvjian_frmUser

同义词作用于:表、视图、存储过程、函数、程序集上。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

在用@sql拼语句时,对于字符串变量,要传大量的引号,因为要用””表示一个引号
如:.
DECLARE @tname VARCHAR(10)
DECLARE @sql1 VARCHAR(MAX),@sql2 VARCHAR(MAX)
SET @tname = ‘皮松谊’
SET @sql1 = ‘select * from frmuser where username = ‘ + ”” + @tname + ””
EXEC ( @sql1 )

其实可用sql server提供的内置函数quotename解决
SET @sql1 = ‘select * from frmuser where username = ‘ + quotename(@tname,””)
EXEC ( @sql1 )

注:QUOTENAME ( ‘character_string’ [ , ‘quote_character’ ] )
‘quote_character’:
用作分隔符的单字符字符串。可以是单引号 (‘)、左方括号或右方括号 ([ ]) 或者英文双引号 (“)。如果未指定 quote_character,则使用方括号。 方括号可用于表名


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

常用的可通过:sqlserver提供的配置工具来完成,或者使用sp_configure

sp_configure [ [ @configname = ] ‘option_name’ [ , [ @configvalue = ] ‘value’ ] ]
当不传值时,返回所有可配置的服务器选项及最小值,最大值,当前配置值
如:EXEC sp_configure ‘show advanced option’, ‘1’;


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
sys.dm_db_index_usage_stats
动态管理视图 sys.dm_db_index_usage_stats 该视图返回不同类型索引操作的计数以及 上次执行每种操作的时间。
只要启动 SQL Server (MSSQLSERVER) 服务,计数器就初始化为空。而且,当分离或关闭数据库时(例如, 由于 AUTO_CLOSE 设置为 ON),便会删除与该数据库关联的所有行。
这个视图最关键的就是最关键的就是这4个字段:
user_seeks 通过用户查询执行的搜索次数,就是利用聚集索引的次数。
user_scans 通过用户查询执行的扫描次数,就是没有利用任何索引的次数,逐行扫描最慢的那种。
user_lookups 通过用户查询执行的查找次数,就是利用非聚集索引的次数。
user_updates 通过用户查询执行的更新次数,就是更新前找到这条数据时利用的索引的次数 。因为更新是先查询到需要更新的数据,然后执行更新命令所以更新的时候这个user_updates字段和 user_seeks、user_lookups、user_scans字段中的一个都会加一。

--查询从未被使用的索引
SELECT t.name,ix.name,ddius.user_seeks,ddius.user_scans,ddius.user_lookups,ddius.user_updates
FROM sys.dm_db_index_usage_stats ddius
JOIN sys.tables t ON ddius.[object_id] = t.[object_id]
JOIN sys.indexes ix ON ix.[object_id] = ddius.[object_id] AND ix.index_id = ddius.index_id
WHERE ddius.database_id = DB_ID('brm_lvjian')
and last_user_seek is null
     and last_user_scan is null
     and last_user_lookup is null
     and last_user_update is not null



索引与页关系
--查询索引使用的页数,每页是8K,页数乘以8,即为空间使用数
SELECT t.name,i.name,sp.in_row_data_page_count,sp.in_row_used_page_count,sp.in_row_reserved_page_count
FROM sys.tables t
JOIN sys.indexes i ON t.[object_id] = i.[object_id]
JOIN sys.dm_db_partition_stats sp ON sp.[object_id] = i.[object_id] AND sp.index_id = i.index_id
ORDER BY t.name,i.name

查询表占用空间,涉及的索引使用空间
SELECT a3.name AS [Schema 名称],
	a2.name AS [表名称],
	a1.rows as 记录条数,
	(a1.reserved + ISNULL(a4.reserved,0))* 8 AS [保留空间(K)],
	a1.data * 8 AS [数据使用空间(k)],
	(CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data 
	THEN (a1.used + ISNULL(a4.used,0)) - a1.data 
	ELSE 0 END) * 8 AS [索引使用空间(k)],
	(CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used 
	THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used 
	ELSE 0 END) * 8 AS [未用空间(k)],
	a1.data * 8*1024/(CASE WHEN a1.Rows=0 THEN 1 ELSE a1.Rows END) 平均每条记录长度
	FROM
		(
		SELECT
		ps.object_id,
		SUM (
		CASE
		WHEN (ps.index_id < 2) THEN row_count
		ELSE 0
		END
		) AS [rows],
		SUM (ps.reserved_page_count) AS reserved,
		SUM (
		CASE
		WHEN (ps.index_id < 2) THEN 
		(ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
		ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
		END
		) AS data,
		SUM (ps.used_page_count) AS used
		FROM sys.dm_db_partition_stats ps
		GROUP BY ps.object_id) AS a1
		LEFT OUTER JOIN
			(
			SELECT
			it.parent_id,
			SUM(ps.reserved_page_count) AS reserved,
			SUM(ps.used_page_count) AS used
			FROM sys.dm_db_partition_stats ps
			INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
			WHERE it.internal_type IN (202,204)
			GROUP BY it.parent_id
			) AS a4 ON (a4.parent_id = a1.object_id)
	INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )
	INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
	WHERE a2.type <> N'S' and a2.type <> N'IT'
	ORDER BY [保留空间(K)] DESC




--打开3604,信息发送到控制台
DBCC TRACEON(3604)

--查看表索引对应的页数明细
DBCC IND ('brm_lvjian_0817', 'frmuser', -1);

--查看页上的数据信息
DBCC PAGE (brm_lvjian_0817, 1, 409259, 3);


注:
DBCC PAGE
(
    ['database name'|database id], -- can be the actual name or id of the database
    file number, -- the file number where the page is found
    page number, -- the page number within the file
    print option = [0|1|2|3] -- display option; each option provides differing levels of information
)

DBCC IND
(
    ['database name'|database id], -- the database to use
    table name, -- the table name to list results
    index id, -- an index_id from sys.indexes; -1 shows all indexes and IAMs, -2 just show IAMs
)

参考:http://www.sqlskills.com/blogs/paul/post/Inside-the-Storage-Engine-Using-DBCC-PAGE-and-DBCC-IND-to-find-out-if-page-splits-ever-roll-back.aspx


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
 索引碎片:1,当索引包含的页中的逻辑顺序与数据文件中的物理排序不匹配时,就存在碎片,碎片非常多的索引会降低查询的性能,导致应用程序响应缓慢,可通过重新组织索引或重新生成索引来修复索引碎片。

2,当索引页不在逻辑顺序上时就会产生外部碎片。索引创建时,索引键按照逻辑顺 序放在一组索引页上。当新数据插入索引时,新的键可能放在存在的键之间。为 了让新的键按照正确的顺序插入, 可能会创建新的索引页来存储需要移动的那些 存在的键。这些新的索引页通常物理上不会和那些被移动的键原来所在的页相 邻。创建新页的过程会引起索引页偏离逻辑顺序。

 3,在有特定搜索或者返回无序结果集的查询的情况下, 偏离顺序的索引页不会引起 问题。 对于返回有序结果集的查询, 搜索那些无序的索引页需要进行额外的处理。造成性能低下。
即:在初建时索引是有序的,但不断的update,insert,delete操作使得索引页变得局部无序,但要求返回有序的结果集时,不得不浪费额外时间进行排序。而索引维护的过程就是将排序归为有序的过程


 索引状况检查:dm_db_index_physical_stats
 当avg_fragmentation_in_percent碎片率 <5%时,是正常级别
 当avg_fragmentation_in_percent碎片率 >=5% AND <=30%时,是轻度级别,需要重新组织索引
 当avg_fragmentation_in_percent碎片率 >30%时,是严重级别,需要重建索引
 alert index 索引名称 ON 架构名称.表名 reorganize/rebulid partition = 分区号
 sys.objects:存储表、视图、存储过程

查看:
SELECT *
FROM SYS.dm_db_index_physical_stats(DB_ID(), object_id('bmdcustomer'),NULL,NULL,'LIMITED') DDIPS

1,索引状态检查与维护
SELECT s.name schema_name,o.name OBJECT_name,ix.name INDEX_name,DDIPS.avg_fragmentation_in_percent 碎片率,
	CASE WHEN avg_fragmentation_in_percent > 30 THEN '严重碎片级别,索引需要重建'
	     WHEN avg_fragmentation_in_percent >= 5 AND avg_fragmentation_in_percent < 30 THEN '轻度碎片级别,索引需要重新组织' 
		 ELSE '正常状态' END 提示
	FROM SYS.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED') DDIPS
	JOIN SYS.objects o ON DDIPS.[object_id] = O.[object_id] --得到表名
	JOIN SYS.schemas s ON S.[schema_id] = O.[schema_id] --得到表的架构名
	JOIN SYS.indexes IX ON DDIPS.[object_id] = IX.[object_id] AND DDIPS.index_id = IX.index_id --得到索引名称
WHERE ddips.[object_id] = object_id('bdcustomerallocate') AND s.[schema_id] = SCHEMA_ID('dbo')  

/*
* 1,重新组织索引:alter index IX_bdCustomerAllocate ON dbo.bdCustomerAllocate reorganize
* 2,重建索引:alter index PK_bdCustomerAllocate ON dbo.bdCustomerAllocate rebulid
* */

2,索引状态批量维护
/*索引维护:检查数据库中所有索引,修复有问题的索引
* alert index 索引名称 ON 架构名称.表名 reorganize/rebulid partition = 分区号
* sys.partitions:数据库中所有表和索引的每个分区在表中各对应一行
* sys.objects:存储表、视图、存储过程
* 
* */
DECLARE cur_dx CURSOR FOR

WITH PT AS(
SELECT p.[object_id],p.index_id, COUNT(1) partition_count
FROM SYS.partitions p
GROUP BY p.[object_id],p.index_id),

DIX AS(
	SELECT DDIPS.[object_id],DDIPS.index_id,DDIPS.partition_number,DDIPS.avg_fragmentation_in_percent,
	o.name OBJECT_name,s.name schema_name,ix.name INDEX_name,pt.partition_count,
	CASE WHEN avg_fragmentation_in_percent > 30 THEN '严重碎片级别,索引需要重建'
	     WHEN avg_fragmentation_in_percent >= 5 AND avg_fragmentation_in_percent < 30 THEN '轻度碎片级别,索引需要重新组织' END warning
	
	FROM SYS.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'LIMITED') DDIPS
	JOIN SYS.objects o ON DDIPS.[object_id] = O.[object_id] --得到表名
	JOIN SYS.schemas s ON S.[schema_id] = O.[schema_id] --得到表的架构名
	JOIN SYS.indexes IX ON DDIPS.[object_id] = IX.[object_id] AND DDIPS.index_id = IX.index_id --得到索引名称
	JOIN PT ON DDIPS.[object_id] = PT.object_id AND DDIPS.index_id = pt.index_id --得到分区号
	WHERE ddips.avg_fragmentation_in_percent > 5 AND DDIPS.index_id > 0	
	AND ddips.[object_id]=OBJECT_ID('bdcustomerallocate')
),
DIXSQL AS(
	SELECT ' ALTER INDEX ' + QUOTENAME(INDEX_NAME)
	+ ' ON ' + QUOTENAME(schema_name) + '.' + QUOTENAME(OBJECT_NAME)
	+ CASE WHEN avg_fragmentation_in_percent < 30 THEN ' REORGANIZE '
	  ELSE ' REBUILD ' END 
	+ CASE WHEN partition_count > 1
	THEN ' PARTITION =  ' + CONVERT(NVARCHAR(20),partition_number)
	ELSE '' END  SQL
	FROM DIX
) 
SELECT * FROM DIXSQL

DECLARE @sql NVARCHAR(max)
OPEN cur_dx
FETCH cur_dx INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
	EXEC sp_executesql @sql
	RAISERROR('Executed:%s',10,1,@sql) WITH NOWAIT
	FETCH cur_dx INTO @sql	
END 
CLOSE cur_dx
DEALLOCATE cur_dx

--ALTER INDEX [PK_bdCustomerAllocate] ON [dbo].[bdCustomerAllocate]   REBUILD 


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

TSQL一般是对列操作,如聚合等,现要求按行进行聚合,如求出每行中最大的字段
方法:将每行数据转成一列数据集进行操作即可
如:

SELECT f.account,f.username,
( SELECT MAX(c1) FROM ( SELECT f.account c1 UNION ALL SELECT f.UserName )M )cmax
FROM frmuser f


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

rollup:汇总
在GROUP后加WITH ROLLUP来实现总计与小计,它会对每次分组的结果进行ROLLUP操作,产生汇总的结果,显示在行下。
在显示的时候可用GROUPING来判断当天是数据行还是汇总行,GROUPING为1时是汇总行,为0为数据行。
1,当GROUP只有一个字段时,ROLLUP在最后一行会显示总计
2,当GROUP有多个字段时,在上一个字段改变时显示汇总结果
即:ROLLUP会在上个字段改变时显示汇总结果,当GROUP按一个字段分组,因此字段上个字段不存在,故会在最后显示汇总结果。
如:
SELECT
CASE WHEN GROUPING (convert(varchar(10),a.OrderDate,120)) = 0 THEN convert(varchar(10),a.OrderDate,120)
WHEN GROUPING(convert(varchar(10),a.OrderDate,120)) = 1 THEN ‘总计:’ END,
CASE WHEN GROUPING(a.DepartmentID) = 0 THEN convert(varchar(10),a.DepartmentID)
WHEN GROUPING(convert(varchar(10),a.OrderDate,120)) = 0 AND GROUPING(a.DepartmentID) = 1 THEN ‘小计:’ end,
SUM(amount)
FROM bdOrder a(NOLOCK)
WHERE a.OrderDate>=’2011-05-01′
GROUP BY convert(varchar(10),a.OrderDate,120),a.DepartmentID,a.DepartmentID
WITH ROLLUP
区分总计与小计:按日期,部门ID分组,当日期所在行通过GROUPING判断出是汇总行时,则是总计。
当日期所在行为数据行,而部门ID为汇总时,为小计。
3,若不想要小计,只保留总计与其它数据,用HAVING GROUPING(firstColoum) = 1 OR 其它分组列数据IS NOT NULL


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
1,Update不仅可以给字段赋值,直接给变量赋值也行
DECLARE @str VARCHAR(50)
UPDATE AA
SET aa.c3 = ‘hello’,@str = c3
FROM tmp aa
WHERE aa.c2 = ‘aa’

2, 赋值的保留值,即执行 SELECT ,UPDATE给变量赋值,若没有结果,则保留原值。若执行的是count,则变量赋值为0,若执行的是sum,则变量赋值为空,即对于聚合函数,除count返回为0外,其它如sum, max均返回NULL。
执行 SELECT ,UPDATE给变量赋值,若没有结果,则保留原值,对于聚合函数,都是返回有值的,只是对于count,若没有结果,那么计数为0,即返回值是0,而于sum,max若没有结果,那么聚合的结果是null,null也会返回,覆盖原变量值。

3,聚合函数中, SUM/AVG/COUNT中的NULL会被忽略,对sum,avg,还没什么关系,但要注意的是COUNT,NULL被忽略意味着若count(字段),此字段有一行为NULL,则数量会少一行,他忽略的NULL就是()里的字段,若为常量或*,都不是NULL,也就没有忽略可言。

drop table t_count
create table t_count
(
c1 varchar(10) null,
c2 varchar(10) null
)

insert into t_count values(null,null)
insert into t_count values('a','b')
insert into t_count values('a','b')
insert into t_count values('c','d')
insert into t_count values('c','d')

select COUNT(1) from t_count --5
select COUNT(c1) from t_count --4
select COUNT(distinct c1) from t_count --2

--正常
select count(*) from (select distinct c1,c2 from t_count) t --3
--有NULL参与了运算,所以表达式值为NULL
select count(distinct c1+c2) from t_count --2

4,当用SELECT,UPDATE赋值时,加个TOP,找到即返回,防止遍历所有行!
注:select top 与 select相同点都会将所有满足条件的数据筛选出来然后进行赋值,top并不是筛选到一条就返回,若是将有满足条件的数据筛选出来后,赋值一个即返回,故赋值select top不会比select 性能提高多少。
DECLARE @username VARCHAR(50),@updateusername VARCHAR(50),
@count INT,@sum INT,@max int
SET @username = ‘tt’
SET @updateusername = ‘cc’
SET @count = 22
SET @sum = 33
SET @max = 44
SELECT @username = f.UserName
FROM frmuser f
WHERE 1=2
UPDATE f
SET @updateusername = f.username
FROM frmuser f
WHERE 1=2
SELECT @count= COUNT(1)
FROM frmuser f
WHERE 1=2
SELECT @sum= SUM(f.ID)
FROM frmuser f
WHERE 1=2
SELECT @max= max(f.ID)
FROM frmuser f
WHERE 1=2
SELECT @username –tt
SELECT @updateusername –cc
SELECT @count –0
SELECT @sum –null
SELECT @max –null


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

看了下SQL SERVER2005 关于TOP的定义,发现有一些用法还没掌握
1,取前40% select top (40) percent from table1 –若计算出的行数是小数,则最终行数会向上取整
2,declare @i int
set @i=1
select top @i, * from table1
在存储过程中得不到执行,因为top时后面只能是常量。 之前这样认为,并用了set rowcount @i解决,
但其实可用:select top (@i) * from table1来解决

3,在UPDATE,DELETE 中使用TOP
UPDATE TOP (2) frmuser
SET LastEditDate = GETDATE()

DELETE TOP (2) FROM frmUser

4,select top (@i)使用:对于sys.objects数据库,若类型为s则取2条,v 1条,p,3条
WITH lib AS(
SELECT ‘s’ TYPE ,2 showcount –将规则固定化
UNION ALL
SELECT ‘v’,1
UNION ALL
SELECT ‘p’,3
)

SELECT lib.*,o.*
FROM lib
CROSS APPLY(SELECT TOP (lib.showcount) NAME,create_date
FROM sys.objects o
WHERE o.[type] = lib.type
ORDER BY o.create_date)o
ORDER BY lib.type,o.create_Date


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

栏位用id代替实际内容,
一是进行封装,降低依赖,更改方便。
二是降少了每行的数据量,一个数据页可存储更多记录,IO每次按数据页为单位读取数据时,将能读出更多记录,提升了IO。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
数字辅助表:一个1到N的表 应用:连续范围的结果处理,利用group by会有缺失范围!

创建此函数,每次调用 select dbo.fn_nums(24)即可:
CREATE FUNCTION dbo.fn_nums(@n AS 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;
--注对于n级,最大的行数为2的(2的n次幂)次幂 如n=5时,最大行数为:2的32次方共4294967296行数据!
GO

应用:1,一段日期范围内的订单数,可以用group by,但得不到连续的日期,即若某天没有业绩,就显示不出来,所以用group by有缺陷
数字辅助表:
DECLARE @OrderDateBegin VARCHAR(20),@OrderDateEnd VARCHAR(20)
SET @OrderDateBegin = '2011-01-01'
SET @OrderDateEnd = '2011-02-01'
DECLARE @Span INT
SET @Span = DATEDIFF(dd,@OrderDateBegin,@OrderDateEnd)
--SELECT @Span

SELECT DATEADD(dd,fn.n-1,@OrderDateBegin),
(SELECT COUNT(1) FROM bdorder b(NOLOCK)
 WHERE b.OrderDate>=DATEADD(dd,fn.n-1,@OrderDateBegin)
       AND b.OrderDate < DATEADD(dd,fn.n,@OrderDateBegin) )
FROM dbo.fn_nums(@Span) fn

2,与上面类似,但查询一天每个时间段的数据时或每几个时间段的数据时,也可通过上面的方法处理!


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

对于子查询,名称解析处理是从内部嵌套层向外进行的,若当天表中没有select引用的列,则会从上一层中引用出来,若上层都没有,就会报错。
SELECT *
FROM frmuser a(NOLOCK)
WHERE a.Account NOT IN( SELECT account –
FROM mdDepartment a1(NOLOCK)
)
-account在mdDepartment中不存在,会引用上层frmUser的account,故语句不会报错,为避免这种情况,最好在字段前加别名。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

如查找用户名称仅由数字、字母组成的集合。
定义集合A
每一位都是字母、数字
对应:若元素有一位不是字母、数字则它就不属于A,对每一位上的限定用 NOT LIKE ‘%[限定范围]%’
SELECT * FROM frmUser b(NOLOCK)
WHERE b.WorkNo NOT IN(
SELECT a.WorkNo
FROM frmuser a(NOLOCK)
WHERE a.WorkNo NOT LIKE ‘%[0-9,a-z]%’)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
Distinct不仅可用在SELECT中,也可用在COUNT内
如:查询出所有在一线、二线部门都出过单的客户
方法:按客户ID分组,对成单的部门进行DISTINCT,次数大于2的即是
SELECT a.CustomerID
FROM bdOrder a(NOLOCK)
JOIN frmuser f ON a.SalesStaff = f.Account
JOIN mdDepartment md ON f.DepartmentId = md.ID
WHERE md.DepartType IN('first','second')
AND a.OrderDate >='2011-01-01'
GROUP BY a.CustomerID
HAVING COUNT(DISTINCT md.DepartType) >=2


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

存钱罐,平时存放5毛,1毛,1块的零钱,现在找出所有面值为5毛的。
方案1:存钱罐只有一个,所有零钱都在其中,在里面翻找全部零钱,找出所有5毛的。对应全表扫描。
方案2:将面值分类,存放到不同的存钱罐中,找时直接拿出即可。只是要增加额外的存钱罐,并且在放零钱时要注意放到对应的存钱罐中。对应数据库索引的存储空间,及在插入更新时要对索引进行操作,不过换来的是查询速度的提升。

当存钱量上升到多倍时,找5毛的硬币所费时间并没有增长多少,所花费的时间在于取出数量。即:数据量增加,查找时间并不会增长多少,只是增加了I/O时间。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

重启SQL Server服务时,最好使用配置管理器,它会自动进行一些额外的配置,如在Windows注册表中设置权限使新的账号能够读取SQL Server的设定。使用配置管理器来修改密码会立即生效,无需重启服务。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

SQL Server体系结构由四大组件构成:协议、关系引擎(查询处理器)、存储引擎、SQLOS.
协议(秘书):进行翻译与传达工作,它将接收到的请求转换成关系引擎能够识别的形式。并将关系引擎处理的最终结果转换成客户端能够理解的形式返回到客户端。
关系引擎(管理者):接受SQL批处理,以及决定如何处理,对SQL进行解析、编译及优化、执行,若需要数据,它会发送一个请求到存储引擎。
存储引擎(文件柜):负责管理所有的数据访问,包括基于事务的命令和大批量操作。
SQLOS:负责各层之间的沟通、例如线程调度、死锁检测等。

协议:在SQL Server的配置管理器中可以看到。
1,共享内存(本机访问):客户端通过该协议连接到本地计算机上的SQL Server运行实例
2,命名管着(局域网访问):为局域网而开发的协议。应用于局域网内因为它要求客户端必须具有访问服务器资源的权限。
3,TCP/IP(网络访问):在网络之间连接,可以用来在不同的硬件体系结构和操作系统的计算机网络之间进行通讯。
4,虚拟接口适配器(VIA):它是一种与VIA硬件一起使用的专门化的协议。
通常,TCP/IP 在慢速 LAN、WAN 或拨号网络中效果较好。而当网络速度不成问题时 Named Pipes 则是更好的选择,因为其功能更强、更易于使用并具有更多的配置选项。
经测试:只开TCP/IP,本机、局域网都可访问
只开Named Pipes:本机可访问,局域网不行,局域网要有访问本机的权限,设置后才可访问
只开共享内存:都不能访问
重要性:TCP/IP > Named Pipes > 共享内存


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,SQL SERVER 存储数据的最小单位是页,大小为8KB,它可以包含表或索引数据、分配视图、可用空间信息等。
1)它是SQL SERVER可以读写的最小I/O单位,所以即使访问一行,SQL SERVER也要把整个页加载到缓存,再从缓存中读取数据。
2)页的大小是8KB,即8192字节,故行的大小不会超过8192字节,最大值是8060字节,因为8192-96(标头信息)- 2(页尾维护的行指针)- 34(保留字节) = 8060
3)在2005之前的版本中行不能跨多页,而2005之后是可以的,当行大小超过8060字节后,这些类型的值将被移动到一个称为行溢出分配单元的页中,而在原始页上保留一个24字节的指针,指向行外的数据。

2,8个物理上连续的页组成的单元称为区。

3,表没有索引时组织为堆,有时组织为B树,堆是无序的,给定一个值,在对于节点处不知是在此节点的左子节点还是右子节点,而B树是有序的,给定一个值是可以知道是向左走还是右走。
概念:堆是一种特殊的二叉树,每个接点的关键值都大(或小于)它的左右孩子接点,一般指最大堆或最小堆
具备以下两种性质
1)每个节点的值都大于(或者都小于,称为最小堆)其子节点的值
2)除最后一层外每一层都是填满的,并且最后一层的树叶都在最左边

B树 :二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
二者区别:在于子结点上,B树是子结点比父结点小,右结点比父结点大,而堆没有这种性质。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

表设计中增加列,在列的计算所得列的规范中录入公式即可
持久代表值是否实际存储起来还是每次查询时重新生成
如:ALTER TABLE dbo.tmp ADD cs_Pname AS CHECKSUM(c1);
为列计算校验值,然后在此列上加上索引,则比一般的查询速度要快
应用:1,字符串比较没有数字比较来得快,故可增加一列存字符串的校验值,在此值上加索引进行比较,速度将提升很多

2,SELECT CHECKSUM(NEWID()) 返回随机数1到n: abs(CHECKSUM(NEWID()))%n + 1

3,CHECKSUM(NEWID()) 返回8-10位数字,故要求11位以上的随机不重复数,可采用:
SELECT right(right(abs(CHECKSUM(NEWID())),3) + CONVERT(varchar(50),abs(CHECKSUM(NEWID()))),11)

4,随机时间:
SELECT DATEADD(mi,ABS(CHECKSUM(NEWID())%(1+DATEDIFF(mi,’2011-05-14 13:00′,’2011-05-14 14:00′))),’2011-05-14 13:00′)

5,比较两行多个列是否相同
SELECT CHECKSUM(1,2,4)
SELECT DISTINCT OBJECT_ID,NAME,TYPE
FROM sys.tables tb
WHERE CHECKSUM(OBJECT_ID,NAME,type)
IN(
SELECT CHECKSUM(OBJECT_ID,NAME,type)
FROM (
SELECT OBJECT_ID,NAME,TYPE FROM sys.objects o
)obj
)
注: checksum不区分大小写,若要区分,要用BINARY_CHECKSUM


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

32位机能够寻址为:2^32次方 = 4G,而Windows系统本身会将2GB的地址空间留做已用。故所有应用程序最大内存空间为2G,SQL SERVER若想超过2G,需要开启AWE!
/3g开关,只是将用户可用物理内存调整为3g核心系统内存调整为1个g,提高用户程序的执行性能
/pae开关,只是用于在大于4g的物理内存时 识别出更多内存使用
awe 是帮助应用程序能寻址大于4g的空间
pae是开awe的前提。 pae是整体上开到4G以上,awe是让sql server可以大于4g以上,只开awe,因整体不允许超过4G,故开AWE也要开PAE