我们有一个按日期列分区的表。表的主键是此日期列和其他 4 个列的组合键。
我们正在考虑从该表中删除主键约束并简单地创建一个新的非聚集索引。
由于分区列是主键的一部分,如果我们删除主键约束,分区是否会受到影响?
我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 假设我有一个由以下 SQL 定义的视图:
SELECT t1.id, t2.name, t3.address
FROM Table1 as t1
INNER JOIN Table2 t2
ON t1.id = t2.tID
INNER JOIN Table3 t3
ON t1.id = t3.tID
Run Code Online (Sandbox Code Playgroud)
据我所知,如果我在这个视图上创建一个索引,那么数据将被持久化,但我不清楚究竟是什么被持久化了。假设我在 t1.id 上创建了一个唯一的聚集索引,是否将所有三列都保存到磁盘中,或者是否仍会在运行时计算从 table2 和 table3 中提取的值?
如果其中任何一个没有意义,或者我是否遗漏了任何重要内容,请告诉我。
可能的重复:
为什么事务日志不断增长或空间不足?
我的 .ldf 文件大小不断增加。我已经尝试缩小它,但在那之后它又长出来了。我怎样才能永久限制文件大小甚至完全禁用它(因为我认为我永远不会使用它)。
我在 sqlskills.com 上使用此博客作为练习在事务日志备份中查找相关 LSN 以进行时间点恢复的指南。
备份事务日志后,我尝试使用以下命令读取它:
SELECT COUNT(*) FROM fn_dump_dblog (
NULL, NULL, 'DISK', 1, 'D:\TEMP\test_tlog2.bak',
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, …Run Code Online (Sandbox Code Playgroud) sql-server-2008 sql-server sql-server-2008-r2 restore transaction-log
我已经使用下面的查询来获取运行 SQL Server 的历史查询,但它没有给我整个历史,它只返回几乎每小时运行近 1/2 的查询。我想在一周前运行查询。有什么解决办法吗?
SELECT dest.text, deqs.last_execution_time
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE dest.text NOT LIKE '%dest.text%'
order by deqs.last_execution_time desc
Run Code Online (Sandbox Code Playgroud) 谁能建议我如何检查具有相同数据的多行?
例如
我有 2 行具有以下值:
Cola Colb Colc
TYPE_APPLE 123 abc
Colb Colb Colc
TYPE_APPLE 123 abc
Run Code Online (Sandbox Code Playgroud)
我想编写一个 SQL 查询,它不会选择包含与上述相同数据的多行数据。我应该如何编写查询?
我在一个数据库中有 50 多个表。
我不想在数据库中的每个表上使用以下 SQL。
select * from {table_name}
Run Code Online (Sandbox Code Playgroud)
那么,是否可以使用 sql 显示同一数据库中每个表的前 10 条记录?
这是 IT 资产的库存数据库。所使用的模型经过修整,以专注于手头的问题。使用 SQL Server 2008。感谢您抽出时间阅读并提供您可以提供的任何输入。
我的设计包括一个Device表格,其中包含可以输入库存的各种设备。每个设备都有一个布尔标志,CanNetwork表明设备是否具有网络能力,例如,对于大多数计算机CanNetwork = true,对于硬盘驱动器CanNetwork = false;有些打印机是真的,有些是假的。你明白了。
该CanNetwork字段确定创建库存记录时与网络相关的信息是否相关。
我的第一个设计在表上使用索引Device.DeviceID并Device.CanNetwork在外键约束中使用Asset。

NetworkStatus在此设置中,该表如下所示:
+----------------------------------------------------------------------+
| NetworkStatusID | NetworkStatus | NetworkStatusDescription |
|----------------------------------------------------------------------|
| 1 | Connected | Device connected to network. |
| 2 | Not Connected | Device not connected to network. |
| 3 | Do Not Connect | Do not connect device to network. |
+----------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
我在Asset …
也许重复,但我相信我的情况有点不同。从我在 SQL Server Central 上得到的这篇文章的答案之一,它也很方便,但不是完全相同的场景:继承数据库时要做的 9 件事
几周前开始了一份新工作。我应该担任 BI 分析师和 SQL 开发人员。但就在第一次任务中,大家注意到一般来说一切都需要很长时间才能执行。问第一天指导我的人,我的主管你可以说,他告诉我他们知道数据库是一团糟。问我是否可以看一看可以做些什么,得到了肯定的回答。
所以我开始深入研究,使用几个非常方便的脚本,例如:
正如他们告诉我的那样,我发现一团糟。例如,blitzindex 过程返回近 2000 行,其中包含大量重复索引、NC 索引,包括表中的所有列、大量堆表、非常宽的索引等等。至于备份,几个星期以来一直没有完成,询问它,IT 人员只是每晚将数据库复制到不同的服务器。几个数据库超过 100Gb,其他几个也接近这个大小。每张桌子的统计数据每天都会更新。在不太大的表(只有几百万行)上,有些报告需要一个多小时才能完成。等等。
作为测试,我花了几天时间调整几个大表以及使用它们的不同过程和查询。使用分析器准备基线。然后做了一些更改并再次运行测试查询。正如预期的那样,一个现在需要大约 8 分钟的报告在大约 1 分钟内运行,而其他几个查询现在也只用了不到一半的时间。所有这些更改都是在测试服务器上完成的,我们还有一个报告服务器和一个生产服务器。
考虑到我应该是一名 BI 和 sql 开发人员,在办公室拥有有限的新权限,而不是 DBA。为了应对这种情况,您还建议我采取哪些其他措施?有一个指定的 DBA,但似乎只是一个做一些 dba 任务的 sql 开发人员。有 DBA,但他们告诉我他大约在半年前离开了。我应该忘记这些问题吗?或者作为一个大量使用数据库的人,我必须指出问题并提出解决方案?有人遇到过同样的情况吗?
编辑
谢谢大家的评论和回答。我发这个问题已经一个月了。所以现在我可以指出更准确的问题。
我相信索引是主要问题之一,但完全禁止删除索引,至少目前是这样。即使存在具有多个相同索引的关键情况,例如在其中一个主表上,大约有 3000 万行并且还在增长,也有 3 个 NC 索引,其中包含 7 个索引列并包括所有列。我可以在非常严格的监督下创建索引,但仅此而已。
有几个禁用的索引,它们会影响 CRUD 操作的性能吗?
“优步观点”综合症。在另一个视图中的另一个视图中有很多视图。关于这一点的一些建议?
许多 sp 在 SMSS …
sql-server-2008 ×10
sql-server ×6
index ×3
foreign-key ×1
performance ×1
powershell ×1
restore ×1
smo ×1