标签: sql-server-2017

索引重建期间的统计信息更新

我手头有一项任务是移动重建一个大表,以将 LOB 页面移动到 SQL Server 2017 Enterprise Edition 上的不同文件组。

我正在概念验证环境中测试脚本,我可以看到总共大约CREATE INDEX .. DROP_EXISTING=ON需要 6 小时。

CREATE UNIQUE CLUSTERED INDEX [PK_TABLE1]
ON [dbo].[TABLE1] ([Id] ASC)
 WITH (DROP_EXISTING = ON , FILLFACTOR = 100, PAD_INDEX = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, IGNORE_DUP_KEY = OFF, DATA_COMPRESSION = NONE, STATISTICS_NORECOMPUTE = OFF, ONLINE = ON, MAXDOP=2) 
ON PS_MOVE_HELPER_D59E24BC73414AA8A5FB2E5D8F93C3D8([Id] );

CREATE UNIQUE CLUSTERED INDEX [PK_TABLE1]
ON [dbo].[TABLE1] ([Id] ASC)
 WITH (DROP_EXISTING = ON , FILLFACTOR = 100, PAD_INDEX = OFF, ALLOW_ROW_LOCKS …
Run Code Online (Sandbox Code Playgroud)

sql-server filegroups index-maintenance sql-server-2017

2
推荐指数
1
解决办法
685
查看次数

SQL 可用性组

我有一个关于 SQL 标准可用性组的问题。我目前有一个 AG 设置,其中包含一个主副本和一个辅助副本。我正在使用同步提交,但对异步感到好奇。次要副本将/可以落后多远?如果辅助副本因任何原因离线,它会在上线后完全赶上吗?二级可以停机多久才赶不上?我了解两种提交类型之间的区别(一种在提交给应用程序之前验证事务已提交,而另一种提交类型则没有)。我不确定的是,在异步提交类型中,辅助节点可以离线多长时间。

availability-groups sql-server-2017

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

您能否在两台服务器上运行两个 WSFC 实例,其中每个节点都是不同可用性组的主节点?

我正在为即将到来的基础设施变化起草一份提案。这将包括一个生产服务器和报告/数据仓库服务器,每个服务器都具有 Always On。为了降低硬件和许可成本,是否可以在运行 Prod-AG Primary 和 Rep-AG Secondary 的 Server-A 以及运行 Rep-AG Primary 和 Prod-AG Secondary 的 Server-B 的配置中运行?

我认为每个服务器都需要 2 个以下 WSFC 实例、sql 实例、AG、侦听器、DNS 名称/端口。

我希望这是有道理的,这是我认为它会是什么样子的图表。

所需的解决方案

在任一节点上发生故障转移的情况下,工作负载/业务需求并不是那么大,在同一台服务器上运行几个小时将是一个主要问题。

我只发现了几次类似的设置,但没有来自 Microsoft 或成功运行此设置的任何人的明确信息。

SQL 版将是 2017 年,很可能是标准版,我认为我们不会被批准用于企业版。操作系统将是 Windows Server 2016 Core。

sql-server clustering availability-groups sql-server-2017

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

SQL Server 标准基本可用性组 - 只有 10 个侦听器限制?

可以使用 SQL Server Standard 创建的侦听器数量是否有限制?

我正在与使用 CU3 设置 2017 标准服务器的 DBA 合作。我们有 12 个数据库,他能够设置 12 个基本可用性组。他能够设置 10 个侦听器,但在 11 日,出现以下错误:

为可用性组侦听器“test12300”创建失败。(Microsoft.SqlServer.Smo)

如需帮助,请单击:http : //go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=14.0.17213.0+((SSMS_Rel).171128-2020)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates。 FailedOperationExceptionText&EvtID=Create+AvailabilityGroupListener&LinkId=20476


附加信息:

执行 Transact-SQL 语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)


WSFC 群集无法使 DNS 名称为“test12300”的网络名称资源联机。DNS 名称可能已被使用或与现有名称服务冲突,或者 WSFC 群集服务可能未运行或可能无法访问。使用不同的 DNS 名称来解决名称冲突,或查看 WSFC 群集日志以获取更多信息。尝试为侦听器创建网络名称和 IP 地址失败。如果这是一个 WSFC 可用性组,WSFC 服务可能未运行或在其当前状态下可能无法访问,或者为网络名称和 IP 地址提供的值可能不正确。检查 WSFC 群集的状态并与网络管理员一起验证网络名称和 IP 地址。否则,请联系您的主要支持提供商。(Microsoft SQL Server,错误:19471)

如需帮助,请单击:http : //go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=14.00.3015&EvtSrc=MSSQLServer&EvtID=19471&LinkId=20476

我们创建了 11 个空数据库,对每个数据库进行了备份,然后通过 AG 向导使用 DHCP 创建了一个 AG 和一个侦听器。它工作了 10 次,但在第 11 次失败了。对于第 11 个侦听器,我们选择了名称 BAG_L11,没有其他东西使用该 DNS 名称。

sql-server listener availability-groups standard-edition sql-server-2017

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

19 位数字的最佳最小数据类型大小是多少?

我正在使用此代码来混合日期和时间以将其用作唯一 ID

DateTime.Now.ToString("yyyyMMddHHmmssfffff")
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2017 中,我很困惑我可以使用哪种数据类型的最佳最小大小来存储此字符串。

最好的最小数据类型是什么:bigint,timestampvarchar(19)?

sql-server datatypes timestamp sql-server-2017

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

如何记录用户在 SQL Server 2017 Standard 中所做的所有查询?

有没有可能做到这一点?由于内部合规性,需要记录在任何数据库中执行的所有查询和操作。

