数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

4
使用SQL Server FILESTREAM时保持(部分)备份较小
我有一个数据库,其中有近1TB的FILESTREAM数据不需要备份(如果删除了该数据,则会在几个小时内自动重新创建,因此并不重要)。大多数数据每两天更改一次,因此差异备份并不能真正帮助减小容量。 我有工作,我需要通过恢复模式设置的方式备份Full,创建一个单独FILEGROUP的FILESTREAM,然后取的只有“主”的备份FILEGROUP。造成的问题是日志文件(也已备份)现在不必要地很大,因为它包含FILESTREAM数据。 SIMPLE恢复模式使我无法执行特定FILEGROUPs的备份,因此我也不认为这是一个选择。 我的想法只是将FILESTREAM数据移到一个单独的数据库中,但是现在我失去了参照完整性,并且肯定还会继承许多其他问题。 有什么方法可以在Simple恢复模式下创建部分备份(无需将FILESTREAM表设置为只读)?如果没有,我的问题是否还有其他合理的解决方案?

1
SQL Server在哪里将表的IDENTITY VALUE物理存储在哪里?
我希望有人可以指出我在这个方向上的正确方向。到目前为止,这是我的工作。 SELECT * FROM sys.identity_columns是一个提供“ last_value”的系统视图,但是该视图的定义使用了内部函数IdentityProperty(colName, 'LastValue')-因此是死胡同(不是从系统表中拉出它)。 互联网上的任何地方(我看过的地方)都建议使用DBCC IDENT_...命令来发现该值,但这仍然使我不清楚其实际存储位置。 因此,我开始DBCC PAGE(TestDB,1,1325,3)针对测试工具数据库搜索单个页面,并使用RESEED命令在值10和12之间重新设定种子。 在执行此操作时,我注意到上的十六进制值IAM: Header,IAM: Single Page Allocations并且IAM: Extent Alloc Status Slot 1所有值都已更改。(并且意识到它们无论如何都会随着bUse1值的变化而定期变化,而bUse1值本身也会逐渐变化)。 所以另一个死胡同,我全都没主意了。我还能在哪里搜索? 我正在运行SQL Server2014。我对内部知识有无限的渴望,并且还没有遇到像这样难以捉摸的东西。它引起了我的注意,因为从理论上讲,它(一个绝对值)存储在某个位置,并且应该(可以说)是可定位的。在我探索内部存储的数据/元数据的位置时,这个特殊的值使我感到难以捉摸。我猜测/希望有人会来告诉我,您可以接受,DBCC PAGE但我找错了地方。

1
我可以提高膨胀系统表的性能吗?
背景: 我有大量的数据库,其中包含大量的VIEW和大量的SYNONYM。例如,一个分贝具有超过10k的VIEW和2+百万个SYNONYM。 一般问题: 涉及sys.objects(通常是系统表)的查询往往很慢。涉及sys.synonyms的查询是冰河。我想知道如何才能提高性能。 具体示例 此命令由第三方工具运行。在应用程序和SSMS中速度都很慢: exec sp_tables_rowset;2 NULL,NULL 我的问题: 如何使运行速度更快? 我尝试过的内容: 如果SET STATISTICS IO ON我得到以下输出: (受影响的2201538行)表'sysobjrdb'。扫描计数1,逻辑读28,物理读0,预读0,lob逻辑读0,lob物理读0,lob 预读0。表'sysschobjs'。扫描计数1,逻辑读53926,物理读0,预读0,lob逻辑读0,lob物理读0,lob预读0。 我已经能够更新基础系统表上的统计信息。这已在我的SQL 2008 R2或更高版本的环境中起作用: UPDATE STATISTICS sys.sysobjrdb WITH FULLSCAN UPDATE STATISTICS sys.sysschobjs WITH FULLSCAN 我还能够执行索引维护。这适用于我的SQL 2012或更高版本的环境。例如,运行sp_help 'sys.sysschobjs'标识了表上的索引,然后从那里创建并运行以下命令: ALTER INDEX clst ON sys.sysschobjs REORGANIZE ALTER INDEX nc1 ON sys.sysschobjs REORGANIZE ALTER INDEX nc2 ON …


