这各测试也只有在百万级以上的数据库才会有比较明显的区别,我们今天利用我的应用实现来比较sql中not
in与left join语句在百万级数据测试,这个很有用的各位朋友可以收藏。

mssql定时备份数据库方法//方法一要用远程数据库可以备份本地。
本地数据库也可以备份到远程。

提供一篇简单的监控mmsql 运行状态方法,有需要的朋友参考一下。

两张表 组织架构表 和 工资发放历史记录表

mssql定时备份数据库教程方法//方法一

Microsoft SQL Server 2005
提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV)
和动态管理函数 (DMF)
返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。

两张表通过 Organise.Item_id 和 WagePerMonthHis.OrgIdS 进行关联

要用远程数据库可以备份本地。 本地数据库也可以备份到远程。

–备份环境:把数据库服务器(192.168.1.8)的数据库(TEST)备份到(192.168.1.145)的C$下

–首先,做一个与客户端的映射 exec master..xp_cmdshell ‘net use z:
/192.168.1.145c$ 密码 /user:192.168.1.145administrator’

–其次,进行数据库备份 backup database TEST to disk=’z:Test.bak’

–最后.备份完成后删除映射 exec master..xp_cmdshell ‘net use z:
/delete’ –来自网络

–以下代码放在作业里做调度,自动备份、自动删除4天前备份

–创建映射exec master..xp_cmdshell ‘net use w: DatabaseBackup$
password/user:Roy’,NO_OUTPUTgo—–2000用游标: @s nvarchar(200),@del
nvarchar(200)select @s=”,@del=”

declare datebak cursor forselect [bak]=’backup database
‘+quotename(Name)+’ to disk
=”w:’+Name+’_’+convert(varchar(8),getdate(),112)+’.bak” with init’,
[del]=’exec master..xp_cmdshell ” del
w:’+Name+’_’+convert(varchar(8),getdate()-4,112)+’.bak”, no_output’
from master..sysdatabases where dbid4 –不备份系统数据库open datebak

fetch next from datebak into @s,@delwhile @@fetch_status=0 begin exec
(@del) exec(@s) fetch next from datebak into @s,@del endclose
datebakdeallocate datebakgo–删除映射exec master..xp_cmdshell ‘net
use w: /delete’

go

–用JOB. –SQL SERVER2000为例

企业管理器数据库服务器管理目

常规服务器动态管理对象包括:

Organise表(以下简称O表)中大约有6000条记录11个字段
,WagePerMonthHis(以下简称W表)计有 125万条记录 和 25个字段

录SQL SERVER代理作业右键 选新建

dm_db_*:数据库和数据库对象

原程序中一段如下的语句

常规选项页输入作业名称选中所有者。

dm_exec_*:执行用户代码和关联的连接

是查询所有不在W表的组织架构层级为2的记录

步骤选项页新建输入步骤名类型
TSQL脚本选择需要执行的数据库在命令框里输入你的SQL 脚本:

dm_os_*:内存、锁定和时间安排

代码如下复制代码

如:update tb set 状态= … where 日期………..

dm_tran_*:事务和隔离

select OrgId as 公司编码,OrgName as 公司名称

你可以点左下角的按钮,分析一下语法,分析无误,按确定。

dm_io_*:网络和磁盘的输入/输出

from Organise

调度选项页新建调度输入调度名称调度类型
你可以选择也可以点右下角的按钮进行更改,确定。

此部分介绍为监控 SQL Server
运行状况而针对这些动态管理视图和函数运行的一些常用查询。

where OrgLev=2

任务栏 SQL SERVER服务器的小图标 双击 服务 选中 SQL SERVER
AGENT,点,选中当启动OS时,自动启动服务,就可以了。

示例查询您可以运行以下查询来获取所有 DMV 和 DMF 名称:

and item_id not in

到你定的那个时间点,SQL SERVER会自动去执行你的脚本的。

SELECT * FROM sys.system_objects WHERE name LIKE ‘dm_%’ ORDER BY name

