标签: 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
查看次数

为什么死锁图上有无受害者条目?

我正在尝试学习如何分析SQL Server 2008 的死锁图,并且我发现了很多带有空<victim-list>节点的条目。我不明白这些条目代表什么:如果没有受害者,我如何识别导致死锁的等待资源?这些条目是什么意思?

这是我看到的条目的一个快速示例:

<deadlock-list>
 <deadlock>
  <victim-list />
  <process-list>
   <process id="processd2b6508" taskpriority="0" logused="10000" waittime="31" schedulerid="63" kpid="9104" status="suspended" spid="69" sbid="0" ecid="184" priority="0" trancount="0" lastbatchstarted="2012-07-30T01:10:45.550" lastbatchcompleted="2012-07-30T01:10:45.550" clientapp=".Net SqlClient Data Provider" hostname="XXXXXXX" hostpid="3648" isolationlevel="read committed (2)" xactid="30461033" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="" line="1" sqlhandle="0x020000002340c50225c17d0eec9bf7c51129348edffd1c70" /> 
     <!--About 2 more frame tags... -->
    </executionStack>
    <inputbuf /> 
   </process>
   <!-- 3 or so more process tags... -->
  </process-list>
  <resource-list>
   <exchangeEvent id="Pipeb005eeba0" WaitType="e_waitPipeNewRow" nodeId="7">
    <owner-list>
     <owner id="processd23fdc8" /> 
    </owner-list>
    <waiter-list>
     <waiter …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock sql-server-2008-r2

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

SQL Server 2012 将 [括号] 放在表名和列名周围

当您将 Columns 文件夹拖到编辑器窗口时,将添加不带括号的完整列列表。如果您单独拖动列,则它们具有括号。

有没有办法把它关掉?我在选项中找不到任何东西,而且它们真的很让人分心。

sql-server ssms t-sql configuration sql-server-2012

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

在 SQL Server 2012 上运行大量 SQL 查询时,系统磁盘空间不足

我对 SQL Server 2012 还很陌生,如果有人可以提供帮助,我将不胜感激。我已将大型数据库的副本恢复到 SQL Server 2012,并尝试对其运行一些简单的查询。

我正在尝试对数据库136898115行表运行 SELECT 查询。这个SELECT查询只有一个简单的WHERE子句。每次运行这个查询都会失败,因为系统盘(安装Windows的分区- C:\)空间不足(这个分区只有6GB可用空间),我不明白为什么。我将 tempdb 定义为位于不同驱动器上,该驱动器具有超过 14 TB 的可用空间。当然,我的数据库也位于不同的驱动器上。

是什么让我的系统分区空间不足?是页面文件吗?

sql-server tempdb

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

更多的 CPU 内核与更快的磁盘

我是一家小公司的一员,所以像往常一样负责许多不同的角色。最新的是为我们的 .NET Web 应用程序采购一个专用的 SQL Server 盒。我们在双 Xeon E5-2620(六核)2.00 GHz CPU 配置(共 12 核)上被引用,具有 32 GB 的 RAM。这使我们的磁盘阵列预算有限,该磁盘阵列基本上由 RAID 1 配置中的两个 2.5" SAS 300 GB 驱动器 (15k RPM) 组成。

我知道磁盘设置对于 SQL Server 来说是次优的,我真的很想推动 RAID 10,这样我们就可以将数据库、日志文件和 tempdb 放在他们自己的驱动器上。为了使这与我们的预算兼容,我应该考虑减少 CPU 内核的数量吗?或者我会得到更好的银行来保持核心并使用更少的驱动器,也许在双 RAID 1 设置中使用 4 个?

这是一些额外的统计数据

  • SQL Server 数据库倾向于大量读取到写入,可能分别为 80% 和 20%。当前的数据库大小目前约为10 GB 26 GB,以每月 250 MB 的速度增长。

  • 目前在与 Web 服务器共享的单个四核 Xeon 机器上运行 SQL Server 2008 R2 Standard(RAID 1 中的 12 GB Ram、2 x 10k 300GB SAS 驱动器),希望迁移到 SQL Server …

performance sql-server configuration hardware

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

限制用户只能复制备份

我希望在我的生产环境中部署日志传送。这意味着我将不得不管理备份链,这些备份链可能会被人们进行备份以刷新开发环境而中断。如果我遇到故障并想使用日志备份恢复到某个时间点,我还需要开发人员进行备份。

如果开发人员仅使用 COPY ONLY 备份,则不会发生这种情况。所以我的问题是:有没有办法限制用户只能执行 COPY ONLY 备份?

security sql-server backup

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

