标签: sql-server-2014

对象 sp_start_job 的执行权限被拒绝

我需要允许用户在没有任何能力启动其他代理的情况下启动特定的代理作业。为此,我创建了以下过程(简化):

ALTER PROCEDURE [dbo].[RunJob]
    @job_name nvarchar(200)
WITH EXECUTE AS 'sysadminaccount'
AS
BEGIN
    --SET NOCOUNT ON;
    BEGIN TRY
        EXEC msdb.dbo.sp_start_job @job_name = @job_name 

        -- Wait for job to finish
        DECLARE @job_history_id AS INT = NULL
        DECLARE @job_result AS INT = NULL

        WHILE 1=1
        BEGIN
            SELECT TOP 1 @job_history_id = activity.job_history_id
            FROM msdb.dbo.sysjobs jobs
            INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
            WHERE jobs.name = @job_name
            ORDER BY activity.start_execution_date DESC

            IF @job_history_id IS NULL
            BEGIN
                WAITFOR DELAY '00:00:01'
                CONTINUE
            END
            ELSE
                BREAK …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-agent sql-server-2014

10
推荐指数
1
解决办法
5万
查看次数

SQL Server Management Studio 2014 备份 - 设置属性设备错误

我最近将我的本地 SQL Server 升级到了 2014 版,它也安装了 SSMS 2014。
当使用 SQL Server Management Studio 2014 创建备份(本地和远程,服务器版本 2008 - 2014)时,我收到以下错误:

要完成此操作,请设置属性 Devices。

在下拉列表中,我选择了磁盘,并且还选择了备份路径。该路径存在于服务器上,我对此路径拥有完全权限。
如果我使用具有相同设置的旧 SQL Server Management Studio 2012,备份工作没有任何问题。
它也适用于 T-SQLBACKUP DATABASE SOMEDATABASE TO DISK = 'D:\SomeDir\SomeDataBase.bak' WITH COMPRESSION

所以这个问题必须与管理工具版本 2014 相关。我在互联网上找到的唯一解决方案是由于缺少路径,这对我来说并非如此。
有没有人经历过和/或解决过这个问题?

编辑:添加屏幕截图(德语用户界面)

备份错误 SSMS 2014

翻译:
- Vollständig:完整
- Datenträger:磁盘

媒体和安全选项不变。仅以主数据库为例,其他所有数据库都会发生。

媒体选项 安全选项

21.07.2015 更新

该问题似乎与我在德语 Windows 和德语 SQL Server 2014 安装上使用英语语言包有关。如果 Windows 显示语言设置为德语,问题就会消失。如果 Windows 显示语言设置为英语,问题会再次出现。

感谢所有贡献。

sql-server ssms sql-server-2014

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

查询计划更改 SQL Server 2014 中的性能更糟

我们最近将我们的服务器从 SQL Server 2008R2 升级到 SQL Server 2014。我们有一个查询在 2008R2 中运行良好,但现在在 2014 年运行速度非常慢并且执行计划很糟糕。

我做了几次测试...

  1. 将 2014 DB 切换回 2008/2012 兼容模式。
  2. 使用分页测试查询。

这两者都导致查询运行与 SQL Server 2008R2 相同且速度快。

为什么 SQL Server 2014 中的计划如此糟糕且查询运行时间如此之长?

估计/实际

此图显示了 2 个查询,一个使用 rownumber 其在 2008R2 中运行的方式,然后第二个是使用分页进行修复。两者都在 2014 年运行,两者都非常不同,但在 2008 年,我们看到的性能与 2014 年使用分页相同。

sql-server execution-plan sql-server-2014

10
推荐指数
1
解决办法
3770
查看次数

In-Memory Table 的性能比基于磁盘的表差

我在 SQL Server 2014 中有一个表,如下所示:

CREATE TABLE dbo.MyTable
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
)
Run Code Online (Sandbox Code Playgroud)

(id1,id2) 是 PK。基本上,id1 是一个标识符,用于对一组结果(id2、col1、col2)进行分组,其 pk 是 id2。

我正在尝试使用内存表来摆脱现有的基于磁盘的表,这是我的瓶颈。

  • 表中的数据写入->读取->删除一次。
  • 每个 id1 值都有几个(数十/数百)数千个 id2。
  • 数据在表中存储的时间很短,例如 20 秒。

