标签: sql-server-2012

具有高度碎片化的堆

堆上的高碎片会影响查询性能吗?

我可以重建堆ALTER TABLE REBUILD以消除碎片吗?

这是用于报告的临时表。它确实有非聚集索引,但没有聚集索引。

sql-server heap sql-server-2012 index-maintenance

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

当另一半失败时,交易的一半完成?

我在 SO、MSDN 和其他各种来源上进行了一些搜索,发现了很多关于事务的问题,但似乎没有一个正是我正在处理的问题。

诚然,尽管我确实了解 ACID 和事务的概念,但我仍然是初级 DBA。我正在处理一个 SQL 脚本:

  1. 向 2 个不同的表添加一行,前提是这些值尚不存在
  2. 如果存在,则删除列
  3. 如果不存在则添加一列
  4. 更改 2 个生成动态 SQL 以构建报表查询的存储过程

上述所有操作都是独立工作的,并且在(我认为是)单个事务中包含时,它们也会协同工作。我试图理解的是,当事务的另一部分失败时,事务的“部分”如何完成(并可能提交)。

为简洁起见,假设我有名为“ProcessReport”和“RetrieveReport”的工作程序。这两个过程中的动态 SQL 都以“SELECT”开头,然后从那里开始构建。测试用例:

CREATE TABLE ReportTable (FirstName VARCHAR(100), LastName VARCHAR(100), OrderId INT);
GO
CREATE PROCEDURE ProcessReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql   
  SET @SQL = 'SELECT FirstName, LastName, '
  --create rest of dynamic SQL here...

  INSERT INTO ReportTable (FirstName, LastName) EXEC(@SQL)
END
GO 

CREATE PROCEDURE RetrieveReport
AS
BEGIN
  DECLARE @SQL VARCHAR(4000)

  -- start creating dynamic sql …
Run Code Online (Sandbox Code Playgroud)

t-sql transaction sql-server-2012 acid

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

辅助副本索引

我有一个问题,关于一个问题,它是 70-462 Microsoft 考试的一部分。

我今天有这个问题,我不完全确定正确答案。虽然我确实通过了考试,但我想了解这种情况下的正确解决方案。

如果我没记错问题,您管理的是 2012 SQL Server,要求是将 OLTP 数据库的分钟报告卸载到另一台服务器,并且还能够向辅助数据库添加索引。

问题的答案大致如下:

  1. 两台服务器,不同的数据中心。具有同步提交的 AG 组。主动次要。
  2. 两台服务器,同一个子网。具有同步提交的 AG 组。
  3. 两台服务器,每 10 分钟发送一次日志。
  4. a-synch 提交有几个不同的答案。
  5. 包含配置为执行事务复制的应用程序数据库的 SQL Server。
  6. 包含配置为执行快照复制的应用程序数据库的 SQL Server。
  7. Windows 故障转移群集中的两台服务器。SQL Server 配置为群集实例。

最初我排除了异步提交选项(延迟)、不同数据中心的同步提交 AG 组(延迟?)、日志传送(延迟)和快照复制选项。

这给我留下了同一个子网上的同步提交 AG 组,或具有事务复制的 SQL 服务器。

基于https://msdn.microsoft.com/en-us/library/ff878253.aspx,我读到如果你想在你的活动辅助节点上建立索引,你必须在你的主要节点中创建它们。我将这个问题解释为要求能够在主服务器上创建索引,而这些索引在主服务器上不存在(包括用于报告的索引,或者其他什么不存在)。

另一个答案,单独指的是 SQL Server,这听起来不像我们要添加“另一台服务器”来卸载工作。

我是否误解了问题/要求?正确答案/解决方案应该是什么?

replication sql-server sql-server-2012 availability-groups

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

DBCC CHECKDB 的替代方案

我在我的一个数据库上运行 DBCC CHECKDB,但它需要很长时间。我有一些问题请帮助我。

有没有其他方法可以检查我的数据库完整性?

我应该等待完成它吗?

sql-server sql-server-2012 dbcc-checkdb

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

SQL Server DOUBLE 关键字

DOUBLESQL Server中有保留关键字,但我知道它不是数据类型(其他语言的double是floatreal在SQL Server中);有谁知道为什么这是一个关键字?

我尝试在 SQL Server 2008 和 SQL Server 2012 中使用它,但不能将其用作数据类型或函数,并且在 MSDN 页面中找不到任何信息;只是它是一个保留关键字而不是数据类型。

sql-server-2008 sql-server sql-server-2012

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

查找数据重置的行

