我需要一些窗口函数方面的帮助。我知道你可以计算一个窗口内的总和和一个窗口内的运行总数。但是是否可以计算先前的运行总计,即不包括当前行的运行总计?
我假设您需要使用ROWorRANGE参数。我知道有一个CURRENT ROW选项,但我需要CURRENT ROW - 1,这是无效的语法。我对这些ROW和RANGE论点的了解有限,因此将不胜感激地收到任何帮助。
我知道这个问题有很多解决方案,但我希望了解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 的硬件后,我们在 Windows 任务管理器中注意到 SQL 实例仅使用了可用线程的一半:
.
服务器具有以下硬件和软件:
运行select cpu_count from sys.dm_os_sys_info返回 40。
操作系统可以看到所有 80 个线程。
为什么只使用了服务器一半的处理能力?
我们在两台服务器上拥有相同的硬件和软件,并且它们都表现出相同的行为。
下面更新
我有一个具有典型帐户/父帐户体系结构的帐户表来表示帐户层次结构(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 上遇到了一些有趣的行为(在 2005 年和 2012 年观察到),我希望有人能解释一下。
使用=NVARCHAR 字段进行比较的查询会忽略字符串中的尾随空格(或在比较之前自动修剪值),但使用like运算符的同一查询不会忽略该空格。2012 年使用的排序规则是 Latin1_General_CI_AS。
考虑这个 SQL 小提琴:http ://sqlfiddle.com/#! 6/72262/4
请注意,like运算符不会返回尾随空格字符串的结果,但=运算符会返回。为什么是这样?
加分项:我无法在 VARCHAR 字段上复制它,我原以为在两种数据类型中都会以相同的方式处理空间 - 这是真的吗?
在我的应用程序中,有一个运行在 SQL Server 2012 上的数据库,我有一个作业(计划任务),它定期执行一个昂贵的查询并将结果写入一个表,稍后可以由应用程序查询。
理想情况下,我只想在自上次执行查询后发生更改时运行该昂贵的查询。由于源表非常大,我不能只选择所有候选列的校验和或类似的东西。
我有以下想法:
但是,我真的很想知道是否有一种轻量级的方法来检测表上的更改,而无需我明确跟踪写入。例如,我可以获取ROWVERSION表格的“当前”或类似的信息吗?
如果这对任何人来说都更容易,我为这个问题制作了一个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)
的值NULL在winning_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) 我发现以下查询可以按数据库检测 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) 我有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
我有一个服务器,其中包含多个数据库,这些数据库包含在同一个服务器/项目中。我正在使用 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 2014 与 2012 相比是一个糟糕的选择,因为它缺乏 2012 具有的性能和稳定性优势。我读过的所有内容都与此相矛盾。 Aaron Bertrand 说的正好相反,我从 MS 那里读到的所有白皮书也同意——2014 年得到了增强,解决了人们在 2012 年遇到的一些 AG 问题。
选择 2014 年而不是 2012 年有什么主要缺点吗?
sql-server ×10
sql-server-2012 ×10
optimization ×2
cte ×1
hardware ×1
index ×1
performance ×1
permissions ×1
role ×1
t-sql ×1