大数据查询问题,望各位大大们帮忙解决!

鬼五拾柒 2015-08-15 02:42:59
一千多台机器需要频繁查询一条数据是否存在,现在才五六十台电脑频繁查询就出现服务器 sqlserver.exe 占用CPU百分之九十五以上。希望各位帮帮忙
...全文
290 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-08-18
  • 打赏
  • 举报
回复
还有CPU占用不要光考虑SQL执行啊。你频繁查询几乎是五六十会话一直在轮流切换,会话调度的消耗也很可观了;还有打开/关闭连接的消耗。
一千客户端你要考虑更换方案了,可以在服务器上做个定时程序,定时查询,如果结果有变化通过TCP广播发送给客户端。这比不停查询相同的结果要有效率多了。
鬼五拾柒 2015-08-18
  • 打赏
  • 举报
回复
引用 11 楼 Tiger_Zhao 的回复:
索引已经是最高效率了(纯内存查找)。 其它可能的影响有: A)记录数超多。 B)该表频繁更新,导致索引不停变化,以及检索时被其它会话锁定要等待。 如果你业务允许,可以在查询中加个 WITH(NOLOCK)。
SELECT TOP 10 [session_id], [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名', [blocking_session_id] AS '正在阻塞其他会话的会话ID', der.[wait_type] AS '等待资源类型', [wait_time] AS '等待时间', [wait_resource] AS '等待的资源', [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数', [reads] AS '物理读次数', [writes] AS '写次数', [logical_reads] AS '逻辑读次数', [row_count] AS '返回结果行数' FROM sys.[dm_exec_requests] AS der INNER JOIN [sys].[dm_os_wait_stats] AS dows ON der.[wait_type]=[dows].[wait_type] CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 ORDER BY [cpu_time] DESC 根据这个查询出来没有返回结果啊
ChinaITOldMan 2015-08-18
  • 打赏
  • 举报
回复
引用 8 楼 Tiger_Zhao 的回复:
给(列名1,列名2)建个复合索引即可。
是的,需要建立复合索引
Tiger_Zhao 2015-08-17
  • 打赏
  • 举报
回复
给(列名1,列名2)建个复合索引即可。
Tiger_Zhao 2015-08-17
  • 打赏
  • 举报
回复
索引已经是最高效率了(纯内存查找)。
其它可能的影响有:
A)记录数超多。
B)该表频繁更新,导致索引不停变化,以及检索时被其它会话锁定要等待。
如果你业务允许,可以在查询中加个 WITH(NOLOCK)。
鬼五拾柒 2015-08-17
  • 打赏
  • 举报
回复
引用 8 楼 Tiger_Zhao 的回复:
给(列名1,列名2)建个复合索引即可。
感谢,有了不错的效果,还能继续优化
鬼五拾柒 2015-08-17
  • 打赏
  • 举报
回复
引用 7 楼 luckyrandom 的回复:
就是个Col1+Col2的复合索引,若单是这个SQL指令 将低可选择性的COL放在前面 提问都懒得将信息提供完整
不好意思,改了还是没有明显的效果
Q315054403 2015-08-15
  • 打赏
  • 举报
回复
就是个Col1+Col2的复合索引,若单是这个SQL指令 将低可选择性的COL放在前面 提问都懒得将信息提供完整
鬼五拾柒 2015-08-15
  • 打赏
  • 举报
回复
引用 4 楼 xiaoxiangqing 的回复:
服务器配置要跟上,其次就是语句要优化。
服务器 windows server 2008 r2 32G 内存 2个Intel Xeon E5-2609
鬼五拾柒 2015-08-15
  • 打赏
  • 举报
回复
引用 3 楼 ap0405140 的回复:
请问"查询一条数据是否存在"的具体语句是什么?
select 列名1,列名2 from 表名 where 列名1=‘ ’ and 列名2=‘ ’ 就这句。 现在我把客户端关了,CPU马上降下来了
xiaoxiangqing 2015-08-15
  • 打赏
  • 举报
回复
服务器配置要跟上,其次就是语句要优化。
唐诗三百首 2015-08-15
  • 打赏
  • 举报
回复
请问"查询一条数据是否存在"的具体语句是什么?
鬼五拾柒 2015-08-15
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
占用CPU 95%一般不是因为"查询一条数据是否存在"造成的. 请用以下查询获取CPU top 50的语句,逐个优化.

SELECT TOP 50 
        qs.total_worker_time/qs.execution_count as [Avg CPU Time],qs.total_worker_time/1000.0/60.0/60.0 'Avg CPU Time(Minute)',qs.execution_count,
        SUBSTRING(qt.text,qs.statement_start_offset/2, 
			(case when qs.statement_end_offset = -1 
			then len(convert(nvarchar(max), qt.text)) * 2 
			else qs.statement_end_offset end -qs.statement_start_offset)/2) 
		as query_text,
		qt.dbid, dbname=db_name(qt.dbid),
		qt.objectid 
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY  [Avg CPU Time] desc
这个我查过了,都是一些存储过程,这些存储过程都是另外一套客户端需要用到的,即使这些存储过程没有使用也会出现这种情况,这个查询结果也会返回 个别查询数据是否存在
唐诗三百首 2015-08-15
  • 打赏
  • 举报
回复
占用CPU 95%一般不是因为"查询一条数据是否存在"造成的. 请用以下查询获取CPU top 50的语句,逐个优化.

SELECT TOP 50 
        qs.total_worker_time/qs.execution_count as [Avg CPU Time],qs.total_worker_time/1000.0/60.0/60.0 'Avg CPU Time(Minute)',qs.execution_count,
        SUBSTRING(qt.text,qs.statement_start_offset/2, 
			(case when qs.statement_end_offset = -1 
			then len(convert(nvarchar(max), qt.text)) * 2 
			else qs.statement_end_offset end -qs.statement_start_offset)/2) 
		as query_text,
		qt.dbid, dbname=db_name(qt.dbid),
		qt.objectid 
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY  [Avg CPU Time] desc

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