Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

1
大型DB的日志传送-日志呢?
我目前正在设置大型数据库(大约1.5TB)的日志传送,并且想知道如何处理日志文件。 就目前而言,我想执行以下步骤: 将数据库更改为完全恢复 在主数据库上进行完整备份(5-6小时) 将完整备份还原到辅助数据库(保留NORECOVERY) 在主数据库上进行DIFF备份 将DIFF备份还原到辅助(仍处于NORECOVERY) 使用“数据库已初始化”初始化日志传送 问题是,当我进行完整备份时,日志文件的填充速度将比备份可以完成的速度快。 我有什么选择可以防止日志文件填满?我能否仅在FULL备份期间照常进行日志备份,因为DIFF还原将覆盖该时间段内发生的所有事务?以前有人用这种大小的数据库做过此事吗?

1
有关SQL Server中的SGAM&GAM和IAM&PFS的几个问题
对于SQL Server的内部结构有几个问题。 假设我们在数据库中有一个表。 SGAM和GAM页面在单个GAM间隔(〜4GB)内跟踪共享和统一的扩展区,并帮助我们在分配页面/扩展区时找到合适的扩展区类型(最初从混合扩展区中分配前8页,而这些页面的位置是记录到IAM页,然后再从GAM扩展区(统一扩展区)记录此信息,并将此信息存储在下一个链接的IAM页中。 假设已分配了该表的页面,并且表的大小超过了8页,并且稍后,行被删除,留下了一些可重用的空间。SQL Server如何知道扩展区具有可用空间? 页面具有有关可用空间大小的信息,但是检查每个页面都非常耗时。SGAM和GAM页面中的一些内容不会告诉我们分配了扩展的内容或有一些空闲页面(整个页面都是免费的,而不是部分的)。 文件标题,SGAM,GAM和IAM页面位于文件的第一页中。实际上是什么数据结构指向它们?

1
我想在不切换数据库的情况下向另一个数据库中的角色添加用户/登录
我在具有角色的“新”数据库中mynewdb具有角色/登录名"emailsender"。我已经编写了一个配置文件的脚本sp_send_dbmail,现在正在尝试编写脚本以将登录名添加到中DatabaseMailUserRole,msdb并且似乎在转圈。重要的是,我想在中运行更新脚本mynewdb。我知道我可以SSMS用来做到这一点。问题是: 如何编写脚本,将用户T-SQL从mynewdb数据库添加到角色中而无需切换到msdb?

2
从文本和图像迁移到varchar(max)和varbinary(max)
我有一个包含许多image和text列的SQL Server数据库,并且我正在研究将它们迁移到未弃用的对varbinary(max)等物和时可能引起的潜在问题varchar(max)。 除了更改应用程序代码外,我主要关心的是与此相关的潜在“陷阱”。例如,旧数据类型是否支持某些功能,而新数据类型不支持这些功能? 至少由于截断而导致的数据丢失似乎不是问题,因为新类型至少与旧类型一样大。

3
SQL Server TDE的替代方法
由于包含透明数据加密功能的SQL Server Enterprise Edition的成本很高,我在寻找替代产品,但只找到了两个选择: DbDefence NetLib加密器 谁能提供上述两种产品的使用经验的详细信息(性能影响,易用性等)? 还有其他替代SQL Server TDE的方法吗? 注意:我们当前正在使用SQL Server 2008 R2 Standard Edition。

2
信任哪个?
我们正在解决与供应商长期存在的问题。他们的软件倾向于冻结并每周停止一次或两次工作,从而严重干扰我们的运营。尽管我们向他们发送了许多GB的日志和数据库备份,但他们无法确定原因。最近,他们开始暗示问题出在我们的维护上,而不是软件方面(尽管没有长期运行的查询,CPU / RAM / IO压力,甚至在出现问题时出现死锁)。特别是他们说我们的索引是一个问题。 尽管我认为MS不赞成使用该工具,但他们最喜欢使用的工具是DBCC showcontig。他们特别着迷于扫描密度和范围碎片。为了消除借口,我建立了一些积极的夜间维护措施,以小于90%的扫描密度或大于10%的碎片重建索引。这多少使它们脱离了扫描密度列,但是它们仍然专注于范围碎片。DBCC showcontig即使在几个小时之前重建的索引上也显示出高度碎片。下面是dbcc_showcontig和sys.dm_db_index_physical_stats的结果,它们指向的表是“可能的问题”。 DBCC SHOWCONTIG 已扫描的页面................................:1222108 扫描范围.....................:152964 范围开关.....................:180904 平均 每个范围的页数...........................:8.0 扫描密度[最佳计数:实际计数] ..:84.44%[152764:180905] 逻辑扫描碎片..................:3.24% 扩展扫描碎片....................:35.97% 平均 每页可用字节数.....................:692.5 平均 页面密度(完整).....................:91.44% sys.dm_db_index_physical_stats index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070 NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230 NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264 NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253 NONCLUSTERED INDEX …

3
意外更改数据库名称(SQL Server 2008)
还没有发生在我身上。但是我在想这个。 我在搞乱我的培训环境,错误地单击了数据库名称,然后触摸了字母A。 假设我按下Enter键。现在数据库称为A,我不记得原来的名字了。CTRL + Z不起作用。 在生产环境中,在这种情况下该怎么办? 我知道这不会发生,因为数据库未设置为“单用户”。但是,如果发生这种情况。该怎么办?为了论证,让我们说这是一个没有人使用的数据库。

3
如何在短时间内将大量记录插入数据库?
我必须使用最快的方法一次将一堆记录(500,000)插入数据库。我尝试一次插入1,700条记录,但花了二十分钟!!我正在使用SQL-SERVER和C#。 尽管下表对快速插入技术无济于事,但我还是决定将其链接起来,以便您更好地了解我需要插入的字段数(将其复制大约500K)。
8 sql-server  c# 

3
当使用sp_MSForEachDB遍历数据库时,IF语句不跳过TempDB
[SQL Server 2012 SP2 EE] 为什么以下脚本给我一个与tempdb有关的错误? exec sp_MSForEachDB ' IF ( (select database_id from sys.databases where name = ''?'') > 4) BEGIN ALTER AUTHORIZATION ON DATABASE::? TO [sa]; ALTER DATABASE [?] SET RECOVERY SIMPLE; END' 这是我得到的错误: Msg 5058, Level 16, State 1, Line 5 Option 'RECOVERY' cannot be set in …


1
在SQL Server中合并行大小溢出-“无法创建行大小。”
我尝试将数据合并到的目标表有〜660列。合并的代码: MERGE TBL_BM_HSD_SUBJECT_AN_1 AS targetTable USING ( SELECT * FROM TBL_BM_HSD_SUBJECT_AN_1_STAGING WHERE [ibi_bulk_id] in (20150520141627106) and id in(101659113) ) AS sourceTable ON (...) WHEN MATCHED AND ((targetTable.[sampletime] <= sourceTable.[sampletime])) THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...) VALUES (...) 我第一次运行此程序(即,当表为空时)成功,并插入了一行。 我第二次使用相同的数据集运行此错误,但返回错误: 无法创建大小为8410的行,该行大于允许的最大行大小为8060。 为什么第二次尝试合并已经插入的同一行却导致错误。如果该行超过最大行大小,则可能无法将其插入到第一位。 因此,我尝试了两件事(并成功!): 从合并语句中删除“未匹配时”部分 在我尝试合并的同一行上运行更新语句 为什么使用合并更新不会成功,而插入却成功,直接更新也不会成功? 更新: …