4
计算总访问量
我正在尝试编写一个查询,其中我必须通过照顾重叠的日子来计算客户的访问次数。假设itemID 2009的开始日期为23日,结束日期为26日,因此项目20010在这几天之间,我们将不将此购买日期添加到我们的总数中。 示例场景: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 2015-01-27 5 0 20014 2015-01-29 2015-01-30 2 2 输出应为7 …

1
如何在UNPIVOT(循环连接)中使用批处理模式?
我有以下形式的查询: SELECT ... FROM ColumnstoreTable cs CROSS APPLY ( SELECT * FROM (VALUES ('A', cs.DataA) , ('B', cs.DataB) , ('C', cs.DataC) ) x(Col0, Col1) ) someValues 这将从Columnstore支持的子查询(ColumnstoreTable)中获取每一行,并将这些行相乘。这本质上是一个UNPIVOT。实际查询大于此。查询的这一部分将用于其他处理。 这里的问题是将其CROSS APPLY实现为循环连接,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。 查询的这一部分对性能非常重要,我怀疑以批处理模式运行它可能对性能非常有益。 如何重写此查询,以便不退出批处理模式? 我确实尝试使用临时表代替VALUES,但这并没有改变没有哈希连接的相等连接条件的事实。

4
还原数据库向导将无法在SSMS 2014中打开
在运行Windows Server 2012 R2的开发机上,我刚刚将SQL Server从2012升级到2014。 使用SQL Server Management Studio 2014时,当我右键单击数据库时Tasks -> Restore -> Database...没有任何反应。还原数据库向导未按预期显示。 事件查看器中没有错误或崩溃。光标甚至都不会变成沙漏。 使用T-SQL还原可以正常工作,如果我返回并使用SSMS 2012,则可以正常工作。关于如何使向导在SSMS 2014中工作的任何想法? 我在两个版本的SSMS中都连接到相同的SQL Server实例,并且尝试以管理员身份运行SSMS。 它是Service Pack 1: Microsoft SQL Server Management Studio 12.0.4100.1 Microsoft Analysis Services Client Tools 12.0.4100.1 Microsoft Data Access Components (MDAC) 6.3.9600.17415 Microsoft MSXML 3.0 5.0 6.0 Microsoft Internet Explorer 9.11.9600.18125 …

4
电话号码的数据类型:VARCHAR,INT或BIGINT?
因此,这将是今年的虚拟问题,但我要问的是,这不是我第一次通过此问题。看一下下表定义: 看一下当前的专栏from_number,VARCHAR(45)但其中包含电话号码。由于我不知道手机在世界范围内可能有多少个号码,因此我尝试涵盖几乎所有号码。我想尽可能地保持数据库的完整性,所以我认为VARCHAR这不是保存此类信息的合适类型-也许我错了,你告诉我-所以我在考虑更改INT甚至更改BIGINT。 当我在Workbench中定义列时,我不应该()在所有情况下都指定括号之间的数字,而在我之前提到的情况下,则必须指定括号中的数字。因此,如果执行此操作:BIGINT()我收到此错误: 这使我在这里阅读了有关此MySQL类型的一些信息。基本上信息是这样的: 一个大整数。...无符号范围是0到18446744073709551615。 这让我问:定义BIGINT()类型时应为括号设置什么值。(我正在使用BIGINT,因为我不知道INT是否可以容纳电话所能容纳的尽可能多的数字-也许我也是错的)。在MariaDB / MySQL数据库中创建|设计列的正确方法是什么? 无论如何,我想知道您的意见,经验,当然我想得到一个答案 注意:我正在使用MySQL Workbench最新版本来创建ER图。我也在使用MariaDB 10.0.x

4
从哪里开始了解未知数据库
因此,标题进行了总结。 我有一个包含28个表和86个存储过程的SQL Server数据库,必须对其进行反向工程。我很确定,某些表从未使用过,并且并非所有proc也都使用过。 最大的问题是丢失了为此数据库使用的所有Windows服务以及所有软件和数据库文档,并且找不到整个系统的设计人员。 我已经设法创建了一个ER图来帮助我理解这些关系,但是由于我没有数据库管理经验,所以我不知道应该从哪里开始。 同样,如果您不想在这里提出这样的问题,我也感到抱歉。