如果我们需要 MS SQL 2017 标准版或企业版,我需要信息(和/或来源)以确保记录数据库管理员的活动(运行、修改等查询...),而不仅仅是非管理员执行的活动用户。

sql-server audit logs sql-server-2017

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

缺少存储过程体

我正在浏览我们的一个数据库以回答老板的问题,我偷看了一个存储过程。像往常一样,我在 SSMS 中右键单击它,单击 Script stored procedure as... 然后创建,令我惊讶的是,我发现的只是 CREATE PROCEDURE 语句: 在此处输入图片说明

为了仔细检查,我让其他人看,他们得到了同样的东西。他们以数据库所有者身份登录,我以系统管理员身份登录。我接下来跑了

select
m.definition
from sys.procedures p
left join sys.sql_modules m on p.object_id=m.object_id
where p.name in ('spPUpdateContactUserLockout', 'spPLINK_SYNC_CONTACT');
Run Code Online (Sandbox Code Playgroud)

并得到了这个(注意我包含了另一个存储过程以进行比较) 在此处输入图片说明

我以前没见过这个。曾经。我不认为没有定义主体就可以创建存储过程,并且在此实例上的多个数据库中有几个这样的过程。在这一点上我很担心,但我不确定我是否不必担心,或者我是否应该比现在更担心。

此实例是 SQL Server 2017 Standard x64 RTM-CU11,我使用的是 SSMS 17.9。任何见解表示赞赏!

sql-server stored-procedures sql-server-2017

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

优化查询,仅在返回行数小于一定数量时才返回

我有一个查询,它首先计算要返回的行数,如果它低于限制,则返回这些行,否则不返回任何内容。

对于上下文:我有一张地图,仅在某个缩放级别后才显示一些点。但是,我的用户现在希望地图只要屏幕上有空间就显示点,而不是具有预定义的最小缩放级别。这意味着现在每当他们在地图上移动时,我都会有两个查询,而不是一个:一个是知道有多少项目,另一个是实际返回它们。负载可能会翻倍。我想过这样做:

SELECT p.ACOLUMN, p.ANOTHERCOLUMN, p.LATITUDE, p.LONGITUDE 
FROM table p 
where p.LATITUDE < @latMax)
and p.LATITUDE > @latMin) 
and p.LONGITUDE < @lngMax)
and p.LONGITUDE > @lngMin)
and (SELECT count(*) 
FROM table
where LATITUDE < @latMax
and LATITUDE > @latMin
and LONGITUDE < @lngMax
and LONGITUDE > @lngMin)) < 200 -- example limit value
Run Code Online (Sandbox Code Playgroud)

查看实际执行计划,我看到 SQL Server 2017 在同一个索引上搜索了两次:

实际执行计划显示相同的非聚集索引查找发生两次

它当然也在两个搜索中读取相同数量的行。有没有办法删除那些重复的搜索?或者是否有另一种更理想的方式来做我正在尝试的事情?

sql-server sql-server-2017

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

启用 XP_CMDShell 后 SQL Server 运行缓慢甚至禁用直到重新启动服务

2 天前,我创建了一个需要INSERT和的函数,UPDATEXP_CMDShell通过运行脚本启用并执行它。

之后,SQL Server 的SELECT命令运行速度非常慢。即使SELECTINSERT通过分隔命令运行的非常简单的语句。

我在其他数据库上测试了这种行为,它SELECT在几分钟后运行得到相同的结果。

此外,我使用 SQL Server 2014 在其他 2 台主机上对其进行了测试,结果相同。

我创建的函数是为了在另一个 select 语句中获取它的值:

ALTER FUNCTION [Prg].[intCheckDelayedProcessProgram] 
(
     @SalesOrderProductID INT,
     @MainProductTreeID INT,
     @ProductTreeID INT,
     @ProcessId INT,
     @additionalDays INT = 2,
     @currentDateReverceString VARCHAR(10) = NULL
)
RETURNS INT
AS
BEGIN
    --declare @SalesOrderProductID INT = 40957,
    --  @MainProductTreeID INT = 93758,
    --  @ProductTreeID INT = 93758,
    --  @ProcessId INT = 4472,
    --  @additionalDays INT = 2, …
Run Code Online (Sandbox Code Playgroud)

sql-server functions xp-cmdshell sql-server-2017

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

在列存储索引扫描运算符之前消除过滤运算符

我有一个包含数百万行的大型事实表,称为 MyLargeFactTable,它是一个聚集列存储表。

那里也有一个复合主键约束(customer_id、location_id、order_date 列)。

我还有一个临时表#my_keys_to_filter_MyLargeFactTable,具有相同的 3 列,它包含这 3 个键值的几千个 UNIQUE 组合。

以下查询为我提供了所需的结果集

...
FROM #my_keys_to_filter_MyLargeFactTable AS t
JOIN dbo.MyLargeFactTable AS m
ON m.customer_id = t.customer_id
AND m.location_id = t.location_id
AND m.order_date = t.order_date
Run Code Online (Sandbox Code Playgroud)

但我注意到事实表上的索引扫描运算符返回的行数比它应有的多(大约一百万)并将其输入到过滤器运算符中,这进一步将结果集减少到所需的几千行。

在此处输入图片说明

索引扫描操作符读取多行(它们相当宽的行)增加了 IO,并显着减慢了整个查询。

我的参数不是 sargable 吗?

如何删除 Filter 运算符并以某种方式强制 Index Scan 运算符仅读取几千行?

表定义:

create table #my_keys_to_filter_MyLargeFactTable 
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date date not null,
primary key clustered (customer_id,location_id,order_date)
)

create table MyLargeFactTable
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql index-tuning columnstore sql-server-2017

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