Questions tagged «sql-server»

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

2
SQL Server数据库设计用于“已存档但可用”的数据
我们有一个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称其为“访问”。为了讨论起见,假设它是医学实践的数据库。 总共有30种访问“类型”,例如程序,年度,随访,免疫等,每种类型都是“访问”的辅助表,例如“ visit_immuno”。 自2000年以来,该数据库已积累了大约12年的数据。有人建议我们在“实时”版本中保留大约3年的数据,而其余数据则保留在“ old_data”数据库中。由于日期已标准化,因此仅存储在“访问”表中。Visit表还包含一个ROWVERSION列和一个BIGINT伪身份(聚集)列。出于所有目的和目的,假设群集密钥由SEQUENCE(SQL Server 2012 Enterprise)填充-我们将其命名为cid。 在visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也进行了一些更新,这将导致该ROWVERSION列与cid和date列不同步-简单地说,由于这个原因,它们都ROWVERSION不会cid创建合适的分区键。 从“活动”中删除数据的业务规则是,visit.date必须大于36个月并且visit_payment必须存在子记录。另外,“ OLD_DATA”数据库不包含任何基本表visit%。 因此,我们最终得到: 直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%表 该提案要求使用组合DB,该组合DB是一个外壳,其中包含(除外)中所有基本表的同义词以及两个数据库中所有表的UNION ALL的视图。Live DBvisit%visit% 假设在Old-Data数据库中创建了相同的索引,查询在UNION-ALL 视图上的性能是否良好?哪种类型的查询模式可能会使UNION-ALL 视图的执行计划失败?

2
将列别名放在列定义的开始或结尾之间有什么区别吗?
我一直都将列别名写为 SELECT 1 as ColumnName 但是今天遇到了一个使用了 SELECT ColumnName = 1 这两个查询的执行方式有何不同?还是在DBA中有关于使用哪个标准的标准? 我个人认为,第二个会更容易阅读/(很好的例子保持更长的列定义在这里从这篇文章),但我从来没有见过,所以今天很奇怪,之前使用的第二语法,如果有某种原因,我不应该使用它。

3
查找孤立的用户
在SQL Server 2005中,有一种方法可以找到在服务器级别不存在的用户(在服务器级别已删除但在删除之前未与数据库解除关联的帐户)或未链接的用户(可能已在服务器级别删除了一个帐户,但未删除数据库级别,然后读取了该帐户,但从未清除过该数据库级别)。 我的服务器非常凌乱,如果要运行查询来查找这些服务器,那就太好了。

2
读取DMV时将READ UNCOMMITTED设置为
我已经看到几个人SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在阅读系统DMV之前先打过电话。假设没有在同一事务中混合调用DMV和表,是否有任何理由这样做?
12 sql-server  dmv 

1
将SQL Server 2005升级到SQL Server 2012
我有一个以下测试环境: 虚拟机(Hyper-V) Windows Server 2008 R2 SP1(x64位) Windows SQL Server 2005 Developer Edition SP4(x64位)(默认实例名称) 设置了1个具有合并复制的数据库... 3个发布,每个都有2个订阅者。 我们正在测试升级到SQL Server 2012 Developer Edition(sp1)的过程。 我已经下载了64位SQL Server 2012 Dev的iso。(sp1)来自MSDN(完整许可副本),并且已开始沿升级路径进行。在开始检查不同条件的最后阶段之一中,我们遇到了一个奇怪的问题,如下所述: Rule "Upgrade architecture mismatch" failed. The CPU architectures of upgrading feature(s) are different. To upgrade these features, Setup architecture must be the same as the …

