我有一个关于 SQL Server 2008 表设计的一般问题。我们目前有一个超过 600GB 的表,并且每天增长大约 3GB。此表具有适当的 indecies,但在运行查询时正成为主要问题,并且仅因为它的大小。问题是我应该按年和月将表拆分为多个表(这将适合其他部门拆分其大数据集的方式)还是我们应该利用 SQL Server 中内置的分区。使用分区似乎需要较少的代码更改。根据我在分区时阅读的内容,您仍然只查询一张表,服务器处理如何获取数据。如果我们走多表路线,我们将不得不处理从多个表中提取数据。
我知道我可以执行 aDBCC CHECKDB并获取我的数据库的状态。
问题
谁能告诉我在哪里可以找到这些页面 ID?
我有一个集群环境,其中有很多实例。我修改了 xml 文件以允许多个实例使用 ssis。当实例与集群 ssis 位于同一节点上时,一切正常。但是,如果它们位于不同的节点上,则似乎存在身份验证问题,并且会丢失我的凭据。出于某种原因,它尝试使用匿名登录。这是完整的错误:
SSIS 服务配置中指定的 SQL 服务器不存在或不可用。当计算机上没有 SQL Server 的默认实例时,可能会发生这种情况。有关详细信息,请参阅 Server 2005 联机丛书中的“配置集成服务服务”主题。
用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。(MsDtsSrvr)
我很感激任何人在这个问题上的帮助。
谢谢,
在 SQL Server 2005 中,当计划缓存填满时会发生什么?我做了一些研究,从收集的点点滴滴来看,似乎缓存计划被赋予了一个“年龄”,其中包括它的重量或编译成本,乘以自缓存以来运行的次数。随着时间的推移,这个年龄递减,直到它达到 0,当它被认为“老化”并且是需要时冲洗的候选者。当计划缓存填满时,过时的计划将从缓存中刷新。
幕后是否还有其他事情使这种情况复杂化?
谢谢,
马特
我在死锁分析中遇到了死点。根据msdn:
RangeX-X 为 Exclusive range,独占资源锁;在更新范围内的键时使用。RangeI-N 是插入范围,空资源锁;用于在将新键插入索引之前测试范围。
所以我明白,如果我在 2 个键列上有一个索引 - 并且我插入一个新键,我将拥有 RangeI-N 锁,但如果我从索引更新现有键,我将拥有 RangeX-X。
但我的问题或多或少复杂。假设我在 A、B 列和 C 列上有索引 IX_keys_included。
在 Serializable 隔离模式下,我为包含的列 C 插入一个新值。索引 IX_keys_included 是否会有 RangeI-N 或 RangeX-X 锁?实际上,鉴于我为索引中包含的列插入了一个新列,是否会有任何锁定?
在大学期间,我们一直在想不要通过视图更新表,当我进入工作场所时,我们又被告知不要通过视图更新数据库。
在哪里/是否对执行此操作有显着的性能影响?或者这更像是高级开发人员/DBA 告诉初级人员不要这样做的情况,因为他们可能会无意中因不正确的连接而造成严重破坏。
编辑
我使用的是 MSSQL 2000-2008(取决于客户的具体情况)
我有一个大的删除存储过程,并且在删除不会删除任何内容的情况下重现了死锁。
看起来遇到死锁的存储过程的部分是这样的(更改了表名):
DELETE d
FROM Table1 d
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = oeh.EntityId
Run Code Online (Sandbox Code Playgroud)
在我看来,尝试从这个大表中删除时,两个删除操作同时运行并且彼此死锁。对于这些项目,我知道不会有非常大的表 table1、table2、table3 的记录。
我想知道这是否可以通过更改为:
DELETE d
FROM Table1 d WITH(rowlock)
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = …Run Code Online (Sandbox Code Playgroud) 我正在使用事务复制来复制我们的实时数据库。这基本上是为了在服务器出现故障的情况下备份我们的数据库。
复制的数据库是只读的,因此我对其进行了备份、恢复和测试。
我立即注意到标识列不起作用。
例如,原始模式是这样的:
CREATE TABLE [dbo].[Inspection](
[InspectionID] [int] IDENTITY(1,1) NOT NULL,
[CarID] [int] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
然后,在复制的副本上,它看起来像这样:
CREATE TABLE [dbo].[Inspection](
[InspectionID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[CarID] [int] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
这意味着标识列已禁用,对吗?
有没有办法解决这个问题并使这个数据库本身成为一个独立的副本?
另外,我注意到没有传播外键。我知道有一些设置,但是既然标识列被禁用(哪些是主键),传播外键是否会成为问题?
我正在尝试导入、导出 SSIS 包。我知道他们在那里。当我查询 msdb.dbo.sysdtspackages90 时,我得到 22 个包。但是当我连接到服务器上的 Integration Services 时,存储的包文件夹是空的。到底是怎么回事?
我已经检查了 MsDtsSrvr.ini.xml。它使用标准的默认设置进行设置。
sql-server ×5
corruption ×1
deadlock ×1
delete ×1
identity ×1
locking ×1
partitioning ×1
replication ×1
ssis ×1
view ×1