我有一个 3rd 方应用程序,它使用一个游标来更新我的 SQL Server 2014 表中的行。我无法修改此代码,因此设计了一种方案,将光标指向具有INSTEAD OF UPDATE触发器的视图,我可以在其中拦截并完全控制更新。我很清楚游标是邪恶的,但我不得不使用它们,因为我无法修改源程序。
当UPDATE ... WHERE CURRENT OF语句执行,它执行聚集索引扫描,而不是寻求以定位光标当前所指向的记录。我无法确定优化器在可能进行搜索时为什么要进行扫描。我相信它是导致问题的光标 + 视图 + 而不是更新触发器的组合,因为如果我从我的测试中删除这 3 个变量中的任何一个,索引查找就会被正确使用。
请注意,表中有多少行并不重要;优化器总是根据执行计划使用扫描。我什至删除了触发器中的所有逻辑以进一步简化测试。
下面是一些简单的代码来重现这个问题:
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](40) NULL,
CONSTRAINT [PK_Person_Id] PRIMARY KEY CLUSTERED ( [Id] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])
ON [PRIMARY]
GO
CREATE VIEW [dbo].[vPerson]
AS SELECT Id, Name FROM dbo.Person …Run Code Online (Sandbox Code Playgroud) 将数据库迁移到具有默认排序规则 Latin1_General_CI_AS 的新 2014 服务器后,但在大多数数据库的排序规则为 Latin1_General_BIN 的情况下,尝试导入 Excel 电子表格会引发以下错误:
我已经将 sysdac_instances 跟踪到 msdb,它是一个系统视图,直接查询它会给出相同的错误。我希望有人能够指出我对这个问题的直接解决方案的方向?
奇怪的是,通过 SSMS 2008 运行导入是有效的。
我有一个不会在生产服务器上运行但它在测试服务器上运行的查询。查询计划似乎无法编译或编译的查询计划非常糟糕。我已经用全扫描更新了所有统计信息,并重建了所有相关表的索引,但没有成功,任何表中的行都没有那么多。我无法更改查询,因为它是 AOS (AX 2012) 创建的。我应该怎么做才能按原样使用查询?
DECLARE @P1 AS BIGINT = 5637144576
DECLARE @P2 AS NVARCHAR(4) = N'1003'
DECLARE @P3 AS INT = 212
DECLARE @P4 AS BIGINT = 5638885273
DECLARE @P5 AS BIGINT = 5637144576
DECLARE @P6 AS INT = 865
DECLARE @P7 AS BIGINT = 5637144576
DECLARE @P8 AS BIGINT = 5637144576
SELECT t1.balance01,
t1.recid,
t2.amountcur,
t2.dataareaid,
t2.recid,
t3.recid,
t3.voucher,
t3.accountnum,
t3.approved,
t3.closed,
t3.dataareaid,
t4.party,
t4.dataareaid,
t4.recid
FROM spectrans T1
CROSS JOIN custtransopen T2
CROSS JOIN custtrans T3 …Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan sql-server-2014 query-performance
当我运行以下脚本时:
begin transaction
select XACT_STATE()
select @@TRANCOUNT
begin transaction
select XACT_STATE()
select @@TRANCOUNT
begin transaction
select XACT_STATE()
select @@TRANCOUNT
rollback
select XACT_STATE()
select @@TRANCOUNT
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
那么一个单一的回滚语句可以回滚任意数量的事务?
那么写以下内容是没有意义的:
while @@TRANCOUNT > 0
rollback
Run Code Online (Sandbox Code Playgroud) 我正在运行从 INT 到 BIGINT 的更改列,我的表大小为 250 GB,1 小时后我收到版本存储错误,因为 tempdb 已满。
据我所知,它只需要您的内存页和日志文件,但我不确定 Tempdb。有人可以解释一下这个内部结构吗?
我正在使用读提交隔离。
select
name,
snapshot_isolation_state_desc,
is_read_committed_snapshot_on
from sys.databases
Run Code Online (Sandbox Code Playgroud)
...对于这个数据库返回:
名称:数据库名称 Snapshot_isolation_state_desc :关闭 is_read_committed_snapshot_on : 0
我有一个大约 10 亿行的表。然后我创建一个索引如下:
CREATE NONCLUSTERED INDEX [IX_Index1]
ON [dbo].[MyTable]( [CustomerID] ASC ) -- CustomerID is uniqueidentifier
WITH (DATA_COMPRESSION=PAGE);
Run Code Online (Sandbox Code Playgroud)
这会产生 9.15GB 的索引(压缩),但是在创建索引时事务日志从空变为 158GB(没有其他数据库活动)。为什么使用的日志空间量远高于索引的结果大小?
数据库是可用性组中处于完全恢复模式的 SQLServer 2014 Enterprise。
更新
我删除并使用选项重新创建了索引SORT_IN_TEMPDB = ON。DB tlog 的事务日志写入结果为 10.4GB,tempdb tlog 为 1.27GB。
我从第一台服务器(运行 SQL Server 2014)备份了一个数据库。
当我尝试将备份恢复到第二台服务器(运行 SQL Server 2012)时,我收到以下警告消息:
警告消息 - 将进行源数据库的尾日志备份。查看选项页面上的设置。
如果我忽略此消息并尝试恢复,则会失败。
任何的想法 ?我该怎么办 ?
我有一个独特的问题(至少对我而言),我已经以一种方式解决了这个问题,但如果可能的话,我想要一种更简单的方法:)
我经常需要用过去的日期来测试我们的 Windows 应用程序。我们的应用程序查询使用 GETDATE 的 SQL 服务器。
我已经设置了一个带有我们的应用程序和 SQL 服务器的虚拟机。通过powershell执行以下操作后,我可以根据需要向后或向前更改系统日期:
它似乎工作得很好 - 我们的应用程序和 SQL 服务器都无法区分。
如果我需要将日期重置回当前,我只需重新启动 Windows 时间服务。简单。
但是,在某些时候设置它需要一些努力,并且想知道是否有办法让SQL 服务器或单个数据库根据需要认为它是不同的日期?
因此,对于单个数据库,也许我可以设置一些属性,以便将 GETDATE 调用移回某个时间段。
我知道所有的延伸,但如果有人有任何其他想法,我会全神贯注。
不幸的是,我们的开发人员无法更改应用程序来简化这一切。
我正在执行下面的查询,但我遇到了问题。
注意:SQL 2008 R2 和 SQL 2014 在 Win 2008 R2 和 Win 2012 R2 上使用两个差异服务帐户运行。TCP 端口、防火墙端口都与远程连接一起启用,我能够在本地机器上执行代码(例如:如果我连接到 SQL 2008 R2 机器并在 SQL 2008 R2 上执行成功,如果我连接到 SQL 2014 机器成功在 SQL 2014 上的 SSMS 上。问题仅在我连接到 SQL 2008 R2 并在 SQL 2014 上执行时出现。当我删除注释部分时,我能够使用 SQLCMD 成功执行代码。)我不知道这有任何兼容性问题案件。
Msg 121, Level 20, State 0, Line 0
从服务器接收结果时出现传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。)
但是当我删除注释部分并执行查询时,它在几秒钟内成功运行。请让我知道评论部分有什么问题。我在下面粘贴了 T-SQL 查询。
/********************************************************************************
* Summary: Creates source database schema for BCP Import. Only created PK on the tables
* No other constraints are replicated
* …Run Code Online (Sandbox Code Playgroud) 我正在寻找解决方案或工作流程。以下是我在使用独立服务器时进行数据库部署的方式:
我想对可用性组中的数据库执行类似的过程,但从备份或快照还原不是理想的选择,因为数据库相当大,我必须先将数据库从 AG 中取出。这是我正在寻找的理想解决方案类型:
有没有可行的方法来做到这一点?
我会使用BEGIN/ ROLLBACK TRANSACTION,但这在自动构建过程中更难实现,并且考虑到我想在提交或回滚之前首先检查结果(来自不同的数据库连接)。
sql-server-2014 ×10
sql-server ×8
performance ×2
restore ×2
alter-table ×1
collation ×1
cursors ×1
index ×1
msdb ×1
snapshot ×1
t-sql ×1
tempdb ×1
transaction ×1
trigger ×1