2
查找以编程方式联接表所需的所有联接
给定一个SourceTable和TargetTable,我想以编程方式创建一个具有所有所需联接的字符串。 简而言之,我试图找到一种创建这样的字符串的方法: FROM SourceTable t JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn 我有一个查询,该查询返回给定表的所有外键,但是在尝试以递归方式遍历所有这些以找到最佳联接路径并制成字符串时遇到了局限性。 SELECT p.name AS ParentTable ,pc.name AS ParentColumn ,r.name AS ChildTable ,rc.name AS ChildColumn FROM sys.foreign_key_columns fk JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id JOIN sys.columns rc …

3
在IF EXISTS查询中使用CTE
是否可以在SQL Server 2012中执行与以下类似的操作? IF EXISTS ( WITH DATA AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY column ORDER BY Column) AS rn FROM table ) SELECT * FROM DATA WHERE rn = 2 ) BEGIN ... END 我尝试使用此语法并收到错误。如果无法做到这一点,使用临时表是否是实现此目的的最佳方法?
8 sql-server  cte 

1
SQL Server 2014-重置所有内容
除了重新安装软件之外,还有没有简单的方法可以从SQL实例“从头开始”?我的意思是: 删除所有创建的登录, 删除所有添加的数据库, 重置系统数据库, 删除任何新配置, 重置任何SQL Server代理配置 我在网上找不到有关如何执行此操作的任何信息。

3
BLOB合并复制期间的高tempdb磁盘I / O
拥有用于复制BLOB(类型image)的合并发布,就我的数据量而言,tempdb磁盘I / O很高。发布是仅下载的,没有筛选器。 高磁盘I / O是由同步引起的(当没有订阅者进行同步时,一切正常),这与订阅者数量密切相关。即使同步之间在Publisher上没有任何数据更改,也会发生这种情况,这使我感到困扰。 复制表的大小:7MB(总行数约为100) tempdb I / O:写入速度约为30 MB /秒(日志和数据文件) 订户数量:略多于100个,每个订户每30分钟同步一次(或多或少均匀)。 保留期限设置为14天 在发布服务器上使用SQL Server 2008,在订阅服务器上使用SQL Server 2005-2008R2。所有订户都使用Web同步。 此外,在订户处进行同步需要花费大量时间,并且多次发生replmerg.log以下情况: DatabaseReconciler, 2015/04/21 12:13:40.348, 3604, 25088, S2, INFO: [WEBSYNC_PROTOCOL] Sending client ReconcilerPhase WebSyncReconcilerPhase_RegularDownload DatabaseReconciler, 2015/04/21 12:13:47.063, 3604, 25194, S2, INFO: [WEBSYNC_PROTOCOL] Received server ReconcilerPhase WebSyncReconcilerPhase_LastRegularDownload 尝试@stream_blob_columns打开和关闭设置无效。 该问题是:这是个好主意,用合并复制到这些斑点发送到用户?我们还有其他出版物(尽管它们没有BLOB列),其中包含大量数据,而没有tempdb问题。是SQL Server缺陷还是安装错误? 发布服务器和分发服务器位于同一实例SQL Server …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.