标签: sql-server

为什么从组合索引DESC中选择top 1也用于按月分区而不选择top值?

我们有非常大的数据库表,我需要选择最大 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)

index sql-server

2
推荐指数
1
解决办法
1314
查看次数

使用阻塞进程报告诊断阻塞问题

我有一个应用程序由于超时而关闭。在这些时间里,我们看到保存 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)

sql-server profiler locking session

2
推荐指数
1
解决办法
5232
查看次数

ALLOW_SNAPSHOT_ISOLATION 持续时间

我想ALLOW_SNAPSHOT_ISOLATION在拥有约 4 亿条记录的生产数据库上启用。我知道每个记录需要添加 14 个字节。

如果我设置ALLOW_SNAPSHOT_ISOLATION它会阻塞一段时间与记录计数成正比,还是会异步更新数据?

首先,我想确保在启用此设置后,我的数据库不会在数小时内停止服务。

sql-server sql-server-2008-r2 snapshot-isolation

2
推荐指数
1
解决办法
361
查看次数

死锁发生在删除插入场景中

<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)

sql-server

2
推荐指数
2
解决办法
1412
查看次数

SELECT 锁仅用于插入

我需要获取MAX交易中某个字段的聚合。我在事务中进一步使用此值。我想避免在整个表中插入,而我正在从中获取MAX事务完成时。

我研究了可用的隔离模式和锁定提示。最接近的似乎是TABLOCKX,这是唯一避免在整个表中插入(也更新和选择)的方法。

由于我不会受到表中更新或选择的影响,我希望避免在事务期间仅插入。这个有可能?

更新:执行的字段MAX仅在插入时设置,因此没有获得更新结果过时的风险。

我正在使用 SQL Server 2000。

sql-server sql-server-2000 hints isolation-level

2
推荐指数
1
解决办法
1788
查看次数

SQL Server 2005 及更高版本 - 捕获基线

我想设计一个过程,通过它我可以在单个数据库中捕获多个 SQL Server 实例(2005 年以后)的基线数据,从中我可以获得所有信息和警报。

截至目前,我想捕获有关以下计数器的信息:

  1. 磁盘上的可用空间

  2. 可用的数据库文件和日志空间

  3. 等待统计

  4. CPU 和内存计数器

如果需要,是否有任何免费工具可以参考和修改,或者任何有用的文章可以帮助我进行设置?

到目前为止,我指的是 SQLServerCentral.com 上 Erin Stellato 的文章。

任何帮助将不胜感激。

sql-server-2005 sql-server-2008 sql-server

2
推荐指数
1
解决办法
260
查看次数

处理多行更新的更新后触发器

目前正在基于在特定表更新时触发的触发器进行数据库审计项目。触发器将更改写入表;写入的信息有:表名、更新列、时间戳、用户、旧值和新值。

触发器适用于单个更新,但当涉及多行更新时,它不起作用。

我的代码是这样的:

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)

trigger sql-server sql-server-2012 update

2
推荐指数
1
解决办法
2万
查看次数

如何删除名称在变量中的存储过程?

给定一个包含存储过程名称的变量:

DECLARE @stored_procedure_name sysname;
SET @stored_procedure_name = 'some_stored_procedure_name';
Run Code Online (Sandbox Code Playgroud)

如何删除存储过程?

sql-server stored-procedures t-sql sql-server-2008-r2

2
推荐指数
1
解决办法
4505
查看次数

Reporting Services TempDB 不断进入还原模式

我正在调查 SQL Server 2008 Reporting Services 的问题。直到昨天早上它一直工作正常。现在我注意到它ReportServerTempDB继续进入Restoring...模式。我用 将它恢复到在线模式RESTORE DATABASE [ReportServerQ4TempDB] WITH RECOVERY

在此之后报告工作正常,然后在 10-15 分钟后ReportServerTempDB返回到恢复模式。报告执行给出以下错误:

报表服务器数据库中出现错误。这可能是由于数据库中的连接失败、超时或磁盘空间不足造成的。(rsReportServerDatabaseError) 有关此错误的详细信息,请导航到本地服务器计算机上的报表服务器,或启用远程错误...

任何建议为什么这样做。

我检查了以下内容

  1. 内存 - 50% 可用
  2. CPU - 仅使用 10%
  3. 存储 - 剩余 30% 空间

有多个 SSRS 实例正在运行,SQL 实例在同一台服务器上托管 SSRS 的数据库。

我已经检查过该数据库没有启用 AutoClose,并且我发现数据库Restoring...每小时进入模式,当我们的日志备份作业运行时。

在此处输入图片说明

sql-server ssrs ssrs-2008

2
推荐指数
1
解决办法
5360
查看次数

使数据库使用多个文件

我必须解决以下问题:由于我的数据库在几天内内存不足,我正在寻找一种如何使数据库使用多个文件的方法。我想将即将到来的数据存储在另一个文件中,该文件位于不同的硬盘驱动器上。

我使用的是 SQL Server 2008。在“数据库属性”下,我发现我可以创建更多的逻辑文件。我在文件组中创建了一个PRIMARY。无论如何,SQL Server 不使用新文件。这可能是什么原因?

我是否必须限制我的“主”文件的文件大小才能使用新文件?我不想等到我的光盘内存不足,希望有人有办法解决这个问题!

非常感谢您提前!

汤米

sql-server-2008 sql-server

2
推荐指数
1
解决办法
80
查看次数