SQLServer 2008中SQL增强之二 Top新用途

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLServer 2008中SQL增强之二 Top新用途相关的知识,希望对你有一定的参考价值。

参考技术A 一 TOP替代Set RowCount 在SQL Server 之前的传统SQL语句中 top语句是不支持局部变量的 见此时可以使用Set RowCount 但是在SQL Server / 中 TOP通常执行得更快 所以应该用TOP关键字来取代Set RowCount

  复制代码 代码如下:

  /***************创建测试表********************* ****************downmoo ***************/ IF NOT OBJECT_ID( [Demo_Top] ) IS NULL DROP TABLE [Demo_Top] GO Create table [Demo_Top] (PID int identity( ) primary key not null PName nvarchar( ) null AddTime dateTime null PGuid Nvarchar( ) ) go truncate table [Demo_Top] /***************创建 条测试数据********************* ****************downmoo ***************/ declare @d datetime set @d=getdate() declare @i int set @i= while @i<= begin insert into [Demo_Top] select cast(datepart(ms getdate()) as nvarchar( ))+Replicate( A datepart(ss getdate())) getdate() NewID() set @i=@i+ end

注意TOP关键字可以用于Select Update和Delete语句中

  复制代码 代码如下:

  Declare @percentage float set @percentage= select Top (@percentage) percent PName from [Demo_Top] order by PName 注意是 行 ( row(s) affected)

邀月注 如果只是需要一些样本 也可以使用TableSample 以下语句返回表Demo_Top的一定百分比的随机行

  复制代码 代码如下:

  select PName AddTime PGuid from [Demo_Top] TableSample System( percent) ( row(s) affected)

注意这个百分比是表数据页的百分比 而不是记录数的百分比 因此记录数目是不确定的 二 TOP分块修改数据 TOP的第二个关键改进是支持数据的分块操作 换句话说 避免在一个语句中执行非常大的操作 而把修改分成多个小块 这大大改善了大数据量 大访问量的表的并发性 可以用于大的报表或数据仓库应用程序 此外 分块操作可以避免日志的快速增长 因为前一操作完成后 可能会重用日志空间 如果操作中有事务 已经完成的修改数据已经可以用于查询 而不必等待所有的修改完成 仍以上表为例

  复制代码 代码如下:

注意是每批删除 条数据 TOP也可以用于Select和Update语句 其中后者更为实用 Select TOP( ) Update TOP( ) 邀月注 本文版权由邀月和博客园共同所有 转载请注明出处 lishixinzhi/Article/program/SQLServer/201404/30567

An enhance script to check partition tables under all schemas in sqlserver

Simple step for EMC NW & NMM

(1) disable WINDOWS UAC (reboot)
(2) SET windows domain user AS sysadmin
(3) modify hosts
(4) install software (NW , NMM) (reboot)
(5) CONFIG NWDROP VIEW [partition_show]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE view [partition_show]
as
SELECT distinct OBJECT_NAME(T2.object_id) TABLE_NAME
,T1.partition_number
,T4.name as "function_name"
,T3.name as "schema_name"
,T7.name File_group_name
,T1.rows
,CASE boundary_value_on_right
WHEN 1 THEN ‘less than‘
ELSE ‘less than or equal to ‘ END as ‘comparision‘
--,CONVERT(varchar(100), T5.value, 112) value
,T5.value
FROM sys.partitions T1
INNER JOIN sys.indexes T2
ON T1.object_id = T2.object_id
INNER JOIN sys.partition_schemes T3
ON T2.data_space_id = T3.data_space_id
INNER JOIN sys.partition_functions T4
ON T3.function_id = T4.function_id
LEFT JOIN sys.partition_range_values T5
ON T4.function_id = T5.function_id
AND T1.partition_number = T5.boundary_id
INNER JOIN sys.destination_data_spaces T6
ON T6.partition_scheme_id = T3.data_space_id
AND T6.destination_id = T1.partition_number
INNER JOIN sys.filegroups T7
ON T6.data_space_id = T7.data_space_id
where T2.object_id in (select t.object_id from sys.tables as t inner join sys.indexes as i on t.object_id=i.object_id and i.type in (0,1) inner join sys.partition_schemes ps on i.data_space_id=ps.data_space_id)
AND T1.index_id<=1

-----------------------------------------------------------------------------------------------------------------------------
Difference
------------------------------------------------------------------------------------------------------------------------------
original part:
select OBJECT_ID(t.name) from sys.tables as t inner join sys.indexes as i on t.object_id=i.object_id and i.type in (0,1) inner join sys.partition_schemes ps on i.data_space_id=ps.data_space_id
new part
select t.object_id from sys.tables as t inner join sys.indexes as i on t.object_id=i.object_id and i.type in (0,1) inner join sys.partition_schemes ps on i.data_space_id=ps.data_space_id

以上是关于SQLServer 2008中SQL增强之二 Top新用途的主要内容,如果未能解决你的问题,请参考以下文章

也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强

MSSQL之二 Sql Server中管理库与表

SQL2008和sql2008 r2有啥区别

也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)

也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)

SQL Server 2008 中文版标准教程 清晰扫描 PDF版 [121M]下载