标签: sql-server-2008

SQL 中的最小日志记录条件

我已经编写了一个脚本来测试在这个页面http://technet.microsoft.com/en-us/library/dd425070(v=sql.100).aspx中标题为 Summarizing Minimal Logging conditions about when最小日志记录发生或不发生。

使用此脚本,我发现每种不同类型插入的日志记录长度总和如下:

  • 堆为空 没有块 60000
  • 堆为空,带有 tabblock 56000
  • Heap non empty no tabblock 60000
  • 堆非空,带有 tabblock 56000
  • 堆加索引为空 无标签块 126188
  • 堆加索引为空,带有 tabblock 114188
  • 堆加索引非空无标签块 138696
  • 堆加索引非空,带有 Tablock 112000
  • 集群空有序无标签 64168
  • 簇为空,用 tabblock 56168 排序
  • 集群空无序无标签块 73388
  • 集群空无序,带有 tabblock 65388
  • 集群非空无标签块 63912
  • 集群非空,带有 tabblock 55944
  • 簇加索引为空 无标签块 124336
  • 簇加索引为空,带有 tabblock 108336
  • 集群加索引非空无标签块 123876
  • 带有标签块的集群加索引非空 107924

其中一些数字似乎与 technet 页面上的表格不符。特别是:

  • 插入空表和非空表之间的日志记录似乎没有区别,但是该页面声称在插入到没有 tabblock 的非空集群时应该有完整的日志记录
  • 使用 Tablock 插入带有和索引的堆或集群似乎确实减少了日志记录,但该页面声称应该有完整的日志记录。
  • 使用insert的SELECT INTO方法时,fn_dblog中没有行是insert操作,但是页面把这个方法列为批量加载操作,应该有表中描述的行为

作为参考,这是在 SQL express 数据库上运行的,当我运行 DBCC TRACESTATUS (610) …

sql-server-2008 sql-server bulk-insert

9
推荐指数
1
解决办法
946
查看次数

sp_reset_connection 执行时间过长的可能原因是什么?

为什么sp_reset_connection通过 SQL Server Profiler 查看系统存储过程的执行时间会超过几毫秒?

我使用 SQL Server Profiler 从生产系统中获取了一个简单的跟踪,然后使用 SqlNexus 对其进行了分析。SqlNexus 表明 sp_reset_connection 的累积持续时间最长——占整个跟踪的 33%。观察到的持续时间范围为 0-7 秒(12 到 6,833,270 微秒),但平均为 0.956 秒。

我知道当池连接被重用时会调用 sp_reset_connection。我已经看到一个建议,这可能是由于无关的痕迹而发生的,但情况似乎并非如此。

我已经阅读调用 sproc 时服务器正在做什么,但我不相信在这种情况下,任何这些都会有问题——代码不会留下需要清理的开放事务或巨大的临时表。

我还查看了https://serverfault.com/questions/199974/sp-reset-connection-taking-a-long-time-to-run但这没有帮助。

编辑(2013-12-23): 在所有情况下,读写都是0,CPU几乎总是0(只有两个非零CPU实例,都是16ms)。

sql-server-2008 sql-server

9
推荐指数
1
解决办法
9564
查看次数

简单的 DELETE,但复杂的执行计划

当我运行此删除时:

DELETE FROM ETLHeaders WHERE ETLHeaderID < 32465870
Run Code Online (Sandbox Code Playgroud)

...它删除了 39,157 行。它应该很简单,因为它是在 ETLHeaderID 上删除的,它是聚集索引和主键。但是(根据执行计划)它似乎达到了 361,190 行并使用了其他索引。该表确实有一个具有 XML 数据类型的字段(以防影响此 DELETE)。

任何想法为什么以及如何加速此 DELETE?

此处的执行计划: http ://sharetext.org/qwDY 此处的表架构:http : //sharetext.org/Vl9j

谢谢

performance sql-server-2008 execution-plan query-performance

9
推荐指数
1
解决办法
1626
查看次数

如何判断备份文件是否包含 CDC?

使用 SQL Server 2008 到 2014 年,我知道如何在启用变更数据捕获 (CDC) 的情况下备份和恢复数据库,但我正在寻找一种查询完整备份文件以确定它是否包含 CDC 数据的方法。

RESTORE FILELISTONLY这样从数据库中获取文件列表,而是获取 CDC 状态以确定还原是否需要使用 KEEP_CDC 标志的方法会很棒吗?

有没有办法确定备份是否包含 CDC 数据?

谢谢!

sql-server-2008 sql-server sql-server-2012 change-data-capture sql-server-2014

9
推荐指数
1
解决办法
1944
查看次数

如何确定哪些表导致数据库随着时间的推移而增长?

我在 SQL Server 2008 中有一个一直在增长的数据库,我想知道哪些表在过去 6 个月中增长最快。

sql-server-2008 sql-server

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

sp_WhoIsActive (SQL Server 2008 R2) 上有很多“FETCH API_CURSOR0000...”

我有一个奇怪的情况。使用sp_whoisactive我可以看到:

奇怪的

好的,通过这个查询,我可以看到是什么触发了(这个词在英语中存在吗?)它:

SELECT c.session_id, c.properties, c.creation_time, c.is_open, t.text
FROM sys.dm_exec_cursors (SPID) c --0 for all cursors running
CROSS APPLY sys.dm_exec_sql_text (c.sql_handle) t
Run Code Online (Sandbox Code Playgroud)

结果:

它只是一个选择

这是一个简单的select. 为什么要使用 f etch_cursor

