标签: sql-server

SQL 代理 powershell 上下文参考

在我的新工作中,我们在每台服务器上都有多个命名实例。例如

  • 服务器 1\开发
  • Server1\DevIntegrated
  • 服务器 1\QA

我在工作中有一个 SQL PowerShell 脚本,它调用操作系统,调用Foo.exe但需要传递命令行参数(连接字符串)。每个实例上都将存在一个 SQL 代理作业,带有 PowerShell 类型的步骤,需要知道当前上下文是什么。即此执行在 DevIntegrated 上开始。

我不想让每个脚本都以...开头

$thisInstance = "Dev"
Run Code Online (Sandbox Code Playgroud)

...特别是因为当我们在接下来的几个月中迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。

如果我启动 SQLPS,我可以通过切片和切块 Get-Location 的结果或运行来确定我的实例

(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Run Code Online (Sandbox Code Playgroud)

当 SQL 代理启动 PowerShell 类型的作业时,它会在 C:\windows\system32 中启动,并且Get-Location路由不起作用,因为它不在 SQLSERVER 上下文中。我可以切换到该上下文,但我将处于 SQL Server 的“根”,并且不知道我应该在哪个实例中。Invoke-Sqlcmd出于相同的原因,使用该路由也不起作用(从技术上讲,它在那里超时不是默认实例)

据我所知,我已经列举了我可以进入工作日志的所有基本“事情”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated

Get-Process似乎我可以使用它和一些尝试通过击中实例和匹配 spid 来拼凑东西的巫术,但这听起来像是来自地狱的血腥黑客。一定有一些基本的东西我错过了,有人能解释一下吗?

研究 PowerShell 的替代方案

我曾调查过使用其他工作类型,但没有得到令人满意的解决方案。研究表明,SQL 代理下列出的 PowerShell 是 SQLPS,通过右键单击代理启动它的实例会自动将我放到正确的位置。只有当我将交互式代码粘贴到作业步骤中时,我才知道前面提到的差异。

操作系统的作业类型使我处于相同的状态,因为我找不到确定哪个实例将我放入命令外壳的方法。当然,我可以使用 sqlcmd 并获取 的值,@@servername …

sql-server-2005 sql-server-2008 sql-server powershell

14
推荐指数
2
解决办法
2314
查看次数

在 SSMS 中将结果另存为 CSV *with* 标题

使用 SQL Server 2008 R2,当我将结果另存为 CSV 时,没有标题。我可以通过使用 "Copy with Headers" 复制和粘贴来解决这个问题,或者只是获取标题并将它们粘贴到 CSV 等中,但是有没有更好的方法来做到这一点?

sql-server ssms sql-server-2008-r2 csv

14
推荐指数
2
解决办法
4万
查看次数

SentryOne 计划浏览器是否有效?

SentryOne Plan Explorer是否像宣传的那样工作,是否合法?有什么问题或需要担心的事情吗?

与 SSMS 对估计执行计划视图的噩梦相比,它似乎以颜色显示了热路径。

我担心的是 - 它是否恶意或以其他方式修改任何数据?

编辑:我刚刚听说过它,以前从未听说过这家公司。

performance sql-server optimization execution-plan query-performance

14
推荐指数
4
解决办法
2493
查看次数

有哪些工具可以为 SQL Server 生成测试数据?

从我的另一个问题中可以看出,生成测试数据是我现在的主题。

在这一点上,我仍在手动生成我的测试数据。但是,此过程始终会生成少量数据(通常为 5-10 行),因为它是一个手动过程。

是否有任何工具可以自动执行此过程?特别是,我希望能够生成 100 万行以上。

performance sql-server testing performance-testing

14
推荐指数
3
解决办法
9191
查看次数

优化 BLOB 数据的 BCP 性能

我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。

BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建。

由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。

我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。

可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。

performance sql-server bcp

14
推荐指数
1
解决办法
5407
查看次数

为什么 SSMS 在表格顶部而不是底部插入新行?

每当我在 SQL Server Management Studio 2008(数据库是 SQL Server 2005)的表中手动插入一行时,我的新行就会出现在列表的顶部而不是底部。我正在使用身份列,这会导致诸如

id  row
42 first row
1 second row
2 third row
Run Code Online (Sandbox Code Playgroud)

当获取行且未明确排序时。当为 Web 应用提取行并更改TOP 1查询返回的内容时,这会导致不同的外观。

我知道我可以order by,但为什么会发生这种情况?我的大部分数据都是通过 Web 应用程序插入的,从该应用程序插入的所有数据都按照先进先出的顺序进行,例如,最新的插入位于底部,因此 ID 都在一行中。服务器或 Management Studio 中是否有某些设置会导致这种不正确的排序?

sql-server ssms identity

14
推荐指数
2
解决办法
1万
查看次数

测试存储过程的可伸缩性

我有一个电子邮件应用程序,它将被要求在每个页面加载时将给定用户的新消息数量传送到 UI。我在数据库级别上测试了一些变化,但所有内容都由存储的 proc 调用抽象。

我试图猛击数据库以查看断点(每秒请求数)是什么。

简而言之,我有一个表,比如这个 userId、newMsgCount,在 userId 上有一个聚集索引。SQL 应该能够每秒处理成百上千个这样的响应。我认为落后者是我的 .NET 应用程序。

我怎样才能使这个测试成为一个很好的测试来实现基于 SQL 性能的测试结果?

有没有一个工具,我可以给它一个存储的过程名称和参数,以便它打我的数据库?

我想看看数据库是否可以返回分钟。每秒 250 个响应。

performance sql-server testing scalability performance-testing

14
推荐指数
2
解决办法
4384
查看次数

如何确定 SQL 数据库文件中的已用/可用空间?

我通常使用以下方法来确定数据库的每个文件中的可用/已用空间:

Select *, fileproperty(name, 'SpaceUsed') as Used
From dbo.sysfiles
Run Code Online (Sandbox Code Playgroud)

这将返回页面中的总空间和已用空间,然后乘以 8 得到 KB(或除以 128.0 得到 MB)。

我找到了另一个脚本,而不是使用DBCC showfilestats并dbcc sqlperf(logspace)返回 TotalExtents 和 UsedExtents,然后可以乘以 64 得到 KB(或除以 16.0 得到 MB)。

忽略额外的列,这两个是否总是为空闲/总空间提供相同的值?怎么样sp_spaceused?

它们的准确性是否都取决于最近的 DBCC UPDATEUSAGE?

是否有另一种更好的方法来确定已用/可用空间?(我需要这个脚本在 SQL 2000、2005 和 2008 服务器上工作)

部分相关:你能有一个部分分配的范围吗?(例如,仅分配了一个范围内的 8 个页面中的 3 个)

sql-server

14
推荐指数
1
解决办法
17万
查看次数

正在恢复数据库“MyDb”。等待恢复完成

我得到了这样的错误:

正在恢复数据库“MyDb”。等待恢复完成。

那时我做了一个危急的手术。

造成这种情况的原因是什么?以及如何避免?

sql-server sql-server-2008-r2 recovery

14
推荐指数
1
解决办法
4万
查看次数

SQL Server - 临时表与物理表

我的工作场所正在进行一项运动,不再使用 #temp 表,而是使用带有 SPID 的永久物理表。每当人们以前将 INSERTed INTO #temp 表时,现在INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)都需要一个 - 以及DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPID在例如存储过程开头的一堆语句。此外,不用说,在使用这些“用于存储临时数据的永久表”的任何地方,都必须小心包含WHERE SPID = @@SPID.

转向这种做法背后的逻辑是,它将提高运行查询的服务器的整体性能(通过减少 tempdb 中的 I/O 和争用)。由于多种原因,我并不热衷于这种方法 - 它很丑陋,有潜在危险,并且似乎很可能会损害使用新方案的那些查询的性能。

有没有人有任何使用这种或类似方法来消除#temp 表的经验?

performance sql-server

14
推荐指数
2
解决办法
1万
查看次数