我正在使用 SQL Server 2008 R2
我们有一个存储过程,它在运行时会导致 100% 的 CPU 使用率。所述 SP 每月运行一次,并执行大约 5 分钟的繁重计算。
由于 SP 每月运行一次,我们并不特别关心是否需要 30 分钟或更长时间才能完成该过程,但是占用所有可用的 CPU 资源是有问题的。我们想限制此特定存储过程的 CPU 使用率。
SQL Server 中有这样的选项吗?
运行 SP_Blitz 表明我的驱动器的读/写性能很慢。进一步阅读,我最终登陆了这个查询来查看我的驱动器上发生的 IO 的实际统计数据:
SELECT a.io_stall, a.io_stall_read_ms, a.io_stall_write_ms, a.num_of_reads,
a.num_of_writes,
--a.sample_ms, a.num_of_bytes_read, a.num_of_bytes_written, a.io_stall_write_ms,
( ( a.size_on_disk_bytes / 1024 ) / 1024.0 ) AS size_on_disk_mb,
a.database_id,
db_name(a.database_id) AS dbname,
b.name, a.file_id,
db_file_type = CASE
WHEN a.file_id = 2 THEN 'Log'
ELSE 'Data'
END,
UPPER(SUBSTRING(b.physical_name, 1, 2)) AS disk_location
FROM sys.dm_io_virtual_file_stats (NULL, NULL) a
JOIN sys.master_files b ON a.file_id = b.file_id
AND a.database_id = b.database_id
ORDER BY a.io_stall DESC
Run Code Online (Sandbox Code Playgroud)
*Row #1 是数据库 mdf,#2 是事务日志
根据结果,我的数据库实际上应该无法使用,但事实并非如此。我们正在运行一个相当大的 OLTP 数据库,在任何给定的时间内都会发生数百个事务,但没有任何性能问题的迹象(至少我们没有从客户那里听到)。
我真的应该担心上述统计数据吗?是否存在我需要解决的实际问题,或者仅仅是查询对我们的案例不正确的情况? …
我很难为我的数据库表在自然 PK 和代理 PK 之间进行选择。
该数据库用于 MOBA 游戏的排名系统。如果我走自然路线,这或多或少是我会做的。
玩家表
- PlayerID Int AI NN UQ
- PlayerName Varchar PK
- ServerName Varchar PK
- Registered date, level, hero etc misc columns
Run Code Online (Sandbox Code Playgroud)
排名表
- PlayerName FK references player
- ServerName FK references player
- RankID Int AI NN UQ
- PlayerRank Int NN UQ
Run Code Online (Sandbox Code Playgroud)
问题是,玩家表中的每一行都由一对 PlayerName 和 ServerName 唯一标识。我认为在这种情况下使用代理键并不是很合适,但我想听听关于此的建议。