为什么 UPDLOCK 会导致 SELECT 挂起(锁定)?

我在 SQL SERVER 中有一个锁定整个表的选择。

这是设置脚本(确保您没有覆盖任何内容)

USE [master]
GO

IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB')
DROP DATABASE LockingTestDB
GO

CREATE DATABASE LockingTestDB
GO

USE [LockingTestDB]
GO
IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable')
  DROP TABLE LockingTestTable
GO

CREATE TABLE LockingTestTable (
  Id int IDENTITY(1, 1),
  Name varchar(100),
  PRIMARY KEY CLUSTERED (Id)
)
GO

INSERT INTO LockingTestTable(Name) VALUES ('1')
INSERT INTO LockingTestTable(Name) VALUES ('2')
GO
Run Code Online (Sandbox Code Playgroud)

打开一个新的查询窗口并运行以下事务(其中有一个等待):

USE [LockingTestDB]
GO

BEGIN TRANSACTION
  SELECT * FROM LockingTestTable …
Run Code Online (Sandbox Code Playgroud)

sql-server locking blocking

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

如何实现基于集合的算法/UDF

我有一个算法,我需要针对具有 800K 行和 38 列的表中的每一行运行该算法。该算法在 VBA 中实现,并使用来自某些列的值来处理其他列进行大量数学运算。

我目前正在使用 Excel (ADO) 来查询 SQL 并使用带有客户端游标的 VBA 通过循环遍历每一行来应用算法。它可以工作,但需要 7 个小时才能运行。

VBA 代码非常复杂,将其重新编码为 T-SQL 需要做很多工作。

我已经阅读了 CLR 集成和 UDF 作为可能的路由。我还考虑将 VBA 代码放在 SSIS 脚本任务中以更接近数据库,但我确信存在解决此类性能问题的专家方法。

理想情况下,我能够以基于并行集的方式对尽可能多的行(全部?)运行算法。

任何帮助都很大程度上取决于如何在此类问题上获得最佳性能。

- 编辑

感谢您的评论,我使用的是 MS SQL 2014 Enterprise,这里有更多详细信息:

该算法在时间序列数据中找到特征模式。算法中的函数执行多项式平滑、窗口化,并根据输入标准找到感兴趣的区域,返回十几个值和一些布尔结果。

我的问题更多是关于方法论而不是实际算法:如果我想一次在多行上实现并行计算,我的选择是什么。

我看到建议重新编码到 T-SQL 中,这是很多工作但可能的,但是算法开发人员在 VBA 中工作并且经常更改,因此我需要与 T-SQL 版本保持同步并重新验证每个改变。

T-SQL 是实现基于集合的函数的唯一方法吗?

sql-server ssis functions sql-server-2014

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

SQL Server 2016 与 2012 插入性能对比

  • 我在同一台服务器上有两个 SQL Server 实例:

    • Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 标准版(64 位)
    • Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) 企业版(64 位)
  • sp_configure 结果在两个实例上相同(新的 2016 选项除外)。

  • 我在同一个磁盘文件夹上的两个实例上创建了新数据库。自动生长参数相同。

  • 自动创建和自动更新统计选项被关闭。

  • 然后我做了一个测试,将 10000 次插入到一个堆中:

set nocount on
go

create table dbo.TestInsert ( i int not null, s varchar(50) not null )

declare @d1 datetime, @d2 datetime, @i int
set @d1 = getdate() 
set @i = 1

while @i <= 10000
begin
  insert into dbo.TestInsert ( i, s ) select @i, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 sql-server-2016

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

有没有一种优雅的方式将查询结果直接发送到物理打印机?

我有一个奇怪的要求,要安排报告并将其打印到打印机

报告本身非常简单,可以放在一个页面上。我可以将它打印到 txt 中,这样就可以了(尽管我愿意接受关于更好产品的建议)。

这是代码。有用。但我不喜欢。具体来说,我想取消嵌套的@bcp 和@SQL。

问题:有没有更优雅的方法来做到这一点?

declare @filepath varchar(255),
@filename varchar(255),
@filetype varchar(255),
@sql nvarchar(max),
@coverpage_text nvarchar(max)

set @filepath = 'C:\users\jmay\documents\'
SET @filename = 'TestFile'
set @filetype = '.txt'

--output to txt
set @sql = N'declare @bcp varchar(4000)
set @bcp = ''bcp " select * from test_data " queryout ' 
+ @filepath +  @filename + @filetype + ' -t " - " -c -T -d DBA''
print @bcp

EXECUTE master.dbo.xp_cmdshell @BCP'

print @sql
 exec sp_executesql @sql …
Run Code Online (Sandbox Code Playgroud)

sql-server

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