我在 Windows NT 6.3 (Build 9600:) 上使用 Microsoft SQL Server 2014 - 12.0.4100.1 企业版(64 位)
我有一个 491 GB 的表,其中有 36 亿行没有主键。我希望添加的主键仅涵盖bigint包含唯一值的单个列。数据库有 477 GB 的可用空间,但这似乎还不够。
尝试添加它失败并出现以下错误:
无法为数据库 '[Redacted]' 中的对象 'dbo.SORT 临时运行存储:424251614560256' 分配空间,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
错误中的数据库名称是我尝试添加 PK 的数据库,而不是“tempdb”,这是我在此类错误中经常看到的。
我正在使用的命令:
ALTER TABLE REDACTED ADD CONSTRAINT [PK_REDACTED] PRIMARY KEY CLUSTERED
(
[RedactedId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
起初,该命令在 8-9 分钟后失败,然后我的 DBA 将另一个数据文件添加到具有大约 150 GB 可用空间的驱动器上的数据库中。24 分钟后再次运行它失败。这是进步,但我不知道需要多少可用空间,或者添加此索引实际需要多长时间。此数据库中目前有 477 …
假设有一个带有聚集索引的表
create table [a_table] ([key] binary(900) unique clustered);
Run Code Online (Sandbox Code Playgroud)
和一些数据
insert into [a_table] ([key])
select top (1000000) row_number() over (order by @@spid)
from sys.all_columns a cross join sys.all_columns b;
Run Code Online (Sandbox Code Playgroud)
通过检查该表的存储统计
select st.index_level, page_count = sum(st.page_count)
from sys.dm_db_index_physical_stats(
db_id(), object_id('a_table'), NULL, NULL, 'DETAILED') st
group by rollup (st.index_level)
order by grouping_id(st.index_level), st.index_level desc;
Run Code Online (Sandbox Code Playgroud)
有人能看见
index_level page_count
----------- ----------
8 1
7 7
6 30
5 121
4 487
3 1952
2 7812
1 31249
0 125000
NULL 166659
Run Code Online (Sandbox Code Playgroud)
该表总共需要 166659 页。
然而表扫描 …
sql-server parallelism database-internals sql-server-2014 scan
我们遇到了 CDC 问题,即捕获作业失败并且不会自行重启。这是在 DEV 环境中,所以没有害处,但有没有人看到这些错误或知道 CDC 到底出了什么问题?
SQL 2014 EE 12.0.5540 - 带有 SSISDB 的 2 节点 AG
过程或函数 sp_batchinsert_1663605265 指定的参数过多。更多信息查询sys.dm_cdc_errors动态管理视图
日志扫描进程未能从日志序列号 (LSN) {00002d0d:0000f11f:0002} 构建复制命令。备份发布数据库并联系客户支持服务。想要查询更多的信息
日志扫描进程在处理日志记录时失败。参考当前会话中以前的错误以确定原因并纠正任何相关问题。更多信息查询sys.dm_cdc_errors动态管理视图
我们尝试使用sp_cdc_drop_jobabd删除并重新创建捕获作业sp_cdc_add_job。我们还尝试故障转移到另一个节点以及服务器/服务重新启动。似乎没有什么能让 CDC 自行重启。
我们在周五通过 AG 滚动补丁应用了 CU4,因此我们处于最新最好的状态。在我们修补并故障转移后,这个问题立即出现。
添加日志查询结果
所以我在 SQL Server 2014 中有一个存储事件的表。事件的生成速度不超过每 10 秒一次,但可能会慢得多(事件之间的几分钟或几小时)。事件之间的时间并不统一。
我想按时间对记录进行抽样。
例如,我想要求一个 10 分钟的采样 - 所以它会抓取记录 1,下一条记录应该是至少 10 分钟后的记录,然后下一条记录至少比第 2 行晚 10 分钟, 等等。
我可以通过迭代方法来实现这一点,循环遍历每条记录,但我想让数据库来完成这项工作。问题是,我不知道如何使用 T-SQL set/window 语句来做到这一点。
谁能帮我吗?
示例数据:
EventID | RecordTime
--------+--------------------
1 | 2017-04-01 12:00:00
2 | 2017-04-01 12:00:10
3 | 2017-04-01 12:00:20
4 | 2017-04-01 12:00:32
5 | 2017-04-01 12:05:42
6 | 2017-04-01 12:09:00
7 | 2017-04-01 12:24:12
8 | 2017-04-01 12:36:46
9 | 2017-04-01 12:36:57
10 | 2017-04-01 15:00:00
Run Code Online (Sandbox Code Playgroud)
想要的结果:
EventID | RecordTime
--------+--------------------
1 | 2017-04-01 12:00:00 …Run Code Online (Sandbox Code Playgroud) 我有一张不断更新的表,没有人能弄清楚更新的来源。我怀疑它们来自实体框架,但我想通过扩展事件捕获更新和相关信息来证明这个理论。
我正在使用 SQL 2014 Enterprise,并尝试使用 exec_prepared_sql 和 sql_statement_starting 事件捕获该信息。这是我到目前为止所拥有的:
CREATE EVENT SESSION [Query Trace] ON SERVER
ADD EVENT sqlserver.exec_prepared_sql(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123))),
ADD EVENT sqlserver.sql_statement_starting(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123)))
ADD TARGET package0.event_file(SET filename=N'E:\ExtendedEvent\Query-Trace.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,我已经对其进行了测试,并且能够捕获常规 UPDATE 语句和使用 sp_executesql 调用的语句。但是,我仍然缺少一些东西。表中的数据仍在修改,并且此扩展事件未捕获执行此操作的 UPDATE。
所以,我的问题是:
1) 为了捕获可能来自实体框架的更新,我还需要在扩展事件中观察其他什么吗?
2)为此我应该使用其他什么来代替扩展事件吗?
谢谢!
在尝试自动化包括 SSRS 报告和 SSRS 共享数据源/数据集的部署时,我们一直在尝试适当地配置安全性。特别是问题在于共享数据源/数据集以及在所有环境中自动部署它们。出现的唯一解决方案是创建单个 SQL Server 登录名,并使用与 SSRS 中共享数据源的数据源相同的用户名密码。从 Dev 到 Prod,帐户是相同的。
在所有这些环境中,新创建的 SQL 登录都需要对存储过程执行 EXECUTE。我反对在所有环境中使用 EXECUTE 权限进行一次 SQL 登录。
在更自动化的部署之前,我们在所有 3 个环境中都有一个帐户,但在生产中使用不同的密码。DBA 团队将在部署后手动更改共享数据源/数据集的密码。目标是摆脱手动干预,同时也不造成大的安全漏洞。
SSRS 配置文件已加密,但我不想创建具有如此多权限的 SQL 登录。还有其他选择吗?
下面是我在生产中遇到的事情的简化版本(在处理异常大量批次的一天,计划变得灾难性地更糟)。
已使用新的基数估计器针对 2014 年和 2016 年对 repro 进行了测试。
CREATE TABLE T1 (FromDate DATE, ToDate DATE, SomeId INT, BatchNumber INT);
INSERT INTO T1
SELECT TOP 1000 FromDate = '2017-01-01',
ToDate = '2017-01-01',
SomeId = ROW_NUMBER() OVER (ORDER BY @@SPID) -1,
BatchNumber = 1
FROM master..spt_values v1
CREATE TABLE T2 (SomeDateTime DATETIME, SomeId INT, INDEX IX(SomeDateTime));
INSERT INTO T2
SELECT TOP 1000000 '2017-01-01',
ROW_NUMBER() OVER (ORDER BY @@SPID) %1000
FROM master..spt_values v1,
master..spt_values v2
Run Code Online (Sandbox Code Playgroud)
T1 包含 1,000 行。
的FromDate,ToDate …
I have tables which are partitioned based on a INT column.
I see some queries that are using $Partition function to compare partition number instead of comparing the actual field data.
For example instead of saying:
select *
from T1
inner join T2 on T2.SnapshotKey = T1.SnapshotKey
Run Code Online (Sandbox Code Playgroud)
they have been written like below:
select *
from T1
inner join T2 on $Partition.PF_Name(T2.SnapshotKey) = $Partition.PF_Name(T1.SnapshotKey)
Run Code Online (Sandbox Code Playgroud)
where PF_Name is the name of partition function.
我看到对这些查询的评论说这样做是为了提高性能,当我运行这两个查询时,我看到执行时间和执行计划不同。我不确定这两个查询有何不同。
这是一个真正的查询:
-- this takes about 9 seconds …Run Code Online (Sandbox Code Playgroud) performance sql-server partitioning sql-server-2014 query-performance
我有一个包含查找表的外键的父表(简化示例):
CREATE TABLE [dbo].[Parent] (
[Id] [uniqueidentifier] NOT NULL,
[LookupId] [uniqueidentifier] NULL
)
CREATE TABLE [dbo].[Lookup] (
[Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](64) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该Parent表有超过 1000 万行,而该Lookup表大约有 5000 行。真正的Parent实现有几个这样的对其他表的外键引用,并且这些列中的每一个都可能包含 NULL。
两个示例表的Id列都具有唯一的聚集索引,Parent具有 的非聚集索引LookupId和Lookup的非聚集索引Name。
我正在运行一个分页查询,我想在结果中包含查找值:-
SELECT
P.Id,
L.Name
FROM Parent P
LEFT JOIN Lookup L ON P.LookupId = L.Id
ORDER BY P.Id
OFFSET 500000 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
这运行得很快,按 排序也是如此P.LookupId。 …
用户(Windows 登录)刚刚抱怨他被拒绝执行程序。我去检查并确认他有执行它的权限。我没有改变任何东西(现在我是唯一一个拥有管理员权限的人,如果需要的话),在两次尝试失败后,他尝试第三次运行 SP 并且成功了。
我将 XE 配置为捕获错误消息,它捕获了错误代码 229 的两倍:
对象“storedProcedureName”、数据库“databaseName”、架构“schemaName”的 EXECUTE 权限被拒绝。
是否存在预期这种行为的任何情况?
Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)
sql-server-2014 ×10
sql-server ×9
errors ×1
parallelism ×1
partitioning ×1
performance ×1
permissions ×1
scan ×1
security ×1
ssrs ×1
t-sql ×1