2
ETL:从200个表中提取-SSIS数据流或自定义T-SQL?
根据我的分析,我们数据仓库的完整维模型需要从200多个源表中提取。这些表中的某些将作为增量负载的一部分被提取,而另一些则将作为全负载。 需要注意的是,我们有大约225个具有相同模式的源数据库。 从我所看到的,在具有OLE DB源和OLE DB目标的SSIS中构建简单的数据流要求在设计时确定列和数据类型。这意味着仅用于提取,我最终将获得200多个数据流。 从可维护性的角度来看,这是我遇到的一个大问题。如果需要对提取代码进行某种彻底的更改,则必须修改200个不同的数据流。 另一个选择是,我编写了一个小脚本,该脚本读取要从一组元数据表中提取的源数据库,表名和列。该代码在多个循环中运行,并使用动态SQL通过链接服务器和OPENQUERY从源表中提取。 根据我的测试,这仍然不及将SSIS数据流与OLEDB源和目标一起使用的速度。所以我想知道我有什么样的选择。到目前为止的想法包括: 使用EZAPI以编程方式生成具有简单数据流的SSIS包。要提取的表和列将来自前面提到的相同的元数据表。 购买第三方软件(动态数据流组件) 解决此问题的最佳方法是什么?当涉及到.NET编程时,我是一个初学者,因此仅考虑基础知识所需的时间也是一个问题。


1
大内存环境中的SQL Server TempDB行为
阅读这个问题使我想起了我前一段时间遇到的一个问题。 我们有一个具有512GB RAM的SQL Server,主数据库是450 GB。我们在TempDB中看到了很多动作(好吧,我认为这是“很多动作”-可能不是!)。我安装了演示版的RamDisk Plus服务器,创建了一个50GB的ramdrive,将其指向TempDB,并且根本看不到性能的提高。 是对TempDB的写入始终导致对磁盘的实际物理写入,还是由SQL Server缓存TempDB的写入以像Windows文件系统缓存一样延迟写入? 在这种情况下,虚拟磁盘毫无意义吗? 我知道SQL Server 6.5支持对TempDB-In-Ram,但很久以前就停止了它!

1
镜像-无法访问服务器网络地址
我已经安装了SQL Server 2008 R2。它包含三个实例。 默认(MSSQLServer) 第一个例子 第二审 所有这些都是作为网络服务登录。 默认实例是主体服务器,第一个实例是镜像,第二个实例是见证服务器 最初,我对主体数据库进行了完整备份和事务日志备份。通过保持相同的数据库名称将其还原到第一个实例,并且恢复状态为“不可恢复” 最后,我启动了镜像,并收到以下两条错误消息。

2
为什么此查询不使用我的非聚集索引,我该如何进行查询?
在跟进有关提高查询性能的这个问题之后,我想知道是否有一种方法可以使我的索引默认使用。 该查询运行大约2.5秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 这大约需要33毫秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' ORDER BY [DateEntered], [DeviceID]; [ID]字段(pk)上有一个聚集索引,[DateEntered],[DeviceID]上没有聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题分为两个部分: 为什么,由于两个查询在[DateEntered]字段上都有WHERE子句,服务器为什么在第一个而不是第二个上使用聚集索引? 即使没有orderby,如何使该查询默认使用非聚集索引?(或者为什么我不想要那种行为?)


2
允许用户在自己的架构中执行任何操作,但不能创建或删除架构本身
我已经在SQL Azure中创建了一个架构,并授予了数据库角色以下权限: CREATE ROLE myrole AUTHORIZATION dbo; EXEC sp_addrolemember 'myrole', 'myuser'; CREATE SCHEMA myschema AUTHORIZATION dbo; GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW DEFINITION ON SCHEMA::myschema TO myrole; GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole; 通过上面定义的权限myuser可以创建/删除他自己的架构,因此为了解决该问题,我尝试了ALTER ANY SCHEMA权限。但是此权限也拒绝用户创建/删除表。 为了允许用户在自己的架构中执行任何操作但不能创建或删除架构本身,需要什么权限?

