zoukankan      html  css  js  c++  java
  • Sqlserver 笔记 持续更新

    1.sp_spaceused :

    sp_spaceused table_name


    ---------------------------------------------------------------------------------------------

    name  rows  reserved  data  index_size  unused

    table_name 16470592  36315696KB  35796160KB  519432KB  104KB

    name  -- 自然就是表名或object名了


    rows -- 表中数据的行数


    reserved -- 这个表占的总共的size,等于data 35796160KB + index_size 519432KB + unused 104KB

    data -- 数据页面总共占的大小

    index_size -- index页面总共占的大小

    unused -- 留下的一点小空间。因为磁盘分配空间等原因多给的那么一点。和fill factor没有关系

    2.sys.dm_db_partition_stats

    select b.name,a.row_count from sys.dm_db_partition_stats a,
    sys.objects b
    where a.object_id=b.object_id
    and a.index_id<=1
    and b.type='U'

    sys.dm_db_partition_stats它返回当前数据库中每个分区的页和行计数信息,在上面的sql中,三个关键列的意思如下:
    object_id:表或者索引视图的ID,所以可以用它与sys.objects表的object_id相匹配。
    row_count:该表或索引视图中数据的数量,就是我们要查询的结果。
    index_id:该表或索引视图的索引ID。 如果该表没有索引,那么会在sys.dm_db_partition_stats中存在一行index_id=0的记录,如果有一个聚集索引(而且一个表中也只能有一个聚集索引),那么在sys.dm_db_partition_stats中存在一行index_id=1的记录,而对应的index_id=0的记录没有了。如果这个表在sys.dm_db_partition_stats中存在多行index_id >1的记录,则说明这个表存在多个非聚集索引,我们这里判断index_id<=1,是假定每个表都有主键,且主键为聚集索引。配合sys.objects表的type='U',就可以查出每个用户表的数据数量了。

     3.使用Delete删除大量数据后SQL Server性能下降的问题及解决方法

    问题产生原因:
    1,当表上有聚集索引时,删除操作会释放空页。然而,从堆中删除行时,数据库引擎可以使用行锁定或页锁定进行操作。结果,删除操作导致的空页将继续分配给堆。未释放空页时,数据库中的其他对象将无法重用关联的空间。
    2,虽然表中没有大量数据,但是它们拥有大量的几乎为空的数据页。扫描表因此变得十分花时间。

    解决方案:
    若要删除堆中的行并释放页,我们可以使用下列方法中的一种。
    1,在DELETE语句中指定TABLOCK提示。使用TABLOCK命令会导致删除操作获取表的共享锁,而不是行锁或页锁。这将允许释放页。
    2,如果要从表中删除所有行,可使用TRUNCATE TABLE代替Delete
    3,删除行之前,请对堆创建聚集索引。删除行之后,可以删除聚集索引。与前面的方法相比,此方法非常耗时,并且使用更多的临时资源。

    4.

    在SQL中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN,它们被称之为三值逻辑。

    我们知道,在其它的语言中,逻辑表达式只有两种,要么是true,要么就是false。而sql中却存在第三个逻辑表达式UnKnown,这个是sql中特有的。从字面意思上我们可以解理该值的意思是:什么都不知道,就是什么都不是。一般情况下我们将任何值(包括NULL本身)与NULL做比较的时候,都会返回UnKnown。而在查询表达式中(比如where与having中),UnKnown会视为false。所以我们就明白了为什么select * from 表 where 字段=null查不到正确的结果的原因了。

    但并不是在所有场情下UnKnown都会视为false来处理,在check约束中,UnKnown就会视为true来处理。这就是为什么我们设置某个字段的值必须大于等于0的情况下,我们还可以往该字段中插入Null值,那是因为在check约束中null>=0的逻辑结果UnKnown会被当作true来处理
    需要注意的是,在分组子句与排序子句中,sql视null是相等的
    即:
    1,GROUP BY会把所有NULL值分到一组。
    2,ORDER BY会把所有NULL值排列在一起。

    5.

    exec sp_helptext aa--应用sp_helptext查看存储过程的定义文本
    exec sp_depends aa --通过sp_depends查看存储过程的相关性
    exec sp_help aa --应用sp_help查看存储过程的其它属性
    exec sp_rename aa,bb--将指定的存储过程或表名进行更改
    exec sp_renamedb --更改数据库的名称
    --得到数据库中所有的表名
    Select   name   from   sysobjects   where   xtype   =   'u'  

    --得到某个表的所有字段名
    select   name   from   syscolumns   where   id   =   object_id('tablename')

    --查看users表中所有的字段信息
    exec sp_help 'users'

    --查找用到users表或者users字段的所有存储过程
    select distinct(o.name) from sysobjects o(nolock)

    left outer join syscomments c(nolock) on o.id=c.id

    where o.type='P' and c.text like '%users%'
  • 相关阅读:
    函数式编程
    scala 有 + 运算符吗?
    使用 Idea 打 scala程序的 jar 包
    相见恨晚的 scala
    半夜思考,为什么 String 具有不变性
    我的常用
    DataTable学习笔记
    Js 操作cookie
    嵌套的 ajax 请求
    Jquery插件收集【m了慢慢学】
  • 原文地址:https://www.cnblogs.com/wanglg/p/3911930.html
Copyright © 2011-2022 走看看