Questions tagged «sql-server»

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

4
Oracle对DBA的要求比SQL Server高吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我一点都不了解Oracle,但是我听过Oracle DBA的说法,即与使用SQL Server相比,与Oracle(作为DBA)一起工作更“困难”,更加困难且要求更高。这个陈述有根据吗?

2
您可以在SQL Server实例上查看哪些性能计数器来确定其性能以及所有运行状况?
我是埃因霍温丰提斯大学的一名学生,我目前正在进行一系列访谈,以帮助开发SQL Server工具,并且我希望获得该领域专家的反馈。 我的问题之一是: 您可以在SQL Server实例上查看哪些性能计数器以确定其性能和总体运行状况? 特别是当好转坏时,我对阈值感兴趣。 贾米尔·扬·埃因霍温荷兰


1
SQL Server 2008R2中的自动更新统计信息:尽管有大量的行插入,为什么有些统计信息仍然过时?
在调查慢速查询期间,似乎执行计划异常次优(一个嵌套循环执行900万次搜索执行,估计执行次数为1)。确认一些实际过时的相关统计数据后,我重新构建了统计数据,并且性能问题得到了有效解决。 此数据库已启用“自动更新统计信息”(默认情况下处于启用状态)。我了解根据20%+ 500行修改(更新/插入/删除)存在自动统计信息更新的阈值。在多个索引上似乎已大大超过了此阈值,因此似乎存在(A)自动更新问题或(B)更新策略的内容超出了我在网上能找到的范围文档。 我很欣赏可以设置一个计划任务来更新统计信息,如果找不到其他解决方案,这很可能是我们采用的方法,但是对于如此大量的修改为何不会触发更新,这确实使我们感到困惑。自动更新某些统计信息-了解为什么可以帮助我们确定计划任务需要更新哪些统计信息。 一些附加说明: 1)在数据库中发现了问题,该数据库中的数据是通过负载测试创建的,因此在短时间内添加了大量数据,因此,如果定期进行自动更新(例如,每天一次)大部分),则可以解释一些观察到的行为。另外,我们的负载测试往往会对数据库造成很大的压力,因此我想知道SQL是否会在负载很重的情况下推迟统计信息更新(由于某种原因随后不更新统计信息)。 2)在尝试使用包含连续的INSERT,SELECT和DELETE语句的测试脚本来重新创建此问题时,没有发生该问题。我想知道这里的区别是否在于这些语句每个都会影响每个SQL语句许多行,而我们的负载测试脚本将倾向于单独插入行。 3)有问题的数据库设置为“简单”恢复模型。 一些相关链接: 分析慢速运行查询的清单 使用统计信息来提高查询性能 我还通过Microsoft Connect提出了此问题: 自动更新统计信息:许多统计信息仍然过时 更新2011-06-30: 在进一步调查中,我认为超出阈值水平(例如500行+ 20%)的统计信息是问题查询未使用的统计信息,因此在运行查询时可能会对其进行更新。需要他们。对于查询所使用的统计信息,这些统计信息会定期更新。然后剩下的问题是,这些统计信息在仅插入了相对较少的插入次数之后(例如,导致上述900万次查找估计数量为1的情况),就严重误导了查询计划优化器。 我此时的直觉是,问题与主键选择不当有关,该键是使用NEWID()创建的唯一标识符,因此这会很快创建高度碎片化的索引-特别是作为SQL中的默认填充因子服务器是100%。我的直觉是,在相对较少的行插入之后,这会以某种方式导致统计数据产生误导-小于重新计算统计数据的阈值。这可能完全不是问题,因为我已经生成了很多数据而没有完全重建索​​引,因此,糟糕的统计信息可能是由于产生的非常高的索引碎片所致。我认为我需要将SQL Server维护周期添加到我的负载测试中,以更好地了解真实系统在长时间内的性能。 2012年1月10日更新: 要考虑的另一个因素。SQL Server 2005中添加了两个跟踪标志(2008年似乎仍然存在),以解决与过时和/或误导性统计信息的发生有关的特定缺陷。有问题的标志是: DBCC TRACEON(2389) DBCC TRACEON(2390) MSDN:Ian Jose的WebLog:升序键和升序列上的自动快速更正统计信息 统计信息,Fabiano Amorim 当然,在决定启用这些标志时应该非常小心,因为它们可能会产生不利影响。

3
安全永久删除数据库的最佳实践是什么?
我们有一个“有机”的环境,这意味着人们在最少的监督或文档的情况下将代码堆积在代码上已有十年。我使用的服务器有几个我认为不再使用的数据库。我很想删除它们,只留下我实际使用的三个。 在极端鲁extreme的极端情况下,我可以禁用这些数据库并等待有人尖叫。在其他情况下,我可以让它们永远运行以防万一。您发现哪些步骤对确定服务器是否正在使用有价值,以及如何使用? 此外,您建议采取什么步骤来确保在禁用系统中不断发展,并在一段时间内保持可逆性(例如,重命名对象而不是直接删除它们)? 谢谢!

