我有一个启用了 RCSI 的 SQL Server 2016 数据库,它实际上是一堆堆。除了一张表之外,数据库中的所有其他表都是一个堆,最大的堆约为 200GB,占数据库总大小的 50% 以上。
\n\n这个特定的大堆有两个 lob 列,均为 varbinary(max) 数据类型。堆还有许多非聚集索引,幸运的是 varbinary(max) 列不存在于任何这些非聚集索引中,因此它们的大小相对较小。
\n\n供应商提供了一个清理脚本,该脚本从应用程序服务器运行并从这个大堆中清除数据。经过一番调查,我发现此清理脚本不会删除整行,而是根据某些条件将 varbinary(max) 列之一设置为 null。
\n\n以下是有关堆的一些详细信息:
\n\n\n\nSELECT * FROM sys.dm_db_index_physical_stats(DB_ID(N\'<database>\'), OBJECT_ID(N\'GrimHeaper>\'),0, null, \'DETAILED\');\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\nSELECT * FROM sys.dm_db_index_operational_stats(db_id(\'<database>\'),object_id(\'GrimHeaper\'),0,null);\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\n\n我对这种情况的理解是,通过将 lob 列中的值设置为 null 释放的空间不会自动重新声明,无论表是堆还是聚集表,都是这种行为,如果我错了,请纠正我。
\n\n在这篇 Microsoft文章以及这篇文章中,它阐述了以下有关索引重组操作的内容:
\n\n\n\n\nREORGANIZE ALL 对所有索引执行 LOB_COMPACTION。对于每个索引,这会压缩聚集索引、基础表中的所有 LOB 列或非聚集索引中包含的列。
\n\n指定 ALL 时,将重新组织与指定表或视图关联的所有索引,并压缩与聚集索引、基础表或包含列的非聚集索引关联的所有 LOB 列。
\n
我觉得这些说法含糊不清,不是很清楚。任何人都可以确认,如果我运行 \xe2\x80\x9cALTER INDEX ALL ON REORGANIZE WITH …
我有一个 TSQL 视图,可以在 SQL Server 2016 环境中处理多个 GB 的数据。在此视图中,我多次比较 DateTime 值是否在静态日期之前/之后,传统上表示为字符串文字,如'2018-07-11'.
一个比较的例子是:
SELECT MyId, MyValue FROM MyTable WHERE MyDate = '2018-07-11'
Run Code Online (Sandbox Code Playgroud)
在寻找使用 DateTime 文字而不是字符串的方法时,我遇到了使用 ODBC DateTime 字符串的示例,如下所示:
SELECT MyId, MyValue FROM MyTable WHERE MyDate = {d '2018-07-11'}
Run Code Online (Sandbox Code Playgroud)
当我比较查询计划时,即使我编写了更高级的查询,我也会得到相同的结果。
我开始使用这种格式是为了防止在查询中将字符串自动转换为 DateTime,但我找不到任何好的文档来解释使用 ODBC 函数的任何副作用。我不确定这是否与字符串文字的行为相同,或者是否被解释为日期。
如果这是一个 UDF 或存储过程,我可以声明一个 DateTime 变量以在查询中使用,但在 VIEW 中这是不可能的,也不可行,因为在查询中有很多 DateTime 文字。查询的实际版本。
总之,是否有人有任何具体理由支持 或 反对使用这种{d '2018-07-11'}格式(除了它在非 SQL Server 环境中可能无效之外)?
我想确保我不会在代码审查中搬起石头砸自己的脚。
PS:对于模糊的例子和半开放式的问题,我深表歉意,我不允许透露任何实际的源代码。
谢谢!
编辑:我忘了提及我也可以使用DATEFROMPARTS(2018, 07, 11),但我不确定查询优化器是否会奇怪地看待它。
时态表是 中及以上版本的一个新功能SQL Server 2016,它就像一种SQL Server自动保存表中数据历史记录的有趣方法,但是引入了一些新的 T-SQL 语法SQL Server 2016来支持时态表。我对其中一些人产生了误解。
从官方文档来看,其描述BETWEEN <start_date_time> AND <end_date_time>如下:
与上面的 FOR SYSTEM_TIME FROM TO 描述相同,只是返回的行表包含在端点定义的上边界上变为活动状态的行。
其描述CONTAINED IN (<start_date_time>, <end_date_time>)如下:-
返回一个表,其中包含在 CONTAINED IN 参数的两个日期时间值定义的指定时间范围内打开和关闭的所有行版本的值。包括恰好在下边界处变为活动状态或恰好在上边界处停止活动的行。
CONTAINED IN (@start,@end)所以我明白,和BETWEEN子句之间唯一的区别是CONTAINED IN (@start, @end)包括@start边界,而BETWEEN子句则不包括。我对吗?
当我运行以下过程时:
SELECT * FROM msdb.dbo.sysproxies
Run Code Online (Sandbox Code Playgroud)
我注意到我的代理帐户之一未启用(与此相关)。我想创建一个脚本来启用所有已禁用的代理帐户,但我的理解是您需要删除该帐户并重新创建它才能重新启用它。在此过程中,您需要了解链接的凭据、描述和链接的子系统。
有没有办法在不删除代理帐户的情况下执行此操作,也许是某种简单的更新语句?
我的团队计划从 SQL Server 2014 迁移到 2016。目前,SSIS 包是在 VS 2013 中创建的,并部署在 SQL Server 2014 上。为了测试,我尝试在 SSMS 17.3(集成服务 13.0)中部署该包。该包已成功部署,但当我尝试验证该包时,出现以下错误:
在阅读了互联网上的一些解决方案后,我从以下路径部署了包:
%ProgramFiles%\Microsoft SQL Server\130\DTS\Binn
Run Code Online (Sandbox Code Playgroud)
包已成功验证(无需修改 ispac 文件)。据我了解,脚本任务是在 VS 2017 中使用 VSTA 主要版本 15 创建的。我尝试在 VS 2015 中打开解决方案,并使用 SQL Server 2017 作为目标服务器重建解决方案。在 SSMS 17.3 上部署包之前,我确保 dtsx 文件包含 15 个 VSTA 主要版本。
验证后,我在 SSMS 17.3 上部署了该包,它使用以下路径:
%ProgramFiles%\Microsoft SQL Server\140\DTS\Binn
Run Code Online (Sandbox Code Playgroud)
我验证了该包,但遇到了同样的错误。根据我的理解,如果我通过选择 SQL Server 2017 作为目标版本来构建解决方案,它应该能够成功验证。如果我想使用SSMS 17.3进行部署,如何解决这个问题?
sql-server ssis visual-studio sql-server-2014 sql-server-2016
如何查找表中插入的行数以及最近更新的行数?今天我们有一个数据仓库存储过程,它更新了一个表。我不关心哪些行,只关心每个事务的计数(插入/和更新)。我们的数据库没有 CDC/或 CT。有没有办法查询 Sys DMV 或日志?我正在继承遗留代码,因此将来会添加手动日志记录,只是好奇 SQL Server 是否在任何地方都有此自动日志记录。
当我尝试时,EXEC sp_helptext 'dbo.VW_myname'我得到以下信息:
对象“dbo.VW_myname”没有文本。
NULL当我查看视图的定义时,我得到:
select definition
from sys.objects o
join sys.sql_modules m on m.object_id = o.object_id
where o.object_id = object_id( 'dbo.VW_myname')
and o.type = 'V'
Run Code Online (Sandbox Code Playgroud)
我的问题有两个:为什么我看不到创建该视图背后的文本以及如何找出它是如何执行的?
我有以下查询:
DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000'; -- 1st December 2019
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)
结果
DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000'; -- 1st December 2019
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)
我预计结果是2019-12-01 00:00:00.000(2019 年 12 月 1日)- 由于某种未知原因,月份和日期交换了。
直到最近,我对这种格式还没有遇到过任何问题。
如何以“YYYY-MM-DD HH:mm:ss.000”格式输入日期,并在分配给变量/在选择中显示后保持该格式?
什么设置决定了可能已更改的格式?
潜在有用的信息
dbcc useroptions
Run Code Online (Sandbox Code Playgroud)
结果:
2019-01-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
我尝试过的事情:
查询1
将日期更改为如果交换则无效的日期
DECLARE @someDateTime DATETIME = '2019-12-20 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)
结果:
消息 242,级别 16,状态 3,第 4 行
varchar 数据类型到日期时间数据类型的转换导致值超出范围。
查询2
声明变量后设置变量
DECLARE @someDateTime DATETIME;
SET @someDateTime = '2019-12-01 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)
结果 …
现在我发现了这个很棒的string_split()函数,然后我了解到输出行可能按任何顺序排列。不保证顺序与输入字符串中子字符串的顺序匹配。。这使得该功能对我来说毫无用处。
也许有解决方法吗?
编辑 -示例:
SELECT value FROM String_Split('b,a,c', ',')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望按以下顺序得到结果:
value
------
b
a
c
Run Code Online (Sandbox Code Playgroud)
不过,根据微软的说法,这个订单并没有得到保证。那么我怎样才能准确地得到这个结果呢?
sql-server split sql-server-2016 azure-sql-database sql-server-2017
sql-server-2016 ×10
sql-server ×8
sql ×4
ssis ×2
blob ×1
datetime ×1
heap-table ×1
lob ×1
odbc ×1
split ×1
sql-agent ×1
standards ×1
toolbox ×1
transactions ×1