所以我有一个表tbl,我试图在其中提取以可变速率递增的数据。我需要确定数据何时重置,以便我可以得出一个累积值。这是一个示例表:

ID    VAL
 1     12
 2      2
 3     14
 4     20
 5     24
 6     25
 7      2
 8     11
 9     14
10     15
11     18
12      0
13      5
Run Code Online (Sandbox Code Playgroud)

如何在 SQL 查询中识别哪些行已重置数据?

在此表示例中,我想将行 ID 2、7 和 12 标识为数据重置的点。

最终结果是,我可以将第 1、6 和 11 行(以及其他数据)添加到当前值以获得总累积值。

sql-server sql-server-2012

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

执行计划有 TOP 运算符,用于没有 TOP 或 ORDER BY 的查询

在此处输入图片说明我有按月临时表的产品销售。(更大的历史表的子集)我正在运行查询以查找在指定的 6 个月范围内之前几个月未售出的新产品。因此,以 1 月为基础,在 2 月向我展示所有未在 1 月销售中销售的新产品。3 月所有未售出的新产品 1 月或 2 月销售等。前 5 个月查询返回次秒。第 6 个月,大约需要 5 分钟。比较执行计划,在第 6 个月,它显示我的执行计划中的 Top 运算符花费了额外的时间。但我没有在选择中排序或使用 Top X。我的查询中是什么导致了这种情况?我可以等 5 分钟,因为它是一次性请求,但我更多是从学习的角度询问,我想了解它为什么添加到 Top 运算符。提前致谢。

select divn_nbr, dept_nbr, vendorNumber, pid, nrfcolorNumber, periodcode    
from ##tmpSFA a 
where periodCode = '201512' 
and not exists  
(   
    select 1 from ##tmpSFA b
    where ISNULL(a.divn_nbr, -99) = isnull(b.divn_nbr, -99)
    and isnull(a.dept_nbr, -99) = isnull(b.dept_nbr, -99)
    and isnull(a.vendorNumber, -99) = isnull(b.vendorNumber, -99)
    and isnull(LTRIM(rtrim(upper(a.pid))), -99) = isnull(LTRIM(rtrim(upper(b.pid))), -99)
    and isnull(a.nrfcolorNumber, -99) …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2012 top

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

如何对数据进行分组并为每一行写入其组 ID?

我有样本数据:

CREATE TABLE #T (Name varchar(5), GroupId int NULL)
INSERT INTO #T (Name)  VALUES 
('A'),
('A'),
('A'),
('B'),
('B'),
('C'),
('D'),
('D') 

Name  GroupId
----- -----------
A     NULL
A     NULL
A     NULL
B     NULL
B     NULL
C     NULL
D     NULL
D     NULL
Run Code Online (Sandbox Code Playgroud)

如何按名称对数据进行分组,并在其后写入 groupId(顺序,可能是身份)?这就是我想要得到的:

Name  GroupId
----- -----------
A     1
A     1
A     1
B     2
B     2
C     3
D     4
D     4
Run Code Online (Sandbox Code Playgroud)

要分组的表有大约 15m 行。如何更好地做到这一点?谢谢!

t-sql sql-server-2012 rank

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

为什么 SSMS 以紫色突出显示 SUBSTRING 而以灰色突出显示 RIGHT?

我为这个微不足道的问题道歉,但我试图弄清楚如何RIGHT在 SQL 中执行 a所以我实验性地输入RIGHT并且它没有以紫色突出显示,所以我花了一些时间来思考如何使用子字符串和长度来做到这一点,然后我后来发现这RIGHT是完全有效的。

为什么它没有突出显示紫色?

ssms sql-server-2012

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

还原到较新的 SQL Server 后的统计维护

将 SQL Server 2012 备份还原到 SQL Server 2014 实例并更新兼容性级别时,理想(或必要)的调用顺序是什么?

-- Update Statistics for all tables
EXEC sp_MSforEachtable 'Update Statistics ? with FULLSCAN';

-- Update page and row counts in catalogviews
DBCC UPDATEUSAGE('MY_DATABASE') ;

-- Change DB Compatibility level
EXEC sp_dbcmptlevel 'MY_DATABASE', '120'; 
Run Code Online (Sandbox Code Playgroud)

我不确定数据库兼容性级别是否会影响统计数据或简化服务器上​​的引擎。如果数据库兼容性级别影响统计信息,则应在更新统计信息之前完成。也不清楚是否仍然推荐 UPDATEUSAGE 以及是否也应该在更新统计信息之前。

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

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