我刚刚了解了新的 sp_executesql 存储过程。我喜欢有一种方法可以从 SQL Server 中执行参数化代码。
但是,我想知道在没有任何参数时使用 sp_executesql 存储过程与直接调用 EXEC 之间有什么区别。另外,是否有性能影响?
exec('select * from line_segment')
exec sp_executesql N'select * from line_segment'
Run Code Online (Sandbox Code Playgroud)
另外,2005 年和 2008 年之间是否存在差异,或者它们的处理方式是否相同?
我有一个 SQL Server 2005 开发数据库,它是一个 30GB 的 live 副本。我们删除了一些开发中不需要的数据,这使得使用的数据文件空间降到了 20GB。所以我们有大约 33% 未使用。
我需要回收空间,这将允许我们在服务器上拥有第二个开发数据库(基于缩减版本);但是,我无法收回空间,我已完成以下操作:
文件的初始大小SMS2_Data为 30GB。
DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)
其次是
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Run Code Online (Sandbox Code Playgroud)没有喜悦。我尝试进行备份,创建一个初始大小较低的新数据库,然后恢复,但初始大小被覆盖时并不高兴。也试过:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Run Code Online (Sandbox Code Playgroud)
这错误,说:
修改文件失败。指定大小小于当前大小。
我尝试了 20800,然后一直上升到 29000(29GB),但它仍然不让我改变它。
完成了收缩,然后将恢复模式从FULL到SIMPLE和再更改回来。没有喜悦。
我认为这与某些TEXT领域有关。我们在整个系统中大约有 6 个。因此,作为测试,我将它们全部删除,然后对文件进行了缩小,但仍然没有变化。
剩下的唯一选择是将数据重新导入另一个数据库。这是不切实际的,因为它必须在实时数据库上完成,这会带来太多风险。我们半定期地获取实时数据库的副本并覆盖开发/测试。我们有大约 500 张桌子。我想要一种不会将数据导出到新数据库的风险的方法。
我尝试将数据移动到另一个文件,它复制了除 5% 之外的所有数据。这就是导致我尝试删除所有文本列的原因。
服务器处于兼容模式 90,但为 SP2。我现在已经完成了以下 3 次:重新索引所有表、备份数据库、收缩文件、收缩数据库。还是没有快乐。
EXECUTE sp_spaceused 返回:
database_name database_size unallocated space
SMS2Tests 31453.94 MB 13903.16 MB
reserved …Run Code Online (Sandbox Code Playgroud) 我想更新我们数据库中的标量函数。此函数用于键表中的多个计算列,因此如果我尝试更新它,则会出现依赖项错误。我可以显式删除列,更新函数并重新添加列,但是,无需过多关注,这将更改列顺序并可能产生其他意想不到的后果。我想知道是否有更清洁的方法?
SQL Server 2005
我需要能够在 900M 记录表中连续处理大约 350M 条记录。我用来选择要处理的记录的查询在我处理时变得严重碎片化,我需要停止处理以重建索引。伪数据模型&查询...
/**************************************/
CREATE TABLE [Table]
(
[PrimaryKeyId] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[ForeignKeyId] [INT] NOT NULL,
/* more columns ... */
[DataType] [CHAR](1) NOT NULL,
[DataStatus] [DATETIME] NULL,
[ProcessDate] [DATETIME] NOT NULL,
[ProcessThreadId] VARCHAR (100) NULL
);
CREATE NONCLUSTERED INDEX [Idx] ON [Table]
(
[DataType],
[DataStatus],
[ProcessDate],
[ProcessThreadId]
);
/**************************************/
/**************************************/
WITH cte AS (
SELECT TOP (@BatchSize) [PrimaryKeyId], [ProcessThreadId]
FROM [Table] WITH ( ROWLOCK, UPDLOCK, READPAST )
WHERE [DataType] = …Run Code Online (Sandbox Code Playgroud) 每个月我们都会制作生产数据库的月末快照。这些月末快照严格用于报告目的,没有对其进行任何插入、更新或删除。这些快照中的每一个都有一个.MDF和.LDF文件。
我想删除.LDF文件并释放服务器上的一些空间。我需要保留.LDF文件有什么原因吗?
澄清:
我们的生产数据库每晚从另一个系统的文件提取中重新创建。我们只报告生产数据库......从来没有更新过。
每晚流程:据
我所知......
每天晚上数据库表都会被截断
这些表通过一系列批量插入语句填充
索引被重建
我遇到了一个死锁场景,死锁的唯一参与者似乎是一个表和一个从该表中删除的存储过程。我根据对其中几个死锁时的 sql 错误日志的分析得出了这个结论,并使用下面的 MSDN 文章作为破译错误日志中的跟踪的指南。
下面定义了表 DEXTable 和存储过程 ClearDEXTableRows。还有另一个存储过程 InsertDEXTableRow 将行插入 DEXTable,但是根据 sql 错误日志中的条目,该过程似乎没有涉及死锁。
DEXTable 中有大约 830 万行,并且趋于稳定增长。受访者表也很大,并且趋于稳定增长。
它是从具有频繁快速连续调用 ClearDEXTableRows 和 InsertDEXTableRow 的页面的高流量网站访问的。
在过去的 10 天内,每天发生 0 到 9 次死锁。
我已经为 1222(使用 DBCC TRACEON 1222)启用了 sql 跟踪,并且最近启用了标志 1204。在检测和结束死锁上有对这些标志的输出的很好的描述
只有这个存储过程 ClearDEXTableRows 是导致死锁的原因是否有意义?
如果是这样,任何人都可以很好地解释这种情况是如何发生的并推荐一种解决方法吗?
我怀疑 DELETE 语句导致 DEXTable 的 PK 争用需要经常重建。
如果没有,我应该启用哪些额外的跟踪来深入挖掘死锁的原因?(我想在这里学习)
-- Table definition
CREATE TABLE [dbo].[DEXTable](
[ExportID] [int] NOT NULL,
[RespondentID] [int] NOT NULL,
[Exported] [datetime] NOT NULL,
CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED …Run Code Online (Sandbox Code Playgroud) 我们使用的是 SQL 2005 Express Edition。我们要从 LDF 文件中读取数据以恢复一些已删除的记录。
我们尝试使用 ApexSQL 的试用版,这对我们有很大帮助。我们不是去寻找第三方软件,而是试图弄清楚如何自己读取日志文件。
我们如何从 LDF 文件中读取和恢复数据?
在阅读这篇关于 SQL Server 中的计划缓存的文章时,我发现了一个我不知道的花絮:
...为了重用,批处理引用的对象不需要名称解析。例如,Sales.SalesOrderDetail 不需要名称解析,而 SalesOrderDetail 则需要,因为在多个架构中可能存在名为 SalesOrderDetail 的表。通常,由两部分组成的对象名称(即 schema.object)为计划重用提供了更多机会。
我正在寻找关于使用两部分对象名称的重要性的一些说明,因为“通常,两部分对象名称为计划重用提供了更多机会。”,但它首先说这是必要的。
更具体地说,我处理的大多数存储过程都在 dbo 模式中,并且只引用 dbo 对象,而没有指定 dbo 前缀。即使所有内容都使用默认模式,这些是否无法重用缓存的查询计划?
我们最近切换到FULL恢复模式,每个周末进行完整备份,每天进行差异化。
问题是,差异备份似乎并不总是有效。作业历史记录中记录的错误消息是
以用户身份执行:用户名。... 9.00.3042.00 为 32 位 版权所有 (C) Microsoft Corp 1984-2005。版权所有。
开始时间:上午 11:20:12 进度:2013-01-25 11:20:13.90 来源:{450389BA-54C2-4892-9CD0-0126CA9B0ED8} 执行查询“DECLARE @Guid UNIQUETEIDENTIFIER”%ECU10sp0.sp完成结束进度错误:2013-01-25 11:20:14.40 代码:0xC002F210
来源:备份数据库(差异)执行 SQL 任务
描述:执行查询“BACKUP DATABASE [MyDatabase] TO DISK = N'E:\Database Backups \MyDatabase_backup_201301251120.diff' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'MyDatabase_backup_20130125112014', SKIP, REWIND, NOUNLOAD, STATS = 10" 失败,出现以下错误:“无法对数据库“MyDatabase”执行差异备份,因为当前的数据库备份不存在。通过重新发出 BACKUP DATABASE 执行完整数据库备份,省略 WITH DIFFERENTIAL 选项。BA... 包执行fa... 步骤失败的。
完整备份作业每次都成功完成,我可以msdb.dbo.backupset使用此处找到的查询查看它,因此我知道它存在。看起来重新启动后,差异备份确实成功完成,直到下一次完整备份。
这是我的工作经历:
1/16 - 完整备份 - 成功 1/17 - 差异备份 - 成功 1/18 …
我是管理 SQL Server 的新手,但我对 SQL 语言和制作 SSIS 包很满意。
我想将数据从 SQL Server 2005 迁移到 2016。
我的问题是我是否需要担心系统数据库和其他对象,例如索引、存储过程、视图、安全性和权限。登录或者我可以只迁移数据。
在这种情况下,这将是推荐的程序。
sql-server-2005 ×10
sql-server ×6
backup ×3
datafile ×1
deadlock ×1
functions ×1
logs ×1
maintenance ×1
migration ×1
primary-key ×1
recovery ×1
restore ×1
shrink ×1
t-sql ×1
upsert ×1