我正在尝试填充服务包是否需要更新的列(版本状态)。我创建了一个查找表,其中列出了 SQL 版本和最新产品版本,例如 SQLVersion LatestSP SQL Server 2016 13.0.5026.0
然后,我有第二个表,其中包含产品版本,并希望将此值与 LatestSP 值进行比较,如果第一个表中的值小于第二个表中的值,则 SP 不是最新的。我需要指定两个表中的产品版本以 X 开头(即 SQL 2014 以 12 开头,SQL 2016 以 13 开头),然后比较数字(这样我只比较正确的版本),如果值Servers 中的值小于 SPLookup 中的值,然后使用“NEEDS UPDATING”填充 versionstatus 列。但是,我在将 sql_variant 转换为 varchar 以便能够选择前 2 位数字时遇到问题。
这是我到目前为止所拥有的,并将其推断到其他版本。Servers 表中的productversion 是sql_variant,SPLookup 中的LatestSP 是varchar。
INSERT INTO Servers
(versionstatus)
SELECT CASE WHEN LEFT(X.productversion, 2) = '12' AND LEFT(Y.LatestSP, 2) = '12' AND X.productversion < Y.LatestSP THEN 'UPDATE NEEDED'
WHEN LEFT(X.productversion, 2) = '12' AND LEFT(Y.LatestSP, 2) = '12' AND X.productversion >= Y.LatestSP THEN …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 中,索引视图是一个充满限制的地狱。但我需要一个。我有一个格式化程序 SQLCLR 函数,它创建域密钥的美化版本 - 用户希望能够搜索该美化版本的子字符串。因此,我需要持久计算列或物化视图上的全文索引。
但是,格式化程序依赖于存储在多个表中的数据。
因此,这适用于视图,但不适用于持久计算列,因为它们无法从多个表进行查询。
我的 SQLCLR 方法是精确且确定的,因此它应该适合在索引视图中使用,但索引视图的索引键中不能包含 SQLCLR。
我可以使用 T-SQL 函数重新实现我的格式化程序FORMAT...但也与索引视图不兼容FORMAT。
索引视图可以做任何事情吗? 曾经?
如果有人可以向我推荐一份关于最佳实践的好文档,我对“使用触发器滚动你自己的物化视图”方法持开放态度。上次我尝试时,它失去了控制,并且插入和更新代码与初始化之间存在巨大的重复。
我是否缺少某种方法来对几百万行的计算数据进行高性能文本搜索,而不使用物化/索引视图或持久计算列?
格式化程序不执行数据访问。但是,我需要输入格式化程序以使其有用的数据将来自多个表(具有良好的常规联接),因此我无法使用持久计算列来解决此问题。我无法为 SQLCLR 列设置键,因此无法在全文索引中使用它。
我以为这很简单。持久列和索引视图旨在在写入时执行计算,并正确实现观察者模式,以便对其依赖项的更改反映在计算值上。
*编辑:结果证明这里的答案中没有任何解决方案,我在Python中使用SQLAlchemy,它是一个ORM。我在事务中执行下面的删除语句,但从未提交它。这导致发生大约 10 个打开的事务,最终所有事务都需要回滚,从而锁定整个表,直到回滚完成。
给定以下表结构,将使用最近日期时间的 update_time 连续插入记录。与数据库的单独连接会定期修剪日期超过 2 周的旧记录。
表结构:
以下插入运行非常频繁,具有不同的值:
重复以下删除语句直到需要为止,然后立即运行 select 以查看该过程是否完成
delete top(5000) from trade_options with (READPAST) where update_time < '<Two Weeks Ago>'
Run Code Online (Sandbox Code Playgroud)
活动监视器显示删除正在锁定,插入正在等待(LCK_M_IX):
谢谢
**编辑:这是作为脚本输出的索引/键
CREATE NONCLUSTERED INDEX [IX_order_option] ON [dbo].[order_option]
(
[update_time] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[order_option] ADD PRIMARY KEY CLUSTERED
(
[exchange_id] ASC,
[symbol] ASC,
[update_time] ASC
)WITH (PAD_INDEX = OFF, …Run Code Online (Sandbox Code Playgroud) 具有 SQL Server Integration Services 包步骤的 SQL 代理作业失败并显示以下消息:
以用户身份执行:DOMAIN\SQLAGENTACCOUNT。适用于 64 位的 Microsoft (R) SQL Server 执行包实用程序版本 13.0.4259.0 版权所有 (C) 2016 Microsoft。版权所有。指定的报告选项无效。仅允许 E、W、I、C、D、P、V 和 N。命令行参数无效。这一步失败了。
当我重新索引特定表时
\n\nDBCC DBREINDEX(@TableName, \'\',90) \nRun Code Online (Sandbox Code Playgroud)\n\n我收到一个错误
\n\n\n\n\n级别 17,状态 2,过程 aareindex,第 21 行 [批处理起始行 0]\n 无法为对象 \xe2\x80\x98dbo 分配空间。SORT 临时运行存储:\n 数据库 \xe2 中的 422738479742976\xe2\x80\x99 \x80\x98mydatabase\xe2\x80\x99 因为 \xe2\x80\x98PRIMARY\xe2\x80\x99\n 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。
\n
所以我想尝试增加 TempDb 的大小
\n\n我可以通过查看数据库属性使用 SSMS 查看大小,但我不知道如何设置它。
\n\n[更新]
\n\nselect type_desc, name, size, max_size, growth from tempdb.sys.database_files\nRun Code Online (Sandbox Code Playgroud)\n\n回报
\n\n\n\n文件大小已为 10236 Mb,Express 限制为 10 Gig\n但是磁盘使用情况报告显示 26% 的磁盘空间未分配,40% 为数据,32% 为索引。
\n在SQL Server中,我们如何在查询执行后查看其实际执行计划?
据我所知,只有估计的执行计划(而不是实际的执行计划)存储在计划缓存中。那是对的吗?
注意:我们没有任何第三方监控工具。
Azure VM (IaaS) 上托管的 SQL Server 中是否存在数据库邮件?
如果不支持 DB 邮件,那么可以使用哪些功能?
我已经安装了 SQL Server 2019 RC1,但无法创建快照。当我运行快照代理时,我不断收到相同的消息:
2019-10-30 12:32:41.59 Microsoft (R) SQL Server Snapshot Agent
2019-10-30 12:32:41.59 [Assembly Version = 15.0.0.0, File Version = 15.0.1900.25]
2019-10-30 12:32:41.59 Copyright (c) 2016 Microsoft Corporation.
2019-10-30 12:32:41.59 The timestamps prepended to the output lines are expressed in terms of UTC time.
2019-10-30 12:32:41.59 User-specified agent parameter values:
2019-10-30 12:32:41.59 --------------------------------------
2019-10-30 12:32:41.59 -Publisher DB100
2019-10-30 12:32:41.59 -PublisherDB REF3_DB
2019-10-30 12:32:41.59 -Publication REF3_PDR4
2019-10-30 12:32:41.59 -Distributor DB100
2019-10-30 12:32:41.59 -DistributorSecurityMode 1
2019-10-30 12:32:41.59 -XJOBID 0xA694274CD89FAF418C8B059F22C01B85
2019-10-30 …Run Code Online (Sandbox Code Playgroud) 每当我编写动态 SQL 时,我通常会PRINT @DynamicSQL在该语句正上方的注释中包含一条语句EXEC sp_ExecuteSQL @DynamicSQL,以便在需要时可以轻松读取和调试动态 SQL。
我意识到 PRINT 语句在截断字符串之前有 8,000 个字符的限制。我知道我可以循环遍历我的 @DynamicSQL 变量,将 8,000 划分为它的长度,并每次迭代打印每个 8,000 块,但是随后您会丢失 @DynamicSQL 中的语句跨两个块的格式,这违背了我的目的。
有没有人找到更好的方法来在打印超过 8,000 个字符的字符串时保留格式?...也许通过自定义函数或过程?
目标:
删除三个表中数十亿条旧记录(大约 600GB),停机时间为零。
方法论和背景:
我计划一次删除与 100 万个 MyID 关联的批量记录(即 MyID 介于 1 和 1000000 之间)。当删除运行时,其中两个表将非常热,但第三个表上的活动可以安全地暂停。在两个热表中,MyID是聚簇键。在第三个冷表中,我在 MyID 上有一个非聚集索引。
除了 DELETE 操作之外,热表中的其他活动将包括 INSERT,可能每秒几次。MyID 是一个 IDENTITY,新插入的记录不会在任何 DELETE 批次的范围内。
如果有助于了解潜在性能,则在由 MyID 聚集的表上对这些行的样本批次进行聚合的 SELECT 花费的时间不到 1 秒,而在非聚集的表上则花费大约 2 秒。我没有这个特定数据库的产品副本可供使用,所以我不能说删除需要多长时间,但是一旦我将其部署到 DEV,我就会有一个更好的想法。
旁注:为了解决日志大小问题,我将这些批次包装在事务中,并将 TLog 备份频率从 15 分钟提高到 5 分钟。我有 150GB 的可用日志空间。
问题
我在 MS 文档中读到:
默认情况下,DELETE 语句始终在其修改的表上获取排它 (X) 锁,并保持该锁直到事务完成。
我对使用锁定提示非常谨慎,但在这种情况下我可以安全地使用锁定提示来避免 TABLOCKX 吗?除了锁定提示之外还有其他方法可以避免 TABLOCKX 吗?
sql-server ×10
locking ×2
azure ×1
azure-vm ×1
delete ×1
replication ×1
sql-clr ×1
ssis ×1
ssms ×1