我手头有一项任务是移动重建一个大表,以将 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 标准可用性组的问题。我目前有一个 AG 设置,其中包含一个主副本和一个辅助副本。我正在使用同步提交,但对异步感到好奇。次要副本将/可以落后多远?如果辅助副本因任何原因离线,它会在上线后完全赶上吗?二级可以停机多久才赶不上?我了解两种提交类型之间的区别(一种在提交给应用程序之前验证事务已提交,而另一种提交类型则没有)。我不确定的是,在异步提交类型中,辅助节点可以离线多长时间。
我正在为即将到来的基础设施变化起草一份提案。这将包括一个生产服务器和报告/数据仓库服务器,每个服务器都具有 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 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
我正在使用此代码来混合日期和时间以将其用作唯一 ID
DateTime.Now.ToString("yyyyMMddHHmmssfffff")
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2017 中,我很困惑我可以使用哪种数据类型的最佳最小大小来存储此字符串。
最好的最小数据类型是什么:bigint,timestamp或varchar(19)?
有没有可能做到这一点?由于内部合规性,需要记录在任何数据库中执行的所有查询和操作。
如果我们需要 MS SQL 2017 标准版或企业版,我需要信息(和/或来源)以确保记录数据库管理员的活动(运行、修改等查询...),而不仅仅是非管理员执行的活动用户。
我正在浏览我们的一个数据库以回答老板的问题,我偷看了一个存储过程。像往常一样,我在 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。任何见解表示赞赏!
我有一个查询,它首先计算要返回的行数,如果它低于限制,则返回这些行,否则不返回任何内容。
对于上下文:我有一张地图,仅在某个缩放级别后才显示一些点。但是,我的用户现在希望地图只要屏幕上有空间就显示点,而不是具有预定义的最小缩放级别。这意味着现在每当他们在地图上移动时,我都会有两个查询,而不是一个:一个是知道有多少项目,另一个是实际返回它们。负载可能会翻倍。我想过这样做:
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 在同一个索引上搜索了两次:
它当然也在两个搜索中读取相同数量的行。有没有办法删除那些重复的搜索?或者是否有另一种更理想的方式来做我正在尝试的事情?
2 天前,我创建了一个需要INSERT和的函数,UPDATE我XP_CMDShell通过运行脚本启用并执行它。
之后,SQL Server 的SELECT命令运行速度非常慢。即使SELECT是INSERT通过分隔命令运行的非常简单的语句。
我在其他数据库上测试了这种行为,它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) 我有一个包含数百万行的大型事实表,称为 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-2017 ×10
sql-server ×9
audit ×1
clustering ×1
columnstore ×1
datatypes ×1
filegroups ×1
functions ×1
index-tuning ×1
listener ×1
logs ×1
t-sql ×1
timestamp ×1
xp-cmdshell ×1