我有一个包含超过 1800 万条记录的表。我有一个每天从该表中清除数据的过程。索引碎片很少。
该表具有高事务吞吐量。它每秒存储大约 3 到 5 条新记录,因此我们知道清除该表的旧记录需要很快。
删除语句是这样的:
Delete top 1000
From MyTable
Where CreationDate < 'Some Date'
Run Code Online (Sandbox Code Playgroud)
理想情况下,我们会一直运行它,直到无法删除更多行。
对于前 600 万条记录,删除过程进展顺利,但随着时间的推移,删除开始变慢,直到影响访问同一表的其他应用程序。此外,许多外键索引变得碎片化。
我的问题是:
我使用的是 SQL Server 2005 标准版。
[更新] 我在这里包含了更多信息实际表名称为“VehicleLocation”关键列:
索引
VehicleLocation 的对象依赖关系(约 1050 万行)
以上所有表在其主键和 VehicleLocationKey (FK) 表上都有索引。
此外,我们使用 GUID 作为主键(坏主意,但它是遗留的)。最重要的是,我看到 VehicleLocationTP …
我很好奇。有什么办法可以防止 SQL 查询执行计划在整个连接期间被缓存?
我可以运行一个基本上说“对所有后续命令使用 OPTION(RECOMPILE) 直到我告诉你停止这样做”的命令吗?
我非常清楚这里的所有性能权衡,我知道这不是一个可以掉以轻心的步骤。但是,我处于一种独特的情况,这种行为可能是有利的。
更新:我找到了跟踪标志 253,但找不到官方提到它究竟做了什么:https : //stackoverflow.com/questions/2596587/what-does-sql-server-trace-flag-253-do
我们的数据库中有许多表,其中一个标识列作为主键和聚集索引。多年来,记录已从这些表中添加和删除,当然现在主键列中存在空白。
由于这些“缺失”身份,这些表上的聚集索引的性能是否有任何影响?
根据我的理解,只要刷新索引 b 树,就不应该有任何问题,但是我找不到任何具体的内容来确认这一点。
谢谢
最近,对数据库的很多查询都超时了。在调查时,我发现查询处于暂停状态,wait_type 为 PageIOLatch_Sh。我之前没有注意到服务器上有这么多查询被挂起。自星期六以来,这种情况一直在发生。
几周前,数据库服务器上的 CPU 一直处于 100% 的状态。在尝试修复该问题时,我更改了几个未真正使用的索引,并导致了 user_scans。更改索引后,服务器上的 cpu 使用率下降,站点的性能通常更快,并且现在查看索引统计数据时发生了大量 user_seeks,我认为这是一个好兆头。
然而,现在一两周后,即使 cpu 使用率不是 100,大量查询已经开始超时,并且观察到 PageIoLatch_Sh 等待。有趣的是,即使 cpu 为 100%,这些超时也不会以如此高的频率发生。
现在维护索引也会减慢 sql server 的处理速度,所以我想知道新索引是否会导致更多的等待和超时?
我们的客户在 Windows 2003 Server Enterprise、R2、SP2、32 位上拥有 Microsoft SQL Server 2005。在 Intel Xeon X5560 @2.80GHz 上运行,具有 8 GB RAM。
有时,用户抱怨访问服务器很慢。不过,这可能会受到其他因素的影响,例如工作站硬件、防病毒软件等。
但是,我正在考虑最大化 SQL Server 本身。
我读到了“SQL AWE”选项,它可以增加可在 32 位操作系统上使用的内存分配。
现在,AWE 未启用,我使用“dbcc memorystatus”进行了检查,得到了结果:
Memory Manager:
VM Reserved = 1694984 KB
VM Committed = 1691528 KB
AWE Allocated = 0
Reserved Memory = 1024
Reserved Memory In Use = 0
Run Code Online (Sandbox Code Playgroud)
正如我所理解的那样,由于 32 位操作系统,这 8GB 的 RAM 没有得到最佳使用。
我在这里的方向正确吗?我的意思是,如果我启用 SQL AWE,它将提高 SQL 性能。
请注意,我无法更改硬件,也无法将操作系统更改为 64 位(我们的应用程序不支持)。
谢谢。
是否在 SQL 2008 r2 上运行 UPDATE Statistics 并对 5000 万行(非分区)的大表进行全面扫描?我正在尝试确认以下行为。
a) 在整个运行过程中是否有任何锁定?不确定,但我认为没有锁,但是 sr。dba 告诉我它需要模式修改锁(嗯...)
b) 导致阻塞——我不这么认为
c) 造成大量 IO——因为每一页都将被读入内存并污染数据页缓冲区缓存。所以通常你应该在下班时间这样做。
我在 Windows 2003 R2 SP2 上安装了一个 SQL 2005 SP3 框。这个盒子有 64GB 的内存,启用了 AWE(和 boot.ini 中的 /PAE)以及内存中的锁定页面启用和最大服务器内存设置为 45GB。该服务器还有 32 个 CPU。
我们在日志中看到如下错误:
错误:701,严重性:17,状态:123。系统内存不足,无法运行此查询。
失败的虚拟分配字节:FAIL_VIRTUAL_RESERVE 65536
sql server 进程内存的很大一部分已被调出。这可能会导致性能下降。持续时间:0 秒。工作集 (KB):43160332,已提交 (KB):467644,内存利用率:45%。
对于 Virtual Reserve 错误,我发现这通常是 MemToLeave 默认为 256MB 引起的问题,因此我使用 -g 512 启动 SQL Server 以将其加倍,然后查看 Virtual Reserve 错误是否消失。由于该更改,SQL 服务立即在 24 小时内异常终止。所以我们现在再次使用默认值运行,它记录错误但不异常终止 SQL 服务。
如果我查看环形缓冲区 (sys.dm_os_ring_buffers),我会看到如下消息:
EventTime Type Indicators Avail Phys Mem, Kb Avail VAS, Kb Avail Phys Mem, Mb Avail VAS, Mb Avail Phys Mem, Gb Avail VAS, Gb
2012-06-19 10:37:54.063 …Run Code Online (Sandbox Code Playgroud) 我必须为大量记录(数百或数千,取决于用户选择)运行相同的存储过程。该过程相当基本:在两个单独的表中插入一条记录,其中包含一些计算值,并可选择更新第三个表上的两列。
我的应用程序有一个List<T>记录,我正在尝试决定是否应该遍历列表并在每条记录上运行该过程,或者将 id 值组合成单个字符串并进行单个数据库调用。如果我进行单个数据库调用,那么 SQL 将负责将逗号分隔的字符串转换为临时表并同时在所有记录上运行脚本。
我倾向于将逗号分隔的 Id 字符串传递给程序,但我不确定这是否是进行这种大规模更新的理想方式,或者我是否遗漏了一些会影响此决定的关键因素.
在决定是否应该将逗号分隔的 id 字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?或者有没有更有效的方法来从应用程序进行这种更新?
我正在使用 SQL Server 2005 和实体框架
performance sql-server-2005 stored-procedures entity-framework
我想就我们的 SQL Server 2005 TempDB 的最佳设置获得建议。
目前,我们的临时数据库由MDF3 GB 的单个文件和 120 MB 的单个日志文件组成,位于 3 轴 RAID-5 阵列的 D: 驱动器上,该阵列被分区为 C: 和 D: 驱动器。D: 驱动器还包含我们的应用程序核心程序和我们的报告数据库。
我想将临时数据库移动到它自己的驱动器,它是一个带有单个分区的 2 轴 RAID-1 阵列,驱动器 F:。
MDF当我将它移动到这个驱动器时,我想创建 4 x 1 GB 的临时数据库文件。我没有另一个备用的专用驱动器来拆分 TempDB MDF 和 LDF 文件,因此两者都必须在同一个驱动器上。
我应该将 LDF 文件留在当前驱动器上还是应该将所有文件移动到新驱动器上?
我不得不使用 all_errormsgs 运行 dbcc checkdb repair_allow_data_loss,它已经运行了 27 多个小时。DB 大小超过 15gb,服务器(windows 2008)有 32gb 内存。我确实在 SQL 2005 上运行过它,正如我所说,它已经运行了 27 多个小时。这是正常的吗?如果没有,我可以终止它而不会对数据库造成任何问题吗?我在运行之前确实做了备份。