标签: sql-server-2014

将资源调控器与 SQL 代理作业一起使用

我正在尝试设置资源调控器,以限制使用 SQL 代理作业运行的进程的 IOPS。分类器函数设置为标识特定登录(使用该登录运行的任何 spid 都应使用分配给它的资源组)。然后我EXECUTE AS LOGIN = 'ResourceGovernerUser'在作业中添加,但我无法让它工作并且它回退到默认池,因为作业是'EXECUTED AS 'ServiceAccount''. 尽管如果我使用 来查看活动进程sp_WhoisActive,登录名会显示为'ResourceGovernerUser'而不是服务帐户。所以我修改了分类器函数以使用服务帐户,然后它就可以工作了。我使用 perfmon 计数器'Disk Read IO/Sec'和对象'Disk Write IO/Sec'下验证了这一点'Resource Pool Stats'

问题是 - 如何让资源调控器使用服务帐户以外的登录名(与代理作业一起使用时)?我确实有一些未经测试的丑陋想法,例如 - 使用 CmdExec 或 PowerShell 代理运行作业。如果有人遇到过类似的情况或有更好的想法,我将不胜感激。谢谢你。

    --Example Setup:
    USE [master]
    GO

    CREATE RESOURCE POOL [SqlJobPool] WITH( 
            min_iops_per_volume=1, 
            max_iops_per_volume=5000); 
    GO

    CREATE WORKLOAD GROUP [IOGroup] 
        USING [SqlJobPool];
    GO

    CREATE FUNCTION [dbo].[fn_LimitedIO]()
    RETURNS SYSNAME WITH SCHEMABINDING
    AS
        BEGIN
            DECLARE @grp SYSNAME;

            IF SUSER_NAME() = …
Run Code Online (Sandbox Code Playgroud)

sql-server resource-governor sql-server-2014

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

从一组值中选择最非默认的值

鉴于以下表格:

CREATE TABLE FeeTestClient (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name VARCHAR(16))
INSERT INTO FeeTestClient (Name)
VALUES ('Test'), ('Test 2'), ('Test 3')

CREATE TABLE FeeTest (FeeId INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ClientId INT, Fee INT, Val VARCHAR(16), Val2 VARCHAR(16))
INSERT INTO FeeTest (ClientId, Fee, Val, Val2)
VALUES (1, 15, 'Default', 'Default'),
       (1, 10, 'Default', 'asdf'),
       (2, 15, 'Default', 'Default'),
       (2, 20, 'Default', 'qwer'),
       (2, 10, 'zxcv', 'asdf'),
       (3, 20, 'Default', 'Default')
Run Code Online (Sandbox Code Playgroud)

我的目标是选择所有FeeTestClient元素,并选择最不默认的费用。在默认费的规则很简单:如果Val2是 …

join sql-server sql-server-2014 coalesce

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

完全相同的查询 - 不同的性能

数据库:SQL Server 12.0.5207

除了过滤条件之一的值外,我有几个查询在所有方面都完全相同。同一张表(不是另一台服务器上的模式副本),因此索引、资源等都是相同的。一切都是完全相同的。

此查询在一秒钟内运行:

SELECT 
         MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE 
       MessagePlatform = 'linux'
Run Code Online (Sandbox Code Playgroud)

此查询在一秒钟内运行:

SELECT 
         MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE 
       MessagePlatform = 'linux'
       AND
       MessageCategory = 'accounting'
Run Code Online (Sandbox Code Playgroud)

此查询在一秒钟内运行:

SELECT 
         MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE 
       MessagePlatform = 'windows'
Run Code Online (Sandbox Code Playgroud)

那么为什么这个运行需要将近 30 秒呢?

SELECT 
         MAX(MessageID) AS [MaxID]
FROM BoothComm.UniversalMessageQueue
WHERE 
       MessagePlatform = 'windows'
       AND
       MessageCategory = 'accounting'
Run Code Online (Sandbox Code Playgroud)

我的一个同事在表中添加了另一个索引,解决了延迟的业务问题。该索引将 30 秒减少到 FULL 秒,同时将其他查询加速到瞬时。同样,执行计划完全相同

