SQL优化-关于max degree of parallelism 选项

当 SQL Server 2005 在具有多个微处理器或 CPU 的计算机上运行时,它将为每个并行计划执行检测最佳并行度(即运行一个语句所使用的处理器数)。您可以使用 max degree of parallelism 选项来限制并行计划执行时所用的处理器数。如果默认值为 0,则使用所有可用的处理器。将 max degree of parallelism 设置为 1 以取消生成并行计划。将该值设置为大于 1 的数字(最大为 64)来限制执行单个查询时所用的最大处理器数。如果指定的值比可用的处理器数大,则使用实际可用数量的处理器。如果计算机只有一个处理器,则将忽略 max degree of parallelism 值。

查看更多内容...

Posted in 数据库 at February 7, 2014. by 傻猫 .    Views: 2940    No Comments

SQL2008数据库优化常用脚本

--查询某个数据库的连接数
select count(*) from Master.dbo.SysProcesses where dbid=db_id()

--前10名其他等待类型
SELECT TOP 10 * from sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC

SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%'
OR wait_type like 'LAZYWRITER_SLEEP%'

--CPU的压力
SELECT scheduler_id, current_tasks_count, runnable_tasks_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255

查看更多内容...

Posted in 数据库 at February 7, 2014. by 傻猫 .    Views: 3144    No Comments

MSSQL删除所有存储过程

删除所有存储过程
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='P'
select @tname='drop Procedure ' + left(@tname,len(@tname)-1)
exec(@tname)

删除所有表
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='U'
select @tname='drop table ' + left(@tname,len(@tname)-1)
exec(@tname)

删除所有视图
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='V'
select @tname='drop View ' + left(@tname,len(@tname)-1)
exec(@tname)

Posted in 数据库 at January 8, 2014. by 傻猫 .    Views: 2231    No Comments

SQL查询数据库表名、表的列名

--读取库中的所有表名
select name from sysobjects where xtype='u'

--读取指定表的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
获取数据库表名和字段
sqlserver中各个系统表的作用
    sysaltfiles      主数据库                  保存数据库的文件
syscharsets      主数据库                  字符集与排序顺序
sysconfigures    主数据库                  配置选项
syscurconfigs    主数据库                  当前配置选项
sysdatabases      主数据库                  服务器中的数据库
syslanguages      主数据库                  语言
syslogins        主数据库                  登陆帐号信息
sysoledbusers    主数据库                  链接服务器登陆信息
sysprocesses      主数据库                  进程
sysremotelogins主数据库                  远程登录帐号

syscolumns        每个数据库                列
sysconstrains    每个数据库                限制
sysfilegroups    每个数据库                文件组
sysfiles          每个数据库                文件
sysforeignkeys 每个数据库                外部关键字
sysindexs        每个数据库                索引
sysmenbers        每个数据库                角色成员
sysobjects        每个数据库                所有数据库对象
syspermissions 每个数据库                权限
systypes          每个数据库                用户定义数据类型
sysusers          每个数据库                用户

//
用什么方法可以得到一个表中所有的列名。SQl语句。
select      列名=name      from      syscolumns      where      id=object_id(N'要查的表名')

Posted in 数据库 at December 16, 2013. by 傻猫 .    Views: 3416    No Comments

关于MSSQL update 累加更新null的问题

遇到一个问题,累加更新备注字段

update 备注=备注+'新的内容'  where id=110

这样更新没有问题,但是当备注为null的时候,就有问题了

null+任何字符串都是null,我操,所以更新不成功,必须要转换一下。

update 备注=isnull(备注,'')+'新的内容'  where id=110

加一个判断就可以了。

Posted in 数据库 at October 28, 2013. by 傻猫 .    Views: 3155    No Comments

关于多对多关系数据的比较算法

昨天搞了一个小软件,主要分析多对多关系的数据,刚开始一直没有想到办法,后来想到了通过数据库数据读取来循环操作,功能实现了,但是要读取数据库很多次,效率感觉不行,于是又重新想了想,用动态数组的方法来实现,不读写数据库,速度也很快,而且充分发挥了CS客户端的效率,可以交由客户端来完成一些事务处理,这个是BS无法比的,哈哈。现将demo分享一下。

1、两张表,一个是学生信息表UserInfo,一个学科信息Project表

UserInfo信息如下

id,  name, myProject
1    tom     1,2,3,4
2    jim      1,3
3   sam      2,4

Project信息如下

id,name
1    math
2    english
3   chinese
4   Japanese

 myProject字段信息记录学生的科目信息,现在是需要在listview列表里显示某个学生的科目信息,所学科目打钩。

1、首先将所有科目信息填充到listview,第一列为科目ID

2、取出某学生的学科信息myProject值temp

第一种实现方法,通过数据库循环操作:

      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
             //通过数据循环操作获取相关信息
            mysql:='select id from Project  where id in ('+temp+')';
            with data do
            begin
                  qry_temp.Close;
                  qry_temp.SQL.Clear;
                  qry_temp.SQL.Add(mysql);
                  qry_temp.Open;
                  for j:=0 to qry_temp.RecordCount-1 do
                  begin
                        if Trim(qry_temp.fieldbyname('id').AsString)=lvtxt then
                        lv_hdtc.Items.Item[i].Checked:=True;

                        qry_temp.FindNext;
                  end;
            end;
                       
      end;

第二种实现方法,使用动态数组:

    //mytc: array of string;
     i:=0;
     SetLength(mytc,Length(temp));
     while True do
     begin
             if Pos(',',temp)>0 then
             begin
                  SplitString(temp,',',l,r);
                  mytc[i]:=Trim(l);
                  temp:=Trim(r);
                  i:=i+1;
             end
             else
             begin
                 if i=0 then
                 mytc[0]:=Trim(temp)
                 else
                 mytc[i]:=Trim(temp);
                
                 Break;
             end;
     end;


      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
            //通过本地数组格式化进行操作
            lvtxt:=Trim(lv_hdtc.Items.Item[i].Caption);

            for j:=0 to Length(mytc)-1 do
            begin
                  if Trim(mytc[j])=lvtxt then
                  lv_hdtc.Items.Item[i].Checked:=True;
            end;
          
      end;

 

Posted in 数据库 at June 20, 2013. by 傻猫 .    Views: 3578    No Comments

MSSQL复制表

复制表结构有句型的--跨数据库

--复制结构+数据
select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名
 
--只复制结构
select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名 where 1=0

--复制到临时表
select * into #temptablename from 数据库名.dbo.原表名 where 1=0

Posted in 数据库 at January 22, 2013. by 傻猫 .    Views: 3790    No Comments

MSSQL 游标多参数/取多列值

游标多参数循环操作,效率确实高了不少。

CREATE                  PROCEDURE p  AS

declare  @UserID  int
declare  @MinID  int
declare  @UserTEL varchar(20)
 
declare  cur_getUserID  cursor  for
      select main_id,tel,min(id)  from tel group by tel,main_id having count(*)>1    
 --select main_id,tel,min(id)  from tel where main_id=962192 and tel='15882188374' group by tel,main_id

open  cur_getUserID

fetch  next  from  cur_getUserID into @UserID,@UserTEL,@MinID
while(@@fetch_status  =  0)
begin 
 
 delete from tel where main_id=@UserID and tel=@UserTEL and id<>@MinID

 fetch  next  from  cur_getUserID into @UserID,@UserTEL,@MinID
end

close  cur_getUserID
deallocate  cur_getUserID

GO

Posted in 数据库 at January 9, 2013. by 傻猫 .    Views: 3413    No Comments