日度归档:2018年8月27日

mssql sqlserver 使用sql脚本判断物理表、临时表是否存在的方法分享


摘要:
在存储过程的编写中,升级脚本的编写中,我们经常需要判断一张物理表或临时表是否存在,然后再做后续的操作,
下文分享使用sql脚本判断物理表或临时表是否存在的方法,如下所示:
实验环境:sql server 2008 R2

     ---例判断数据库"test"中是否存在物理表"tableTest"
     ---方法1:使用object_id检测表名是否返回相应的Id,
     ---存在ID,代表数据表存在指定的数据库中,反之不存在
       use test;
     go

    if object_id(N'tableTest',N'U') is not null
          print 'tableTest表存在'
     else 
         print 'tableTest表不存在'

     ---方法2:使用系统表dbo.SysObjects,检测系统对象中是否存在此表名
     USE [test] 
      GO 

       IF EXISTS(SELECT  * FROM dbo.SysObjects WHERE ID = object_id(N'[tableTest]') AND OBJECTPROPERTY(ID, 'IsTable') = 1) 
          PRINT 'tableTest表存在' 
       ELSE 
          PRINT'tableTest表不存在'

--------------------------------------------------------------------------------------------------------
     ---临时表是否存在的方法分享
     ---例:检测数据库test中是否存在临时表"tmpTableName" 
     ---方法1:使用tempdb中sysobjectsd对象检测临时表是否存在
     use [test];
      go

      if exists(select * from tempdb..sysobjects where id=object_id('tempdb..##tmpTableName'))
         PRINT 'tmpTableName临时表存在' 
      ELSE 
         PRINT'tmpTableName临时表不存在'


      ---方法1:使用object_id返回对象Id的方式检测临时表是否存在
     use [test];
     go

     if  object_id(N'tempdb..#tmpTableName')  is not null 
       PRINT 'tmpTableName临时表存在' 
     ELSE 
       PRINT'tmpTableName临时表不存在'

mssql sqlserver 获取运行sql脚本,缺失索引的情况分析


摘要:
下文讲述通过系统函数,获取sqlserver服务启动后,运行的一段时间内,缺失索引的情况统计,如下所示:
实验环境:sqlserver 2008 R2


在数据库查询优化中,我们使用最多的情况就是对”查询列和返回列”新建索引,使查询脚本可以快速检索到相应的数据,
下文讲述mssql sqlserver提供的自动查找出缺失索引的方法分享:
缺失索引的查找方法,主要通过以下几个系统视图获取相关缺失索引信息:

  sys.dm_db_missing_index_details
  sys.dm_db_missing_index_groups
  sys.dm_db_missing_index_group_stats
  sys.dm_db_missing_index_columns(index_handle)


一、sys.dm_db_missing_index_details

sys.dm_db_missing_index_details 记录自sqlserver服务重启前所有运行sql脚本中缺失索引的情况。

mssql_sqlserver_sys.dm_db_missing_index_details视图内容说明

mssql_sqlserver_sys.dm_db_missing_index_details视图内容说明


—–返回值列说明—-
index_handle:缺失索引标识信息,唯一标识列;
database_id :缺失索引涉及数据库;
object_id :缺失索引涉及表;
equality_columns:where 条件采用等式 例 where tableName.[列名] =’值’
equality_columns 存储”列名”信息
inequality_columns :采用非等式的其它条件的列名信息
where tableName.[列名] < > ‘值’
where tableName.[列名] > ‘值’
where tableName.[列名] < '值' where tableName.[列名] like '%值%' inequality_columns 中存储此种操作模式涉及的"列名"信息 included_columns:查询中涉及的返回列(select ...) statement:索引涉及的表对象
例:
针对此表中的内容创建索引信息
create index ix_****** on [表名] (equality_columns/inequality_columns) include(included_columns)
—注意事项:
缺失索引表,只保留sqlserver服务器重启后的sql脚本的缺失情况。
即:需经常对此视图进行关注,获取更多的数据库优化信息


二、sys.dm_db_missing_index_groups

返回特定索引组中的缺失索引信息

三、sys.dm_db_missing_index_group_stats

2.mssql_sqlserver_sys.dm_db_missing_index_group_stats返回信息说明

2.mssql_sqlserver_sys.dm_db_missing_index_group_stats返回信息说明


返回索引缺失索引建立后,对性能的预估提升
返回集合中:
avg_user_impact:新建此索引后,sql脚本查询提升的百分比

四、sys.dm_db_missing_index_columns(index_handle)

返回索引索引列信息,接收参数index_handle来源于缺失索引系统视图 sys.dm_db_missing_index_details

五、获取缺失索引信息-举例说明

  /*
获取前20条缺失索引的情况
*/
SELECT TOP 20 
         DB_NAME() AS [数据库名称] ,
         d.[statement] AS [表名] ,
         equality_columns  as [列名1],
         inequality_columns  as [列名2],
         included_columns as [包含列]
 FROM    sys.dm_db_missing_index_groups g
         INNER JOIN sys.dm_db_missing_index_group_stats s ON s.group_handle = g.index_group_handle
         INNER JOIN sys.dm_db_missing_index_details d ON d.index_handle = g.index_handle
order by s.avg_total_user_cost desc  

mssql sqlserver 获取一张表中群组后下一个不一样值的方法分享


摘要:
下文分享使用sql脚本获取一张表不同数据的下一条记录的方法


例:

   create table test(keyId int identity,
sort varchar(100),qty  int)
go

insert into test(sort,qty)
values
('maomao365.com',3),('maomao365.com',61),
('sql教程',8),('sql教程',9),
('猫猫小屋',28),('猫猫小屋',38),
('sql_blog',12),('sql_blog',18)
go
/*
sort列相同,只展示qty最大的一条的数据
实现思路:使用row_number对群组数据进行分组并排序,
      然后根据排序后的值,展示群组中的"第一条"数据
*/
select * from 
(
select row_number() 
       over(partition by sort order by qty desc )
    as keyIdNew,
* from test
) as tmp
where tmp.keyIdNew =1  


go
truncate table test
drop     table test
mssql_sqlserver_row_number应用_只取一条数据

mssql_sqlserver_row_number应用_只取一条数据