标签: sql-server-2012

累计到前一行

我需要一些窗口函数方面的帮助。我知道你可以计算一个窗口内的总和和一个窗口内的运行总数。但是是否可以计算先前的运行总计,即不包括当前行的运行总计?

我假设您需要使用ROWorRANGE参数。我知道有一个CURRENT ROW选项,但我需要CURRENT ROW - 1,这是无效的语法。我对这些ROWRANGE论点的了解有限,因此将不胜感激地收到任何帮助。

我知道这个问题有很多解决方案,但我希望了解ROW,RANGE参数,并且我认为可以用这些来解决问题。我已经包含了一种可能的方法来计算以前的运行总数,但我想知道是否有更好的方法:

USE AdventureWorks2012

SELECT s.SalesOrderID
    , s.SalesOrderDetailID
    , s.OrderQty
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID) AS RunningTotal
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                         ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal
    -- Sudo code - I know this does not work
    --, SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
    --                   ORDER BY SalesOrderDetailID
    --                   ROWS BETWEEN UNBOUNDED PRECEDING 
    --                                   AND CURRENT …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 window-functions

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

SQL Server 未使用所有 CPU 内核/线程

升级 SQL Server 的硬件后,我们在 Windows 任务管理器中注意到 SQL 实例仅使用了可用线程的一半:

任务管理器.

服务器具有以下硬件和软件:

  • Windows 2008 R2 企业版 64 位 SP1
  • Intel Xeon E7-4870 - 4 个处理器(40 个内核,80 个线程)
  • Microsoft SQL Server 2012 企业版(64 位)

运行select cpu_count from sys.dm_os_sys_info返回 40。

操作系统可以看到所有 80 个线程。

为什么只使用了服务器一半的处理能力?

我们在两台服务器上拥有相同的硬件和软件,并且它们都表现出相同的行为。

sql-server sql-server-2012 hardware

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

优化 CTE 层次结构

下面更新

我有一个具有典型帐户/父帐户体系结构的帐户表来表示帐户层次结构(SQL Server 2012)。我使用 CTE 创建了一个 VIEW 来散列层次结构,总的来说它工作得很好,而且符合预期。我可以查询任何级别的层次结构,并轻松查看分支。

有一个业务逻辑字段需要作为层次结构的函数返回。每个帐户记录中的一个字段描述了企业的规模(我们将其称为 CustomerCount)。我需要报告的逻辑需要从整个分支汇总 CustomerCount。换句话说,给定一个帐户,我需要将该帐户的 customercount 值与层次结构中帐户下方每个分支中的每个子项相加。

我使用 CTE 中构建的层次结构字段成功计算了该字段,该字段看起来像 acct4.acct3.acct2.acct1。我遇到的问题只是让它运行得很快。如果没有这个计算字段,查询会在大约 3 秒内运行。当我添加计算字段时,它变成了一个 4 分钟的查询。

这是我能想出的最好的版本,它返回正确的结果。我正在寻找有关如何在不牺牲性能的情况下重新构建此视图的想法。

我理解这个变慢的原因(需要在 where 子句中计算一个谓词),但我想不出另一种方法来构造它并且仍然得到相同的结果。

下面是一些示例代码,用于构建表并执行 CTE,这与它在我的环境中的工作方式几乎完全一样。

Use Tempdb
go
CREATE TABLE dbo.Account
(
   Acctid varchar(1) NOT NULL
    , Name varchar(30) NULL
    , ParentId varchar(1) NULL
    , CustomerCount int NULL
);

INSERT Account
SELECT 'A','Best Bet',NULL,21  UNION ALL
SELECT 'B','eStore','A',30 UNION ALL
SELECT 'C','Big Bens','B',75 UNION ALL
SELECT 'D','Mr. Jimbo','B',50 UNION ALL
SELECT 'E','Dr. John','C',100 UNION ALL
SELECT 'F','Brick','A',222 UNION …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization cte sql-server-2012

15
推荐指数
2
解决办法
2446
查看次数

SQL Server 在相等比较中自动修剪 varchar 值但不喜欢比较

我今天在 SQL Server 上遇到了一些有趣的行为(在 2005 年和 2012 年观察到),我希望有人能解释一下。

使用=NVARCHAR 字段进行比较的查询会忽略字符串中的尾随空格(或在比较之前自动修剪值),但使用like运算符的同一查询不会忽略该空格。2012 年使用的排序规则是 Latin1_General_CI_AS。

考虑这个 SQL 小提琴:http ://sqlfiddle.com/#! 6/72262/4

请注意,like运算符不会返回尾随空格字符串的结果,但=运算符会返回。为什么是这样?

加分项:我无法在 VARCHAR 字段上复制它,我原以为在两种数据类型中都会以相同的方式处理空间 - 这是真的吗?

sql-server sql-server-2012

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

检测 SQL Server 表中的更改

在我的应用程序中,有一个运行在 SQL Server 2012 上的数据库,我有一个作业(计划任务),它定期执行一个昂贵的查询并将结果写入一个表,稍后可以由应用程序查询。

理想情况下,我只想在自上次执行查询后发生更改时运行该昂贵的查询。由于源表非常大,我不能只选择所有候选列的校验和或类似的东西。

