我遇到了和这哥们发的帖子一样的问题: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
------解决方案--------------------
sql server 2005好像没有办法设置这个参数。
------解决方案--------------------