我们有非常大的数据库表,我需要选择最大 id 的值。鉴于表大小 SELECT MAX(id) FROM tableA 不会表现得足够好。
表定义(为了清楚起见省略了列)
CREATE TABLE [dbo].[TableA](
[id] [numeric](19, 0) NOT NULL,
[timeSampled] [datetime] NOT NULL
CONSTRAINT [PK_TableA] PRIMARY KEY NONCLUSTERED
(
[id] DESC,
[timeSampled] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)
该表在 timesampled 上按月分区,并且因为我们将分区切换到另一个表以存档数据,timeSampled 列必须包含在主键中。
所以,PK是
[id] DESC,
[timeSampled] DESC
Run Code Online (Sandbox Code Playgroud)
该表包含 2013 年 5 月和 2013 年 6 月的行,id 以日期顺序递增(即最大 id 为 6 月)
当我从表中选择前 1 个 id 时,如下所示
SELECT top 1 id …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 ASP 会话状态的数据库的响应时间大幅增加。
为了诊断问题,我使用SP_CONFIGURE'blocked process threshold',15并运行跟踪以捕获任何触发的事件。在下一个事件期间,跟踪捕获会话状态数据库中的一些阻塞事件。
我已经确定了主要拦截器,可以看到它已暂停并等待。
<blocked-process-report>
<blocked-process>
<process id="process53fb4c8"
taskpriority="0" logused="0"
waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
ownerId="9710782702" transactionname="UPDATE"
lasttranstarted="2013-06-27T17:29:38.130" XDES="0xc429df950" lockMode="U"
schedulerid="14" kpid="6912" status="suspended" spid="359" sbid="0" ecid="0"
priority="0" trancount="2" lastbatchstarted="2013-06-27T17:29:38.130"
lastbatchcompleted="2013-06-27T17:29:38.107"
clientapp=".Net SqlClient Data Provider" hostname="WEB03" hostpid="7520"
loginname="State" isolationlevel="read committed (2)" xactid="9710782702"
currentdb="10" lockTimeout="4294967295"
clientoption1="536870944" clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="suspended" waittime="1046" spid="217" sbid="0" ecid="0"
priority="0" trancount="1" lastbatchstarted="2013-06-27T17:29:29.113"
lastbatchcompleted="2013-06-27T17:29:29.010" …Run Code Online (Sandbox Code Playgroud) 我想ALLOW_SNAPSHOT_ISOLATION在拥有约 4 亿条记录的生产数据库上启用。我知道每个记录需要添加 14 个字节。
如果我设置ALLOW_SNAPSHOT_ISOLATION它会阻塞一段时间与记录计数成正比,还是会异步更新数据?
首先,我想确保在启用此设置后,我的数据库不会在数小时内停止服务。
<deadlock-list>
<deadlock victim="process14012e08">
<process-list>
<process id="process14012e08" taskpriority="0" logused="148"
waitresource="PAGE: 28:1:762341" waittime="6583"
ownerId="54542271281" transactionname="DELETE"
lasttranstarted="2013-06-22T01:04:20.450" XDES="0x64de49950"
lockMode="S" schedulerid="26" kpid="13336" status="suspended" spid="1239"
sbid="0" ecid="0" priority="0" trancount="2"
lastbatchstarted="2013-06-22T01:00:19.120"
lastbatchcompleted="2013-06-22T01:00:19.117" hostpid="15675"
isolationlevel="read committed (2)" xactid="54542271281" currentdb="28"
lockTimeout="4294967295" clientoption1="671350816" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="3" stmtstart="134" stmtend="332"
sqlhandle="0x02000000e5eb1a38144fa5c164b3c876cc2c8da059bf3bb1">
delete from grid_col where grid_col_id not in (select grid_col_id from grid)
</frame>
</executionStack>
<inputbuf>
set rowcount 10000
while 1 = 1
begin delete from grid_col where grid_col_id not in (select grid_col_id from grid)
if @@rowcount = 0
break …Run Code Online (Sandbox Code Playgroud) 我需要获取MAX交易中某个字段的聚合。我在事务中进一步使用此值。我想避免在整个表中插入,而我正在从中获取MAX事务完成时。
我研究了可用的隔离模式和锁定提示。最接近的似乎是TABLOCKX,这是唯一避免在整个表中插入(也更新和选择)的方法。
由于我不会受到表中更新或选择的影响,我希望避免在事务期间仅插入。这个有可能?
更新:执行的字段MAX仅在插入时设置,因此没有获得更新结果过时的风险。
我正在使用 SQL Server 2000。
我想设计一个过程,通过它我可以在单个数据库中捕获多个 SQL Server 实例(2005 年以后)的基线数据,从中我可以获得所有信息和警报。
截至目前,我想捕获有关以下计数器的信息:
磁盘上的可用空间
可用的数据库文件和日志空间
等待统计
CPU 和内存计数器
如果需要,是否有任何免费工具可以参考和修改,或者任何有用的文章可以帮助我进行设置?
到目前为止,我指的是 SQLServerCentral.com 上 Erin Stellato 的文章。
任何帮助将不胜感激。
目前正在基于在特定表更新时触发的触发器进行数据库审计项目。触发器将更改写入表;写入的信息有:表名、更新列、时间戳、用户、旧值和新值。
触发器适用于单个更新,但当涉及多行更新时,它不起作用。
我的代码是这样的:
IF (UPDATE(Priority))
BEGIN
SET @UpdatedColumn = 'Priority'
INSERT INTO dbo.AuditTable
( [TableName] ,
[Source] ,
[RecordId] ,
[User] ,
[TimeStamp] ,
[UpdatedColumn] ,
[OldValue] ,
[NewValue]
)
SELECT
N'BookingItem' , -- TableName - nvarchar(max)
(SELECT CODE FROM TBL_LEG_SOURCE
INNER JOIN INSERTED INS ON LEG_SOURCE_ID = INS.SourceId) ,
INS.Id , -- RecordId - bigint
(SELECT USERNAME FROM INSERTED
INNER JOIN TBL_USER
ON ModifiedById = USER_ID) , -- User - nvarchar(max)
GETDATE() , -- TimeStamp - datetime
@UpdatedColumn , …Run Code Online (Sandbox Code Playgroud) 给定一个包含存储过程名称的变量:
DECLARE @stored_procedure_name sysname;
SET @stored_procedure_name = 'some_stored_procedure_name';
Run Code Online (Sandbox Code Playgroud)
如何删除存储过程?
我正在调查 SQL Server 2008 Reporting Services 的问题。直到昨天早上它一直工作正常。现在我注意到它ReportServerTempDB继续进入Restoring...模式。我用 将它恢复到在线模式RESTORE DATABASE [ReportServerQ4TempDB] WITH RECOVERY。
在此之后报告工作正常,然后在 10-15 分钟后ReportServerTempDB返回到恢复模式。报告执行给出以下错误:
报表服务器数据库中出现错误。这可能是由于数据库中的连接失败、超时或磁盘空间不足造成的。(rsReportServerDatabaseError) 有关此错误的详细信息,请导航到本地服务器计算机上的报表服务器,或启用远程错误...
任何建议为什么这样做。
我检查了以下内容
有多个 SSRS 实例正在运行,SQL 实例在同一台服务器上托管 SSRS 的数据库。
我已经检查过该数据库没有启用 AutoClose,并且我发现数据库Restoring...每小时进入模式,当我们的日志备份作业运行时。

我必须解决以下问题:由于我的数据库在几天内内存不足,我正在寻找一种如何使数据库使用多个文件的方法。我想将即将到来的数据存储在另一个文件中,该文件位于不同的硬盘驱动器上。
我使用的是 SQL Server 2008。在“数据库属性”下,我发现我可以创建更多的逻辑文件。我在文件组中创建了一个PRIMARY。无论如何,SQL Server 不使用新文件。这可能是什么原因?
我是否必须限制我的“主”文件的文件大小才能使用新文件?我不想等到我的光盘内存不足,希望有人有办法解决这个问题!
非常感谢您提前!
汤米