(select OrgidS from WagesPerMonthHis

如果需要生成脚本的话,企业管理器数据库服务器管理目录SQL
SERVER代理作业右键你刚完成的作业所有任务

监控 CPU 瓶颈CPU
瓶颈通常由以下原因引起:查询计划并非最优、配置不当、设计因素不良或硬件资源不足。下面的常用查询可帮助您确定导致
CPU 瓶颈的原因。

where WagesYear=’2010′ and WagesMonth=

生成SQL脚本,即可生成你需要的脚本。//方法二

下面的查询使您能够深入了解当前缓存的哪些批处理或过程占用了大部分 CPU
资源。

’01’ Group by OrgidS,OrgNameS)

企业管理器管理数据库维护计划

SELECT TOP 50 SUM(qs.total_worker_time) AS total_cpu_time,
SUM(qs.execution_count) AS total_execution_count, COUNT(*) AS
number_of_statements, qs.sql_handle FROM sys.dm_exec_query_stats
AS qs GROUP BY qs.sql_handle ORDER BY SUM(qs.total_worker_time) DESC

order by Orgid

下面的查询显示缓存计划所占用的 CPU 总使用率。

语句执行要33秒之久,服务器的配置是比较高的:16核心4CPU,24G内存,且内存和CPU在执行时都没有出现瓶颈,开始以为是

SELECT total_cpu_time, total_execution_count,
number_of_statements, s2.text –(SELECT SUBSTRING(s2.text,
statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE
statement_end_offset END) – statement_start_offset) / 2) ) AS
query_text FROM (SELECT TOP 50 SUM(qs.total_worker_time) AS
total_cpu_time, SUM(qs.execution_count) AS total_execution_count,
COUNT(*) AS number_of_statements, qs.sql_handle –,
–MIN(statement_start_offset) AS statement_start_offset,
–MAX(statement_end_offset) AS statement_end_offset FROM
sys.dm_exec_query_stats AS qs GROUP BY qs.sql_handle ORDER BY
SUM(qs.total_worker_time) DESC) AS stats CROSS APPLY
sys.dm_exec_sql_text(stats.sql_handle) AS s2

代码如下复制代码

下面的查询显示 CPU 平均占用率最高的前 50 个 SQL 语句。

(select OrgidS from WagesPerMonthHis

SELECT TOP 50 total_worker_time/execution_count AS [Avg CPU Time],
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN
statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset end -statement_start_offset)/2) FROM
sys.dm_exec_sql_text(sql_handle)) AS query_text, * FROM
sys.dm_exec_query_stats ORDER BY [Avg CPU Time] DESC

where WagesYear=’2010′ and WagesMonth=

下面显示用于找出过多编译/重新编译的 DMV 查询。

’01’ Group by OrgidS,OrgNameS)

select * from sys.dm_exec_query_optimizer_info where counter =
‘optimizations’ or counter = ‘elapsed time’

这条语句执行缓慢所致,单独执行这条却发现执行速度很快,大约不到2秒就出来了,于是症结出来了,是not
in
这个全扫描关键词带来的性能下降.最直接的是导致页面失去响应,一个关键功能使用不了.

下面的示例查询显示已重新编译的前 25
个存储过程。plan_generation_num指示该查询已重新编译的次数。

试了not exist语句,发现效果是一样的,并不象网上所说可以提高很多性能.

select top 25 sql_text.text, sql_handle, plan_generation_num,
execution_count, dbid, objectid from sys.dm_exec_query_stats a cross
apply sys.dm_exec_sql_text(sql_handle) as sql_text where
plan_generation_num 1 order by plan_generation_num desc

于是重新优化语句如下

效率较低的查询计划可能增大 CPU 占用率。

代码如下复制代码

下面的查询显示哪个查询占用了最多的 CPU 累计使用率。

select a.OrgId as 公司编码,a.OrgName as 公司名称,a.item_id

代码如下复制代码 SELECT highest_cpu_queries.plan_handle,
highest_cpu_queries.total_worker_time, q.dbid, q.objectid, q.number,
q.encrypted, q.[text] from (select top 50 qs.plan_handle,
qs.total_worker_time from sys.dm_exec_query_stats qs order by
qs.total_worker_time desc) as highest_cpu_queries cross apply
sys.dm_exec_sql_text(plan_handle) as q order by
highest_cpu_queries.total_worker_time desc

发表评论

电子邮件地址不会被公开。 必填项已用*标注