1
在SSIS包中创建事务时出现问题
我正在处理需要使用事务的程序包,但当前出现以下错误: SSIS package "CATS-Package.dtsx" starting. Information: 0x4004300A at Data Flow Task, SSIS.Pipeline: Validation phase is beginning. Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container. Error: 0xC001401A at CATS-Package: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not available.". …

2
从生产中刷新测试数据库中的几个表的最佳方法是什么?
我在SQL Server 2008R2中有一个非常大的生产数据库和一个非常大的测试环境数据库。这两个数据库的表结构相似,但用户/登录/权限/角色不同。 我只需要每月从生产中定期刷新测试数据库中的几个表即可。 我正在计划执行此操作的当前方法是 使用BCP实用程序从生产中导出我需要的表。 将bcp导出文件复制到测试服务器上 在测试中刷新的所有表上禁用索引和约束 截断测试数据库表 使用BCP将数据加载回Test数据库表中。 在测试中重建索引并重新启用约束 对于这么小的任务,这一切似乎都太复杂了。似乎还会产生很多重做(在t-log中),是否有更好的方法呢? 我想到的另一种方法是将生产环境中的备份还原到测试环境中-但是我的问题是完整备份会很大,而且我不需要刷新所有表,只需要刷新几个表即可。 -并且生产数据库中的用户和安全性与测试不同。如果还原整个数据库,那么生产数据库中的安全设置将覆盖该设置。

3
了解关闭“验证备份完整性”对SQL备份的影响/风险
当前,我们在环境中的SQL Server 2005/2008 / 2008R2 / 2012服务器上使用标准维护计划进行备份,并且始终选中“验证备份完整性”框。 一些备份运行时间很长,因此我建议关闭该选项,但是管理层需要我记录此更改的影响和风险。 我了解此选项的用法和历史,对我来说似乎没有必要将备份作业的时间加倍,因为(我认为)可能在备份步骤中而不是在验证过程中发生的任何错误。 我错了吗?如果我要备份到磁盘而不是流式磁带或其他东西,将其关闭的风险很小吗?(如果需要的话,我们会通过网络备份到EMC DD-800备份设备。) 是否有什么正式的MS建议可以安全关闭此功能? 您是否在环境中的每个备份上运行“验证”?你会抽查他们吗? 编辑:为澄清起见,当您在维护计划中选中“验证备份完整性”时,SQL将在每次备份后立即对每个数据库执行完整的RESTORE VERIFYONLY。就像原始备份一样,数据/ IO占用大量资源,并且(基本上)使备份作业的总时间增加了一倍。这是不一样的使备份的“校验”选项(不能在向导中进行,因为据我所知)。


2
为什么我的WHERE子句从“包含”列中受益?
根据此答案,除非在用于限制的列上建立索引,否则查询将不会从索引中受益。 我有这个定义: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) INCLUDE (LastAccessTime); …

4
将来自不同表的数据聚合到一个表中是不明智的做法吗?
背景 我为大量的健康记录数据库写了很多大型报告(写SP,函数,作业等)。原始模式和使用该模式的软件均来自其他供应商,因此我在结构上不能做太多更改。有许多需要跟踪的记录,例如实验室,程序,疫苗等,它们分散在数十张表中,其中许多表肿且索引不正确(我已经能够解决此问题)。 问题 问题是,由于我们对数据库的控制很少,并且可以从任何给定的更新或补丁进行更改,因此使得编写和维护这些报告变得困难而乏味-特别是在存在大量重叠的情况下。它所需要的只是一个补丁,我被困在重写大量报告中的大部分。此外,随着联接,嵌套选择和应用堆积,查询很快变得混乱而缓慢。 我的“解决方案” 我的计划是将所有这些记录写入一个“全部捕获”表,并在原始表上写入触发器以维护该聚合表中的记录。当然,我需要确保触发器在更新后完好无损,但是从可维护性的角度来看,并且仅引用数据,这样做会容易得多。 该表又细又长,仅存储所需的数据,如下所示: CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id VARCHAR(50) NULL, status VARCHAR(15) NULL, ordered_datetime DATETIME NULL, completed_datetime DATETIME NULL, CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id) ) 然后,我将使用各种关系表来处理诸如type_id和项目分组之类的事情。 我开始对这个想法进行第二次猜测,因为其中一些表已写入很多,我要编写的SP和报告也将大量引用数据。因此,我担心此表将成为具有这么多I / O的记录锁定和性能噩梦。 …

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.