对该表执行的查询如下:

-- INSERT (can vary from 10s to 10,000s of records):
INSERT INTO MyTable
  SELECT @fixedValue, id2, col1, col2 FROM AnotherTable

-- READ:
SELECT id2, col1
FROM MyTable INNER JOIN OtherTbl ON MyTable.id2 = OtherTbl.pk
WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014 memory-optimized-tables

10
推荐指数
1
解决办法
4226
查看次数

SQL Server - 为什么更新语句中不允许使用窗口函数?

运行更新语句时,例如下面的语句,我收到一条错误消息,告诉我

窗口函数只能出现在 SELECT 或 ORDER BY 子句中。

UPDATE dbo.Dim_Chart_of_Account
SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey])
Run Code Online (Sandbox Code Playgroud)

我知道这可以使用可更新的 cte 轻松解决,如下所示

 WITH my_cte AS (
     SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag
     FROM Dim_Chart_of_Account
)
UPDATE my_cte
SET [Account_Order] = acc_order_lag
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否有任何原因在更新语句中不允许这样做,我是否应该避免使用可更新的 cte 作为解决方法?

我担心的是在使用带有更新语句的窗口函数时会出现问题,因此我想了解这是一种可接受的方法还是应该避免的方法。

sql-server sql-server-2014

10
推荐指数
1
解决办法
4412
查看次数

SQL Server 2016 高空闲 CPU 和查询速度极慢

我有一个大约 10 天的 WinServer2012R2 和 SQL Server Express 2016 安装用于测试。我是这台机器上唯一的用户。SQL Server 2005 中的 .bak 大约为 250MB 的数据库已恢复,没有任何问题。机器重新启动后,进程“SQL Server NT - 64 位”使用 0% CPU。

几分钟或几小时后,来自“SQL Server NT - 64 位”的 SSMS CPU 使用率的一些简单查询(没有更新/插入!)突然跃升至约 15% 并保持在那里,即使在空闲时也是如此。从那时起,通常需要不到一秒钟的查询突然需要 2 分钟。在实际查询期间,CPU 使用率不会增加。在这种状态下,服务器几乎无法使用。

仅连接 SQL Server Profiler 需要 30 秒以上的时间。除了我自己的查询之外,我只看到来自 SQLServerCEIP / SQLTELEMETRY 的非常少的查询,大约每分钟 3 次。

重新启动 SQL-Server 并不能解决它。CPU 使用率立即回升至约 15%。即使在数小时后 SQL-Server 也不会恢复。只有重新启动整个机器才能解决问题。

由于这是一个“开箱即用”的安装,只有一个小数据库,几乎没有查询,只有我作为用户并且可能没有锁,关于常规 SQL-Server 性能问题的许多文章谈论了很多事情真的不适用这里。这似乎为SQL-服务器专用希望专注于一些内部的任务。

这是一个具有 2GB RAM 和 2GHz 双 Xeon 的虚拟机。我也有 VS2016,它真的很快。没有防病毒软件,甚至没有 Windows Defender。这里已经晚了。明天我将尝试 sp_whoisactive。我真的很想知道 SQL-Server 在那里做什么......在以前的机器上有 1 GB 相同的数据库在 …

performance sql-server sql-server-express sql-server-2014

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

>= 和 > 的基数估计,用于步骤内统计值

我试图了解 SQL Server 如何尝试估计 SQL Server 2014 中的“大于”和“大于等于”where 子句。

我想我确实了解基数估计,例如,如果我这样做

    select * from charge where charge_dt >= '1999-10-13 10:47:38.550'
Run Code Online (Sandbox Code Playgroud)

基数估计是 6672,可以很容易地计算为 32(EQ_ROWS) + 6624(RANGE_ROWS) + 16 (EQ_ROWS) = 6672(下面截图中的直方图)

在此处输入图片说明

但是当我这样做时

    select * from charge where charge_dt >= '1999-10-13 10:48:38.550' 
Run Code Online (Sandbox Code Playgroud)

(将时间增加到 10:48 所以它不是一步)

估计是 4844.13。

那是怎么计算的?

performance sql-server sql-server-2014 cardinality-estimates performance-tuning

10
推荐指数
2
解决办法
538
查看次数

只选择超集

我有两个可以使用以下命令创建的表(以及一个非聚集索引):