4
SQL Server中是否有用于编程ETL的标准语言/界面?
我目前正在为我们的数据仓库创建ETL。我们正在使用SSIS 2008,但是我们遇到了问题,其中最大的就是难以重用组件。每个表都有单独的程序包,每个程序包都将父程序包中的多个变量作为输入。当我们对这些输入变量进行更改时,我们需要进入每个程序包(现在有15个左右,但是这个数字将大大增加)并修改程序包以应对这些更改。还有其他问题,包括无法为我们的提取运行任意SQL,不良的日志记录功能等。 如果有一种方法可以开发代码中的ETL,实现代码重用,通用库,更好的单元测试等,那么整个过程将更加健壮。是否存在用于SQL Server的事实上的标准ETL语言/ API?我希望尽可能避免使用GUI工具。 编辑:我应该提到我的背景。我不是DBA,也没有正式(或非正式)的DBA培训,随着我的发展,我基本上已经了解了这些内容,因此,我很可能尝试使用SSIS进行不合适的工作或尝试使用此ETL。从错误的角度投射。另外,我目前在州政府工作,所以任何需要购买新软件包的解决方案都不在可能范围之内。 这是我们的任务之一。我们正在使用一个SSIS包来加载仓库中的每个表。每个Fact程序包和Dimension程序包通常都相同,只是它们的区别在于 从源数据库中提取 数据流中的操作 合并到目标表 我想做的(我发现在SSIS中很难做) 从文本文件加载提取查询。当开发人员编写和测试其提取查询时,我不必在SSIS运行它之前以任何方式操纵他们的查询,也不必将查询剪切并粘贴到DB Source对象中。 分别测试每个组件。我应该能够独立地测试单个表的完整ETL过程,而与其他表负载无关。 在一处修改共享逻辑,而不必编辑每个单独的程序包。每个包都以相同的方式将数据加载到审核表中,如果我想更改已加载已审核的数据,则不需要编辑所有15个包(随着时间的推移,这个数量会变得更大)。 如果适当地使用共享代码以编程方式完成,则整个过程感觉将更容易实现,并且更加健壮。
10 sql-server  etl 






10
将数据库缩小到其初始大小以下
我有一个SQL Server 2005开发数据库,​​它是实时的30GB副本。我们删除了一些dev中不需要的数据,这使使用的数据文件空间减少到20GB。因此,我们约有33%的未使用。 我需要回收空间,这将允许我们在服务器上拥有第二个开发数据库(基于缩减版本);但是,我无法回收空间,我做了以下工作: 文件的初始大小SMS2_Data为30GB。 DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY) 其次是 DBCC SHRINKFILE (N'SMS2_Data' , 19500) 不开心 我尝试进行备份,创建一个初始大小较小的新数据库,然后还原,但由于初始大小被覆盖而感到不高兴。也尝试过: ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) 这是错误的,说: 修改文件失败。指定的大小小于当前大小。 我尝试了20800,然后一直提高到29000(29GB),但仍然不允许我更改它。 完成收缩后,将恢复模式从更改FULL为SIMPLE,然后再次更改。不开心 我认为这与某些TEXT领域有关。我们整个系统中大约有6个。因此,作为测试,我将它们全部删除,然后缩小了文件,但仍然没有变化。 剩下的唯一选择是将数据重新导入到另一个数据库。这是不切实际的,因为必须在实时数据库上进行,因为这样做会带来很大的风险。我们半定期地获取实时数据库的副本并覆盖dev / test。我们有大约500张桌子。我想要一种不会将数据导出到新数据库的风险的方法。 我尝试将数据移动到另一个文件,它复制了除5%之外的所有数据。这就是导致我尝试删除所有文本列的原因。 服务器处于兼容模式90,但为SP2。我现在做了以下3次:重新索引所有表,备份数据库,收缩文件,收缩数据库。仍然没有喜悦。 EXECUTE sp_spaceused 返回: database_name database_size unallocated space SMS2Tests 31453.94 MB …

2
如何防止SELECT上的分区列存储死锁
我在SQL Server 2016中拥有三个群集列存储索引(CCI)表。所有这些CCI都基于租户ID处于同一分区方案中。最近,而且前后矛盾,我在从联接到这些表的简单选择语句中陷入僵局。死锁的示例查询: SELECT TOP 33 r.tenantid FROM Table_r r INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey WHERE r.TenantId = 69 AND pe.TenantId = 69 AND cm.TenantId = 69 错误信息: 事务(进程ID 56)与另一个进程在通用的可等待对象资源上处于死锁状态,并且被选择为死锁牺牲品。重新运行事务。 线索: 如果查询使用CCI以外的其他索引,则不会死锁。 如果删除三个tenantid过滤器中的两个,则不会死锁。 如果我选择前32位或更低,则不会死锁。 如果添加OPTION(MAXDOP 1),则不会死锁。 我可以在混乱的PROD副本,PROD只读次要副本和PROD本身中对此进行复制。 我无法在DEV或INT中复制此行为。 如果我将WITH(NOLOCK)添加到所有3个表联接中,它仍然会死锁 查询自身会死锁。当没有其他活动进程时,它将死锁。 没有并行性的查询计划不会死锁 死锁XML在这里 我们的PROD版本: …

1
稀疏列,CPU时间和过滤索引
稀疏 当像您一样对稀疏列进行一些测试时,我想知道造成性能下降的直接原因。 DDL 我创建了两个相同的表,一个表具有4个稀疏列,而一个表没有稀疏列。 --Non Sparse columns table & NC index CREATE TABLE dbo.nonsparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, charval char(20) NULL, varcharval varchar(20) NULL, intval int NULL, bigintval bigint NULL ); CREATE INDEX IX_Nonsparse_intval_varcharval ON dbo.nonsparse(intval,varcharval) INCLUDE(bigintval,charval); -- sparse columns table & NC index CREATE TABLE dbo.sparse( …


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.