SQL Server Management Studio 中的报告按一分钟显示系统 CPU 利用率。有没有办法指定间隔 - 也许是 10 秒?
AngryHacker's questions
我假设 SSMS 中的工具箱窗口用于存储代码示例。所以我可以在编辑器中突出显示代码并将其拖到工具箱窗口中。
但是,如果我想使用代码示例并将其拖回编辑器(或双击它),我不能。工具箱中的所有条目都是灰色的。当我拖动一个条目时,它会将鼠标光标变成一个停止标志。
我需要做什么才能启用此功能?
通过在编辑器中突出显示一些代码,然后将其拖到 Samples 下的区域,我得到了这两个条目。首先,它显示为您拖动的实际文本。但是您可以右键单击,选择重命名并给它一个友好的名称。
附加信息:
使用 SSMS v17.9.1 和 SQL Prompt 8 中安装的唯一加载项。
唯一可行的解决方法是单击条目 Ctrl+C,然后将其粘贴到编辑器中。
要实际显示维护计划任务,您必须右键单击并选择全部显示。
我想找到两组坐标之间的距离。首先我使用内置函数:
declare @lat1 real = 33.1, @lon1 real =-117.1, @lat1 real = 39.6, @lon1 real =-98.7
declare @source geography = geography::Point(@lat1, @long1, 4326);
declare @target geography = geography::Point(@lat2, @long2, 4326);
select @source.STDistance(@target)
现在我使用手动计算来做同样的事情:
-- Kilometers to Miles: 0.621371, Earth Radius: 6378.137
select 0.621371 * 6378.137 * ACOS(ROUND(
(SIN(PI() * @lat2 /180) * SIN(PI() * @lat1/180))
+ (COS(PI() * @lat2 /180) * COS(PI() * @lat1/180) * COS(PI() * @lon1/180 - PI() * @lon2 /180)), 12))
在我对 SQL Server 2014 的测试中,手动功能比内置功能快 4 倍左右。这是正常的还是我错过了一些基本的东西?
我们的 IT 在包含其他 VM 的大型 VMWare 盒子上将 SQL Server 设置为 VM。CPU 设置为共享。因此,任何可能需要多个 CPU 的查询所花费的时间都比我将其限制为单个 CPU 的时间长 30 倍。例子:
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
对比
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
OPTION (MAXDOP 1) ------------- Force it to run on a single CPU
第一个示例使用并行性,大约需要 30 秒左右。第二个强制使用单个 CPU 并花费 20 毫秒。
注意:运行单 CPU 查询后,我返回运行多 CPU 查询,时间和计划是相同的 - 所以我认为问题与“冷缓存”与“热缓存”无关
所以我的理论是,因为第一个查询使用多个 CPU,它必须等到所有有问题的 CPU 都空闲,因此它只是等待。
所以我的问题。SQL Server VM 应该有专用 CPU 还是共享 CPU 是正常的?
考虑下面的查询。唯一的区别是返回 1000 与 2000 行。
SELECT TOP 1000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
对比
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
但是,1000 行会在一秒钟内返回,而 2000 行的查询需要更长的时间。
第一个查询的查询计划相当简单:
仅使用 1k 行会更强制并行化吗?
PS 该表包含超过 600 万条记录,并索引了 TimeStamp 列。
- 转到对象资源管理器中的随机表
- 将其扩展到索引
- 右键单击索引 - 大约需要10 秒才能出现
如果我尝试DROP & CREATE INDEX
从上下文菜单中创建脚本,则需要类似的时间。
我查看了 Profiler 跟踪,它有大约 4 页的大量重复查询。如果我查看任务管理器的性能/以太网选项卡,我发现它以 800kb-1mb 的速率提供信息,并以大约 200kb 左右的速度发送信息。
这是一个错误吗?特征?我错过了一些简单的设置吗?
- SSMS 版本:13.0.15900.1。
- 将 SSMS 更新到 13.0.16000.28,但没有任何效果。
- SQL Server 版本:2016 年累积更新 2。
- 我安装了 SQL Prompt 7。卸载了它,但没有任何改变。
SELECT COUNT(*) FROM sys.indexes;
1979 年回归。SELECT COUNT(*) FROM sys.partitions;
1973 年回归。
我有自己的盒子,所以没有争议。另外,这个盒子是我用过的最快、规格最好的盒子。除了这个特定的操作之外,一切都很好。
我在 SQL Server 框本地有一个应用程序(Windows 服务)。它在返回大量数据的 SQL Server 框上调用存储过程,从而导致 ASYNC_NETWORK_IO 等待。
来自的数据库连接是共享内存类型(我仔细检查了完整性)。为什么共享内存连接上会有 ASYNC_NETWORK_IO 等待类型?
我认为 ASYNC_NETWORK_IO 与网络延迟有关?
在查看需要很长时间执行的存储过程列表时,其中一个会导致最多的等待。但是,大部分等待(81%)是 ASYNC_NETWORK_IO,我知道原因:存储过程传输大约 400 MB 的信息。
在文档中,它指出 ASYNC_NETWORK_IO 的原因是客户端无法跟上数据洪流,这可能是真的。我不确定如何让客户端跟上,因为它所做的只是通过 ADO.NET 调用存储过程,然后只处理数据集。
因此,鉴于此信息,我是否应该担心此过程的 ASYNC_NETWORK_IO 等待类型?它实际上对服务器性能有影响吗?
附加信息:
- 我使用的是 SQL Server 2005 的服务包 2。
- 客户端应用程序与 SQL Server 在同一个盒子上(我知道,我知道......但我对此无能为力)。
据我所知,低于 95% 的过程缓存命中率是一个问题。在我的盒子里,数值在 85% 到 95% 之间徘徊。
我该如何解决这个问题?服务器似乎有足够的内存,所以这应该不是问题。还能是什么?
我在我的应用程序中启动了以下命令:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
当我运行“sp_who2 active”时,我得到 Status=SUSPENDED 和 Command=DELETE
注意:从 StackOverflow 移出。
在我的应用程序的最后一个版本中,我添加了一个命令,告诉它在有内容到达 Service Broker 队列时等待:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
DBA 告诉我,自添加以来,日志大小已经达到顶峰。这是正确的吗?还是我应该去别处看看?
我有一个情况,多个客户端应用程序通过 Service Broker 发送消息(利用存储的过程)。这些消息由另一个客户端应用程序获取,然后进行处理。获取消息的方式是应用发出以下 SQL 语句(伪代码):
LOOP {
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM SB_ReceiveQ)
ProcessMessage
}
所以基本上代码只是阻塞,直到收到消息。这一切都很好。
我的问题是关于发出WAITFOR (RECEIVE...
命令的含义,该命令基本上永远挂在某些基于服务代理的资源上。我应该知道与此模式相关的任何性能问题吗?
作为参考,这是 SQL Server 2005。
使用 SQL Server 2005,您可以查看任务管理器,并且至少可以粗略地查看分配给 SQL Server 的内存量。
在 SQL Server 2008 中,工作集或提交大小从未真正超过 500 MB,即使 SQLServer:Memory Manager/Total Server Memory (KB) 性能计数器状态为 16,732,760。
是否有设置在任务管理器中实际显示服务器内存?或者是因为他们改变了 SQL Server 中内存的使用方式
我在(int)Inventory_Break
上分区了表。IR_ID
我还在表上创建了一个非聚集索引IR_ID
。
当我运行以下命令时:
SELECT *
FROM dbo.INVENTORY_BREAK
WHERE IR_ID IN ( 100, 101, 102 )
我得到以下执行计划:
它声明了表扫描 (HEAP)。不太清楚它在分区表的上下文中意味着什么。我也没有看到它使用任何类型的索引。然而,它必须,因为查询返回相当快(例如,表有 600 万行)。
所以,我的问题是:
- 表扫描 (HEAP) 对分区表意味着什么?
- 它是否确实使用了索引,也许是在幕后?
- 我需要做些什么来提高效率吗?
我正在根据不是主键的列对表进行分区?我今天阅读了一些关于分区列是否必须是主键的一部分的相互矛盾的信息。我的直觉说不,但我不是 100% 确定。那么问题...
- 分区列必须是主列的一部分吗?是推荐一种方式还是另一种方式?
- 我是否必须为分区键创建索引,还是 DBMS 自己自动创建?
想象一下以下假设的数据库结构。基本上它是一个自上而下的结构(国家有订单,订单有 OrderLines,OrderLine 有 ShipLines,等等)。
我想按 CountryID 对我的 SQL Server 2008 数据库进行分区。如您所见,CountryID 仅在前 2 个表中(例如 amCountries 和 amOrders)。鉴于(据我所知)分区是在表级别完成的,我是否需要将 CountryID 添加到其余表才能对它们进行分区?或者在 SQL Server 中是否有某种类型的级联可以让我跳过将 CountryID 添加到所有内容?
目前,我有一个 SQL 2005 Standard 框。我想将其就地升级到 SQL 2012 Enterprise。当我说到位时,我的意思是类似于 Office 2010 的安装,例如,它删除了旧的 (Office 2007) 版本,将自身绑定到曾经由其前身持有的扩展,并保留所有设置。
这可能吗?
如果不是,应该是什么程序?到目前为止,我得到了这个。
- 备份数据库
- 记下所有设置。
- 卸载 SQL 2005。
- 安装 SQL 2012 企业版。
- 恢复设置
- 恢复数据库。
我想将所有索引移动到单独的硬盘驱动器。为此,我创建了一个新文件组,然后向其中添加了一个新文件(例如alter database foo add file(...) to FileGroup
)。
现在我想将所有索引移动到这个新文件组。事实证明,我不能用来ALTER INDEX
在文件组之间移动索引。而且我也不能移动 PK 或唯一索引,以免我想移动表本身(我没有),所以这些都出来了。所以,至少,我想移动其余的索引。
我正在努力寻找一种将所有符合条件的索引从一个文件组移动到另一个文件组的方法。有没有合理的自动化方式来做到这一点?
我有一个相当大的事务数据库 (100GB),有很多用户。数据库访问仅通过大量使用临时表、表变量、游标和其他有趣事物的存储过程。
我正在一个新盒子上试用它以提高性能。新盒子有 5 个独立的物理硬盘。我正在努力想出一个最佳设置(主要是无知,我通常是 ac# dev)。到目前为止,我得到以下信息:
Drive C: OS, SQL install, TempDB log
Drive D: Database data
Drive E: Database log
Drive F: TempDB data
Drive G: Databases indexes
我走的路对吗?有什么明显的错误吗?