CREATE TABLE GroupTable
(
  GroupKey int NOT NULL PRIMARY KEY, 
  RecordCount int NOT NULL,
  GroupScore float NOT NULL
);

CREATE TABLE RecordTable
(
  RecordKey varchar(10) NOT NULL, 
  GroupKey int NOT NULL,
  PRIMARY KEY(RecordKey, GroupKey)
);

CREATE UNIQUE INDEX ixGroupRecord ON RecordTable(GroupKey, RecordKey);
Run Code Online (Sandbox Code Playgroud)

虽然从技术上讲,我的表略有不同,而且我正在加入其他一些表,但这是适合我的情况的代理。

  • 我想选择所有GroupKeys不是另一个GroupKey.
  • 对于给定的超集,我想获取其GroupScore所有子集(包括其自身)的最大值。
  • 在 aGroupKey包含与RecordKeysanother完全相同的实例中GroupKey(s),则只GroupKeys抓取其中一个(哪个无关紧要)。
  • 任何与另一个GroupKey完全相同的也将具有相同的.RecordKeysGroupKey(s)GroupScore
  • 不相关的GroupKeys也可以有相同的分数。

下面是一个例子来说明我在问什么:

CREATE TABLE GroupTable
(
  GroupKey int NOT NULL …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

10
推荐指数
1
解决办法
319
查看次数

无法截断事务日志,log_reuse_wait_desc - AVAILABILITY_REPLICA

今天早上,我被我们的一个数据库上的事务日志已满警报唤醒。这个服务器是一个alwayson 集群,也是一个事务复制订阅者。我检查了 log_reuse_wait_desc,它显示了 logbackup。4 天前有人不小心禁用了 logbackup 作业,我重新启用了日志备份作业,日志被清除了。由于是凌晨 4 点,我想我会在那天早上晚些时候去办公室并缩小日志,因为它已经增长到 400GB。

上午 10 点 - 我在办公室,我在缩小之前检查了日志使用情况,大约是 16%。我很惊讶并检查了 log_reuse_wait_desc,它显示了复制。我很困惑,因为这是一个复制订阅者。然后我们看到 db 为 CDC 启用,并认为这可能是原因,因此禁用 CDC,现在 log_reuse_wait_desc 显示 AVAILABILITY_REPLICA。

与此同时,日志使用量仍在稳步增长,目前为 17%。我检查了alwayson仪表板并检查了发送和重做队列,两者几乎为零。我不确定为什么日志重用显示为 AVAILABILITY_REPLICA 并且无法清除日志。

知道为什么会这样吗?

sql-server transaction-log availability-groups transactional-replication sql-server-2014

10
推荐指数
2
解决办法
8598
查看次数

在 SQL Server 2014 上使用完整扫描更新统计信息使用 100% cpu,在 2008 R2 上为 15%

为什么完全扫描更新统计信息在 SQL Server 2014 上使用 100% 的 CPU,而在 SQL Server 2008 R2 上使用可能 20% 的 CPU,对于相同的表,具有相似的硬件功能?

我一直在寻找MAXDOP其他选项,但真的看不出有什么特别之处。我意识到可能存在可能导致这种情况的设置,但两个数据库的设置非常相似(例如,两个数据库的设置都MAXDOP为 4,两者都有多个内核)。两者都是企业版。

SQL Server 2014 与 SQL Server 2008 R2 中是否有“不同”之处可以解释这一点?我有两个服务器的 90% 内存选项。关于寻找什么的任何想法?

我使用 SQL Server 2008 R2/SP3 和 SQL Server 2014/SP2 在两台服务器上每周运行一次完整 (100%) 扫描的更新统计信息,并且数据库具有相同的结构。在 2008 R2 服务器上,两个非常大的表的更新统计需要几个小时,这是我所期望的,但 CPU 的利用率一直保持在 20% 左右。但是,在 2014 年服务器上,CPU 在大约 40 分钟内达到 100%。2014 服务器上的表要小一些。我通过使用 SQL Monitor 分析菜单看到了这一点。

这是 2014 SQL Server 上 Ola 日志文件的输出,CPU 从大约 2:10 到 2:45 变为 100%:

Date and time: 2017-06-24 02:10:20 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 sql-server-2014

10
推荐指数
1
解决办法
1043
查看次数