另外,我也看到了很多“空白”的 sql_texts。这与这个“光标”有关系吗?

空白的

DBCC INPUTBUFFER (spid) 给我看这个:

打印

有这个问题 在这里(我做的),但我不知道这是否是同样的事情。


编辑1:

使用 kin 提供的查询,我看到了这一点:

仍然没有代码。


编辑2:

使用活动监视器,我可以看到:

最昂贵的查询

这是最昂贵的查询(第一个是故意的,我们知道)。

再一次,我想知道,为什么这select * from...FETCH CURSOR……的原因。


编辑3:

这个“ select * from...”是从另一台服务器(通过linked server)运行的。

好吧,现在我无法理解@kin 所说的内容。

这是execution plan查询的(在数据库的同一服务器中运行):

数据库的同一台服务器

这是现在,通过链接服务器在另一台服务器上运行的执行计划:

在此处输入图片说明

好的,也不是问题。现在!执行计划,通过**activity monitor**(相同select * from):

这到底是怎么回事?

sql-server-2008 process execution-plan cursors

9
推荐指数
1
解决办法
5333
查看次数

相当于 Oracle USING INDEX 子句的 SQL Server

是否有 SQL Server 2008 等效于 Oracle 中的 USING INDEX 子句?特别是对于构造:

CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;
Run Code Online (Sandbox Code Playgroud)

关于唯一索引的 Sql Server文档中,它指出(强调):

唯一索引通过以下方式实现:

PRIMARY KEY 或 UNIQUE 约束

当您创建 PRIMARY KEY 约束时,如果表上的聚集索引尚不存在并且您没有指定唯一的非聚集索引,则会自动创建一个或多个列上的唯一聚集索引。主键列不能允许 NULL 值。

这似乎意味着有一种方法可以指定主键应该使用什么索引。

sql-server-2008 oracle sql-server constraint primary-key

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

我们还应该使用 QUOTENAME 来防止注入攻击吗?

我今天正在查看一个旧的存储过程,并注意到它quotename在输入参数上使用。在做了一些挖掘以弄清楚它到底做了什么之后,我发现了这个站点。我现在了解它的作用以及如何使用它,但该站点表示它被用作 SQL 注入攻击的缓解措施。当我过去使用 asp.net 开发直接查询数据库的应用程序时,我会使用 ADO.Net 参数将用户输入作为文字值传入,而从不真正担心在我的存储过程中保护它。

我现在正在编写一个存储过程,该过程将由我不编写的应用程序使用,因此我确实需要尝试在过程级别防止注入攻击,这是quotename最好的方法还是有更新的功能/更好的方法?

让我了解这种思维模式的代码(@parm1是用户输入参数):

'SELECT project [Project], project_desc [Description], 
        customer [Customer], cpnyid [Company]
FROM PJPROJ (nolock)
where project like ' + quotename(@parm1,'''') + '
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-injection t-sql

9
推荐指数
1
解决办法
3028
查看次数

夏令时

在我的环境中,有一些服务器在本地备份和 Ola Hallengren 计划中运行。我们的服务器是 2008、2012 和 2014 的组合。所有完整备份都是在凌晨 12 点进行的,并且每 15 分钟进行一次日志备份。

我以前从未考虑过夏令时,所以请告诉我应该做哪些调整。

凌晨 12 点的完整备份会受到影响吗?日志备份会怎样?

sql-server-2008 backup timezone netbackup

9
推荐指数
1
解决办法
2293
查看次数

SQL Server 实例如何恢复使用的内存

我知道这个问题可能已经回答了很多次了,但我需要一个更好的方法来解决它,或者向我的老板证明这是一种正常行为,或者我忽略了一些东西。

我不是 DBA,我是一名开发人员,就像我以前的工作一样,我必须担任 DBA Mantle,因为我们现场没有正式的 DBA,或者没有人想认真对待这件事。

我有三个 SQL Server 实例,一个使用 SQL 2008 R2,两个使用 SQL 2016。全部来自生产环境。

SQL 2008 R2 来自我们的主系统,它托管在 Hyper-V 中的虚拟服务器中,并且是专用数据库服务器。该服务器上没有分配其他应用程序,它是一个纯数据库服务器。

问题是服务器配置了 30 GB 的 RAM,而 SQL Server 配置为使用从最小 4 GB 到最大 22 GB。

}内存参数配置

如果我重新启动,显然服务器内存使用量在服务器性能管理器上趋于平缓,从使用的内存中释放内存到配置的最小值。

重启后内存

我需要帮助理解这种情况,因为所有文档都指向一个无可辩驳的事实,即这在 SQL Server 中是正常的,我已经对此进行了记录,但是我的老板和同事表示这不是数据库的正常行为。如果我做数字,我认为服务器正在请求更多内存。他们说这不是 SQL Server 的正常行为,而且我们忽略了一些东西(工作和其他东西)。为了监控或尝试确定服务器行为,我开始每两个小时发送一次数据库健康报告,以尝试检查发生了什么。对于他们来说,预期的行为是 SQL Server RAM 应该在性能图中上升和下降,而不是一直保持在顶部,据我了解,这是预期行为或 SQL Server 的设计。

数据库健康报告

但是在不同的时间点,作业上升到执行,并且它们正常完成,一些长时间运行的事务正在运行,但是当我在生成报告后为它们运行查询时,它们消失了。

有什么我忽略的吗?这是正常的吗?有没有办法在不重启实例的情况下释放内存?我已经尝试了很多解决方案

sql-server-2008 sql-server memory

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