(索引扫描应为 100%)。我听取了其他论坛的建议,并确保查询中的列顺序与它们存储在索引中的顺序相匹配...

CREATE NONCLUSTERED INDEX [MessageID and Platform and Category] ON [BoothComm].[UniversalMessageQueue]
( …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2014 query-performance

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

维护期间事务日志增长失控

我被要求清理表格的几列中的前面和后面的空格。该表是从平面文件导入的,并且有许多输入错误的行。

该表有超过 1.5 亿行。

到目前为止,我已经尝试执行一个更新语句来更新列ltrim(rtrim(columnname)),我还尝试创建一个临时表(堆)并insert into ... select from使用相同的ltrim(rtrim(columnname))语法。

在每种情况下,事务日志都会失去控制,直至耗尽磁盘空间。

我了解事务日志如何工作得相当好。然而,在执行这样的批量维护的情况下,我被难住了。

目前数据库处于大容量日志恢复模式,我每 30 秒运行一次事务日志备份,事务日志的增长速度继续超过我​​可以备份的速度。我已经研究过如何将这项工作分成批次,但似乎无法制定可以有效执行此操作的查询。我有一个可以关闭的身份字段,所有其他列都是varchar列。现在我认为答案是简单地为服务器获得更多磁盘空间,但是我希望有更好的解决方案。

我使用的是 Microsoft SQL Server 2014 企业版。

平面文件早已不复存在;这是一个在 10 年和 SQL Server 的许多版本中不断增长的表。只执行较小的增量批量更新,我相信新插入在插入之前已经被清理。所以我正在修理旧东西:(

sql-server maintenance transaction-log sql-server-2014

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

SQL Server 2014 中超过 15000 个休眠会话

CPU 利用率会定期达到 100%,当我检查 SP_who2 时,它显示大约 20000 个会话,其中大多数都在睡眠(也在使用 CPU)。
我认为 CPU 负载与睡眠会话有关

应用程序名称显示为 Microsoft JDBC。

大多数会话都将“SOS_SCHEDULER_YIELD”显示为 last_wait_type。重新启动 Windows Server 后,CPU 利用率已下降,但会话计数正在增加。

服务器有 32 个内核。

应用程序团队告诉他们正在使用一些“连接池”进行连接管理。

如何调查或解决睡眠会话的数量?

performance sql-server sql-server-2014 cpu performance-tuning

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

还原到新数据库时的尾日志备份选项

我想将一个 sql server 数据库(sql server 2014)恢复到一个新的数据库,看看我是否可以恢复已删除的数据。

我需要从大约 2 个月前恢复,所以我需要使用时间线并选择正确的 trn 时间点。

我正在恢复到一个新数据库,根本不想弄乱或中断源数据库。

那么我应该不选中或选中尾日志备份(还原前进行尾日志备份并将源数据库保持在还原状态)下的选项吗?

谢谢!

sql-server sql-server-2014

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

处于不确定状态的会话 - 终止/回滚

我有一个 SQLjob,它调用xp_cmdshell用于通过脚本将 txt 文件转储到 ftp 站点。

有时它会失败并且作业被挂在可执行状态。通常我会终止会话并清除它。

但是,我有两个会话处于不确定状态。

 sp_WHO2 53 -- running from 7/8/2018
Run Code Online (Sandbox Code Playgroud)

SP_WHO2 53

SP_WHO2 98 -- running from 6/16/2018
Run Code Online (Sandbox Code Playgroud)

SP_WHO2 98

作业状态显示它,Runnable但命令是KILLED/ROLLBACK

检查 SPID 53

Kill 53 with status only 
Run Code Online (Sandbox Code Playgroud)

输出

SPID 53: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds.
Run Code Online (Sandbox Code Playgroud)

检查 SPID 98

KILL 98 with status only
Run Code Online (Sandbox Code Playgroud)

输出

SPID 98: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds.
Run Code Online (Sandbox Code Playgroud)

我该如何清除这些会话?

我遇到了 SQL Server 的性能问题,这导致我参加了这些会议。我做了一些研究并指出我相信它会增加日志文件并导致性能问题。我不知道当前问题是否是因为这些会话,但它们是活跃的、昂贵的查询。所以我想从这里开始。我是这里的开发人员,我知道活动监视器在 …

performance sql-server sql-server-2014

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

当存储过程同时运行多次时,临时表过滤索引创建被阻止

SQL Server 2014 中是否存在任何已知的阻塞问题,这些问题特定于在初始表创建后在临时表上创建一个或多个筛选索引?(即不是内联索引创建)

我不允许发布实际代码;因此,我更改了表/列名称以保护无辜者。下面具有代表性但非常粗略的逻辑包含在存储过程的开头。

我相信,当存储过程同时运行多次时会发生阻塞。根据我的 DMV 查询,存储过程在第一个非聚集索引创建语句中被阻塞。

CREATE TABLE #temp_table_name_goes_here (
    [the_first_col] BIGINT NULL
    ,[the_second_col] INT NULL
    ,[another_col] VARCHAR(20) NULL
    );

CREATE INDEX tmp_indx_temp_table_name_goes_here_1 ON #temp_table_name_goes_here (the_first_col)
WHERE the_first_col IS NOT NULL;

CREATE INDEX tmp_indx_temp_table_name_goes_here_2 ON #temp_table_name_goes_here (the_second_col)
WHERE the_second_col IS NOT NULL; 
Run Code Online (Sandbox Code Playgroud)

sql-server filtered-index sql-server-2014 temporary-tables

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

查找具有额外字符的相同字符串的记录

好的,所以我有一个 Microsoft SQL Server 2014 数据库表,owner其中包含大约 90,000 条包含所有者信息的记录,另一个vehicle包含车辆信息

Owner_Name                   owner_id       V_name     owner_id    exempt
-------------------------------------       ------------------------------
JACOB JAMISON & JESSICA           35        Civic            35        H3
JACOB JAMISON M & JESSICA B       39        Accord           39        H3 
BLACKSON BARRINGTON               56        Bugatti          56        H6
BLACKSON BARRINGTON H             98        SSC              98        H7
BRUSTER MICHAEL                   107       Corvette         107       H9
Run Code Online (Sandbox Code Playgroud)

我正在尝试查找对车辆具有多个豁免的所有记录(H0意味着没有豁免)。下面的代码运行良好,只要名称完全相同。但是,如果有变化,例如额外的字母或向后输入,则不会返回这些记录。我看过类似的东西SOUNDEX,但这在我的场景中不起作用。

SELECT Owner_name
     , COUNT(Owner_name) AS 'xNameAppears'
     , COUNT(v.exempt) AS 'ExemptionCount' 
FROM owner o
INNER JOIN vehicle V …
Run Code Online (Sandbox Code Playgroud)

sql-server full-text-search sql-server-2014 string-searching

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

SELECT from Clustered Columnstore 导致 LOB 读取

我正在从以下包含 52 亿条记录的聚集列存储索引中执行 SELECT。当我查看 STATISTICS IO 的输出时,我看到的是 LOB 逻辑读取。

我的问题是当表中的数据类型都不是 LOB 值时,为什么查询执行 LOB 逻辑读取?

我在 SQL Server 2014 SP3 企业版环境中工作。

表定义:

CREATE TABLE [dbo].[ColumnstoreTableA](
    [RollupID] [bigint] IDENTITY(1,1) NOT NULL,
    [DT_DIMID] [int] NOT NULL,
    [TC_DIMID] [int] NOT NULL,
    [C_DIMID] [int] NOT NULL,
    [CD_DIMID] [int] NOT NULL,
    [AC_DIMID] [int] NOT NULL,
    [UA_DIMID] [int] NOT NULL,
    [UL_DIMID] [int] NOT NULL,
    [JP_DIMID] [int] NOT NULL,
    [RTT_DIMID] [int] NOT NULL,
    [RA] [int] NOT NULL,
    [Impressions] [int] NOT NULL,
    [Clicks] [int] NOT NULL,
    [Conversions] [int] NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server columnstore sql-server-2014

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