当前位置: 代码迷 >> Sql Server >> 难道是SQL2008的Bug么?进来看看
  详细解决方案

难道是SQL2008的Bug么?进来看看

热度:65   发布时间:2016-04-24 19:45:54.0
难道是SQL2008的Bug么?大虾进来看看
我遇到了和这哥们发的帖子一样的问题:http://bbs.csdn.net/topics/390028807#new_post
问题纠结在于sys.dm_os_wait_stats里的wait_type是否有重复值!
大家不妨在你的DB里运行下面代码验证下~

-- 一般我们用DISTINCT来去重
select count(wait_type) from sys.dm_os_wait_stats;
select count(distinct wait_type) from sys.dm_os_wait_stats;
-- 以上结果都是490,也就是说wait_type是没有重复的
-- 但是,进行如下操作,系统会告诉你有重复值!!!
-- 获取一个表dbo.WaitStats存储wait_type;清空数据
SELECT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
TRUNCATE TABLE dbo.WaitStats;
-- 对dbo.WaitStats的wait_type添加主键约束,再插入
ALTER TABLE dbo.WaitStats ADD CONSTRAINT PK_WaitStats PRIMARY KEY(wait_type);
SELECT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 失败,“违反了 PRIMARY KEY 约束 'PK_WaitStats'。不能在对象 'dbo.WaitStats' 中插入重复键。”

之前已经验证没有重复了,但是插入的时候系统却提示有重复值!即使这样操作也不行:

TRUNCATE TABLE dbo.WaitStats;
SELECT DISTINCT wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 好神奇,DISTINCT居然不能对nvarchar(60)类型去重!!

于是我把那490行的数据Copy出来贴到Excel,利用Excel去重功能,发现结果少了10多行!!!
但是这样是可以的:

TRUNCATE TABLE dbo.WaitStats;
SELECT top 10 wait_type INTO dbo.WaitStats FROM sys.dm_os_wait_stats; 
-- 很简单,前10行没有重复,所以不违背主键约束;但是为什么上面加了DISTINCT也不行呢???


实在无法接受这样的事实,于是我跑到了SQL2005上执行,居然发现2005上没有问题!
这是什么情况啊。。。亲,你怎么看?
sqlserver2008

------解决方案--------------------
终于可以再次回复了,你看这个,我不敢说是不是bug,如果不是bug,那就是微软有某些意图额外存放,不过既然2005和2012都没问题,那也有可能是当初的一个bug,后来修复了。
------解决方案--------------------

SELECT  COUNT(wait_type)
FROM    sys.dm_os_wait_stats ;
SELECT  COUNT(DISTINCT wait_type)
FROM    sys.dm_os_wait_stats ;

SELECT  wait_type
INTO    #t
FROM    sys.dm_os_wait_stats
GROUP BY wait_type

ALTER TABLE [#t] ALTER COLUMN [wait_type] NVARCHAR(50) COLLATE Chinese_PRC_90_CI_AI
 
SELECT  COUNT(wait_type)
FROM    #t ;
SELECT  COUNT(DISTINCT wait_type)
FROM    #t ;

 


 
SELECT DISTINCT wait_type  
FROM    sys.dm_os_wait_stats
WHERE   [wait_type] = 'MISCELLANEOUS'


 
SELECT DISTINCT wait_type COLLATE Chinese_PRC_90_CI_AI
FROM    sys.dm_os_wait_stats
WHERE   [wait_type] = 'MISCELLANEOUS' COLLATE Chinese_PRC_90_CI_AI
ORDER BY wait_type COLLATE Chinese_PRC_90_CI_AI

------解决方案--------------------
SELECT  wait_type 
INTO #tb 
FROM    sys.dm_os_wait_stats
WHERE   [wait_type] = 'MISCELLANEOUS'
--2
SELECT name ,[collation] FROM [tempdb].sys.[syscolumns] AS s WHERE id=OBJECT_ID('tempdb..#tb')


SELECT DISTINCT wait_type FROM #tb
ORDER BY wait_type COLLATE Chinese_PRC_CI_AS
--1
------解决方案--------------------
引用:
@版主,插问您个另外的问题哦,下面的代码是SQL2008的语法,如果在2005上要显示设置怎么弄?
ALTER TABLE dbo.ConsumeInfo SET (LOCK_ESCALATION = TABLE)
锁升级问题,上个月将数据临时转到2005上时候遇到这问题,虽然说SQLServer默认锁升级是TABLE,但是如何如何显示设置啊,如果要设置为其他的还真不知道,2005上
Thanks!


sql server 2005好像没有办法设置这个参数。
------解决方案--------------------
引用:
今天试了试SQL Server 2005 Chinese_PRC_CI_AS 排序规则环境下的状况,不会存在重复值

select count(wait_type) from sys.dm_os_wait_stats
select count(distinct wait_type) from sys.dm_os_wait_stats
-- 都一样 = 202
select wait_type COLLATE Chinese_PRC_90_CI_AI,count(wait_type) as cnt from sys.dm_os_wait_stats
group by wait_type COLLATE Chinese_PRC_90_CI_AI
having count(wait_type)>1
select wait_type ,count(wait_type) as cnt from sys.dm_os_wait_stats
group by wait_type
having count(wait_type)>1
-- 一样,没有重复的
select count(wait_type) from sys.dm_os_wait_stats where wait_type = 'MISCELLANEOUS'
-- 这个值也没有重复

sys.dm_os_wait_stats是一个系统视图,不同版本中其所调用的系统基表是不一样的

再回到SQL Server 2008 R2  Chinese_PRC_CI_AS 的环境下,居然