3
使用带覆盖列的唯一非聚集索引而不是主键的含义
我们有一个大表[MyTable]目前既有Primary Key,和一个Unique Non Clustered Index在同一列([KeyColumn])。U NC索引还具有其他覆盖列。 在同一列上同时拥有PK和唯一NC索引似乎是多余的,因此我考虑删除主键,而是出于引用完整性的目的而使用唯一非聚集索引。 请注意,该表完全由另一列群集。 即所以我们有: ALTER TABLE [MyTable] ADD CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED ([KeyColumn]) GO 和 CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex] ON [MyTable] ([KeyColumn]) INCLUDE ([Column1], [Column2]) GO 据我所知,不可能将覆盖列添加到主键,所以我打算这样做: 放弃依赖于的外键约束 MyTable.KeyColumn 将主键MyTable.KeyColumn完全放在 将外键重新添加到表中(即RI将通过强制执行MyTable.KeyColumn) 我能想到的唯一含义是,我们不会在ERD图上看到可视键符号,并且由于包含了列,因此(叶)索引密度会降低。 我已阅读/programming/487314/primary-key-or-unique-index,并对这样做的完整性和性能方面感到满意。 我的问题是:这种方法有缺陷吗? 编辑 我要完成的任务:性能优化和春季大扫除。通过删除PK或索引,我的索引所需的页面将更少=更快的写入速度,再加上维护/操作的好处,即减少索引以保持碎片整理等。 为了提供一些背景知识,我从来没有过没有PK的表被引用过。但是,在表中添加了带有覆盖列的NC索引这一事实意味着我需要调整自己的想法。


3
PostgreSQL初始数据库大小
我的问题分为两部分。 有没有一种方法可以在PostgreSQL中指定数据库的初始大小? 如果没有,当数据库随着时间增长时如何处理碎片? 我最近从MSSQL迁移到Postgres,在创建数据库时我们在MSSQL世界中所做的一件事是指定数据库和事务日志的初始大小。这样可以减少碎片并提高性能,尤其是如果事先知道数据库的“正常”大小时。 数据库的性能随着大小的增长而下降。例如,我要处理的工作量通常需要10分钟。随着数据库的增长,这个时间增加了。进行VACUUM,VACUUM FULL和VACUUM FULL ANALYZE似乎无法解决问题。解决性能问题的方法是停止数据库,对驱动器进行碎片整理,然后进行VACUUM FULL ANALYZE,将测试的性能恢复到最初的10分钟。这使我怀疑碎片化是导致我疼痛的原因。 我在Postgres中找不到任何有关保留表空间/数据库空间的引用。我使用的术语错误,因此一无所获,或者在Postgres中有另一种缓解文件系统碎片的方法。 有指针吗? 解决方案 提供的答案有助于确认我开始怀疑的地方。PostgreSQL将数据库存储在多个文件中,这使数据库可以增长而无需担心碎片。默认行为是将这些文件与表数据一起打包到边缘,这对很少更改的表有好处,但对经常更新的表不利。 PostgreSQL利用MVCC提供对表数据的并发访问。在此方案下,每次更新都会创建已更新行的新版本(可以通过时间戳或版本号,谁知道呢?)。旧数据不会立即删除,但会标记为删除。实际删除发生在执行VACUUM操作时。 这与填充因子有何关系?表格默认填充因子100完全填满了表格页面,这又意味着表格页面中没有空间来容纳更新的行,即,更新的行将与原始行放置在不同的表格页面中。如我的经验所示,这对性能不利。由于汇总表的更新非常频繁(最高1500行/秒),因此我选择将填充因子设置为20,即表的20%用于插入的行数据,而80%用于更新数据。尽管这看起来可能过多,但为更新的行保留的大量空间意味着更新的行与原始行位于同一页面内,并且在自动清理守护程序运行以删除过时的行时,表页面未满。 为了“修复”我的数据库,我做了以下工作。 将摘要表的填充因子设置为20。您可以在创建时通过将参数传递给CREATE TABLE或在事后通过ALTER TABLE来实现。我发出了以下plpgsql命令:ALTER TABLE "my_summary_table" SET (fillfactor = 20); 发出VACUUM FULL,因为这将写入表文件的全新版本,因此,暗含了使用新的填充因子写入新的表文件的情况。 重新运行测试,即使数据库足够大以容纳数百万行,我也看不到性能下降。 TL; DR-不是文件碎片造成的,而是表空间碎片造成的。通过调整表格的填充因子以适合您的特定用例,可以缓解这种情况。

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.