我有以下想法:

  • 每当我更改源表中的某些内容时,将上次更改的时间戳、“必须是查询”标志或类似内容显式写入跟踪表。
  • 使用触发器来做同样的事情。

但是,我真的很想知道是否有一种轻量级的方法来检测表上的更改,而无需我明确跟踪写入。例如,我可以获取ROWVERSION表格的“当前”或类似的信息吗?

sql-server sql-server-2012 change-tracking

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

从胜负平局数据中获取连胜次数和连胜类型

如果这对任何人来说都更容易,我为这个问题制作了一个SQL Fiddle

我有一个各种各样的梦幻体育数据库,我想弄清楚如何得出“当前的连胜”数据(例如,如果球队赢得了最近的两场比赛,则为“W2”,如果他们输了则为“L1”他们赢得上一场比赛后的最后一场比赛 - 如果他们最近的比赛打平,则为“T1”)。

这是我的基本架构:

CREATE TABLE FantasyTeams (
  team_id BIGINT NOT NULL
)

CREATE TABLE FantasyMatches(
    match_id BIGINT NOT NULL,
    home_fantasy_team_id BIGINT NOT NULL,
    away_fantasy_team_id BIGINT NOT NULL,
    fantasy_season_id BIGINT NOT NULL,
    fantasy_league_id BIGINT NOT NULL,
    fantasy_week_id BIGINT NOT NULL,
    winning_team_id BIGINT NULL
)
Run Code Online (Sandbox Code Playgroud)

的值NULLwinning_team_id列指示该匹配领带。

这是一个示例 DML 语句,其中包含 6 支球队和 3 周比赛的一些示例数据:

INSERT INTO FantasyTeams
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

15
推荐指数
3
解决办法
2703
查看次数

如何通过数据库获取特定实例的 CPU 使用率?

我发现以下查询可以按数据库检测 CPU 使用率,但它们显示不同的结果:

WITH DB_CPU_Stats
AS
(
    SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
      SUM(total_worker_time) AS [CPU_Time_Ms]
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY (
                    SELECT CONVERT(int, value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
    GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName,
        [CPU_Time_Ms], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
--WHERE DatabaseID > 4 -- system databases
--AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012

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

不可查找的持久计算列上的索引

我有Address一个名为 的表,它有一个名为 的持久计算列Hashkey。该列是确定性的,但不精确。它有一个不可查找的唯一索引。如果我运行这个查询,返回主键:

SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey
Run Code Online (Sandbox Code Playgroud)

我得到这个计划:

基本计划

如果我强制索引,我会得到更糟糕的计划:

力指数

如果我尝试同时强制索引和查找,则会出现错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用的情况下重新提交查询SET FORCEPLAN

这仅仅是因为它不精确吗?我以为坚持就无所谓了?

有没有办法在不使其成为非计算列的情况下使该索引可查找?

有没有人有任何有关此信息的链接?

我无法发布实际的表创建,但这里有一个具有相同问题的测试表:

drop TABLE [dbo].[Test]

CREATE TABLE [dbo].[Test]
  (
     [test]        [VARCHAR](100) NULL,
     [TestGeocode] [geography] NULL,
     [Hashkey] AS CAST(
                        ( hashbytes
                            ('SHA', 
                                ( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) ) 
                                + RIGHT(REPLICATE(' ', (100)) + isnull([TestGeocode].[ToString](), ''), ( 100 ))
                            ) 
                        ) AS BINARY(20)                                                                                                        
                      ) PERSISTED
    CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
  )    
GO    
DECLARE @Hashkey …
Run Code Online (Sandbox Code Playgroud)

index sql-server optimization sql-server-2012 computed-column

15
推荐指数
2
解决办法
532
查看次数

授予对 MS SQL 中特定数据库中所有表的 Select 访问权限

我有一个服务器,其中包含多个数据库,这些数据库包含在同一个服务器/项目中。我正在使用 MS SQL Server 2012。

我设置了一个特殊角色,其中包含 3 个属于该角色的用户。我想授予 Select 对 1 个特定数据库中所有表的角色的访问权限。

有问题的数据库是一个存档数据库,其中包含过去 12 年中每个月的存档表。最初创建角色时,我通过运行以下命令授予访问权限:

GRANT SELECT ON [dbo].[myarchivetable] TO myspecialrole
Run Code Online (Sandbox Code Playgroud)

这很有效,因为我只需要更改年份和月份并将其全部作为 1 个脚本运行。

我现在发现他们需要选择访问存档数据库中的每个表。我可以执行上述方法,但是必须将所有这些都写出 132 次,很容易出错。

如何轻松地将 myspecialrole 添加到该数据库中的每个表?

sql-server permissions role sql-server-2012

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

较新版本的 SQL Server 不太稳定?

我们的数据库架构师告诉我们的一位客户,SQL Server 2014 与 2012 相比是一个糟糕的选择,因为它缺乏 2012 具有的性能和稳定性优势。我读过的所有内容都与此相矛盾。 Aaron Bertrand 说的正好相反,我从 MS 那里读到的所有白皮书也同意——2014 年得到了增强,解决了人们在 2012 年遇到的一些 AG 问题。

选择 2014 年而不是 2012 年有什么主要缺点吗?

sql-server sql-server-2012 sql-server-2014

15
推荐指数
1
解决办法
7274
查看次数