Questions tagged «sql-server-2008-r2»

SQL Server 2008 R2(主要版本10.50.xxxx)。请同时用sql-server标记。

2
将标识列从INT更改为BIGINT
我有一个带有标识列的表,该列也是主键。当前,它有5000万行,标识列的最高值为148921803。该表具有很多DELETEs并对其INSERTS执行,因此值很高。 我们希望将数据类型从更改为INT,BIGINT以准备添加更多行。请注意,没有对PK列的引用。 用最少的停机时间来做到这一点的最佳方法是什么?我有两个选择。 放下PK并更改色谱柱;要么 复制落重命名方法,描述在这里:

1
索引列顺序的WHERE-JOIN-ORDER-(SELECT)规则是否错误?
我正在尝试将此(子)查询改进为更大查询的一部分: select SUM(isnull(IP.Q, 0)) as Q, IP.OPID from IP inner join I on I.ID = IP.IID where IP.Deleted=0 and (I.Status > 0 AND I.Status <= 19) group by IP.OPID Sentry Plan Explorer指出了由上面的查询执行的一些相对昂贵的表dbo。[I]键查找。 表dbo.I CREATE TABLE [dbo].[I] ( [ID] UNIQUEIDENTIFIER NOT NULL, [OID] UNIQUEIDENTIFIER NOT NULL, [] UNIQUEIDENTIFIER NOT NULL, [] …

4
按表格显示数据和磁盘使用明细
我有一个SQL Server 2008 R2数据库,已由多个已部署程序使用。 问题:是否有一种简单的方法来显示数据库中所有表的每个表占用多少空间,并区分逻辑空间和磁盘空间? 如果我使用SSMS(Management Studio),则显示的数据库存储属性为167 MB,其中“可用”为3 MB(大约正确的大小,但我担心可用的3 MB)-这是一个值得关注的限制吗,假设我知道我有足够的磁盘空间?) 我可以深入研究每个表格,但这需要永远做。 我知道我可以编写自己的查询并进行测试,但是我想知道是否已经有一种简便的方法(内置的?)。



1
没有数据显示时如何保持Tablix的结构
我们有一个SSRS报告,它以tablix形式显示数据集的结果。如果数据集中的查询未返回任何数据,则显示Tablix的标题,但不显示标题下方的tablix单元。我知道可以拥有属性NoRowMessage,但实际上这不是我们想要的。因为当我指定一条消息时,SSRS会显示该消息而不是空的tablix。我必须按原样显示tablix结构,但单元格为空。 我什IsNothing至使用函数为tablix的每个单元格值设置规则,以显示空白(“”)(如果该值为null的话),但这无济于事。 你有什么主意吗?感谢您的帮助。

4
数据库联机时是否可以复制数据库文件?
我正在努力在SQL Server 2008 R2 SP1上建立生产数据库的开发副本。目前,两个开发人员已很少使用实时数据库来进行只读查询,但是新数据库也将对其进行更新。 由于数据库为2.1TB,并且总共花了3天时间来还原和更新到我们需要测试的最新版本,所以我最初的计划是创建一组新的备份文件,然后从这些文件中还原。这将允许我在同一SQL实例和计算机上创建数据库的开发副本,而不必使当前数据库脱机。 但是,为了节省几天的时间,我认为仅复制物理数据库文件并附加数据库的新副本可能是一个好主意。不幸的是,当我尝试复制时,出现错误,该错误是指SQL Server对这些文件施加的锁定。 由于除了传输日志文件外,我什么都不能使数据库脱机(我可以在人们早上进来之前完成此操作),是否有任何方法可以复制实时数据库文件而无需将数据库置于脱机状态?还是我应该等到人们回家后再这样做?

3
非聚集索引比聚集索引快吗?
这两个表具有相同的结构,并且每个表中都有19972行。为了练习索引,我创建了两个具有相同结构的表并创建了 clustered index on persontb(BusinessEntityID) 和 nonclustered index on Persontb_NC(BusinessEntityId) 和表结构 BusinessEntityID int FirstName varchar(100) LastName varchar(100) -- Nonclusted key on businessentityid takes 38% SELECT BusinessEntityId from Persontb_NC WHERE businessentityid BETWEEN 400 AND 4000 -- CLustered key businessentityid takes 62% SELECT BusinessEntityId from persontb WHERE businessentityid BETWEEN 400 AND 4000 …

3
锁使用的内存
我很好奇,数据库容量为128 GB的SQL 2012 Enterprise Edition的其中一个为370 GB,并且还在不断增长,锁(OBJECTSTORE_LOCK_Manager)内存管理员使用的内存量显示7466016 KB。我也可以通过查看性能计数器来确认select * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)' 但是,当我运行查询时 select count(*) from sys.dm_tran_locks 它仅显示16个锁。那么,什么使用了超过7 GB的锁。有没有办法找出来? 这是否意味着一旦分配了用于锁的内存,SQL尚未释放它?在过去的1小时内,我看不到锁数超过500,但是锁内存保持不变。 最大服务器内存为106 GB,我们没有在内存中使用锁定页面,并且在过去12小时内我没有看到任何内存压力或错误日志中的任何错误。可用兆字节计数器显示了超过15 GB的可用内存。 活动监视器始终显示0个等待任务,因此显然没有阻塞。 考虑到SQL Server锁占用约100个字节的内存,因此7 GB的内存很大,并试图找出谁在使用它。 我通过锁定计数运行服务器仪表板报告的最重要的事务,它说:“当前系统上没有正在运行的锁定事务。但是,锁定内存仍然如上所示。DB在夜间工作最忙。

1
执行跨数据库事务时,信息存储在哪个事务日志中?
给出以下代码段: -- error checking omitted for brevity begin tran exec database1..my_stored_procedure exec database2..my_other_stored_procedure if (@@error <> 0) rollback commit 交易信息将插入到哪个数据库的交易日志中? 我希望两个日志都可以获取所有数据,因为如果您尝试重播database1的事务日志就没有任何意义,它只会影响该数据库。我也希望您将无法database1在database2不存在的服务器上重播的事务日志,反之亦然。 ..但我愿意接受更正!

1
如何为多个SQL Server实例配置内存?
我们有一组在同一虚拟服务器上运行的SQL Server实例(2008 R2)。每个实例代表我们开发周期中的一个阶段(Dev / Test / Stage / etc。)。实例在任何给定时间都必须处于联机状态,但是负载往往一次只能隔离到一个实例,具体取决于我们在发布生命周期中所处的位置。 SQL Server似乎抢占并保留了我们设置为最大值的任何内存量。我想知道是否可以通过任何方式将实例配置为“智能”的内存消耗,以使它们在需要时不会互相阻碍获取内存。

2
在备份大型SQL Server数据库的同时执行数据更新操作
我有一个大型数据库(有上千万条记录),我将在该数据库上执行完整的数据库备份。 但是,数据库足够大,可以在备份之前和期间以及在备份发生期间和之后启动事务。 例如: T0 = Transaction A start T1 = Full database backup start T2 = Transaction B start (will not deadlock with A) T3 = Transaction A commit/rollback (does not matter, does it?) T4 = Full database backup end T5 = Transaction B commit/rollback (again, does not matter, does …

2
重建-聚集索引,表或两者?
我在任何地方都找不到确切的资源,因此希望一位专家可以在这里给我答案。 我有一个很大的表,我们必须在其中添加一列。聚集索引非常分散,我想做一个ALTER INDEX REBUILD清理它。 我通常ALTER TABLE REBUILD在更改列时也会执行一次,因为这会清除该操作中的所有指针或拆分。 因为我们在谈论聚集索引,本质上就是表,我是否需要同时做这两个事情? 我怀疑ALTER INDEX REBUILD集群中的不会更新遗嘱的所有内容ALTER TABLE,但是我也担心ALTER TABLE不会清理索引碎片。

1
在where子句中同时包含“ contains”和“ =”时查询缓慢
以下查询大约需要10秒钟才能完成具有12k条记录的表 select top (5) * from "Physician" where "id" = 1 or contains("lastName", '"a*"') 但是如果我将where子句更改为 where "id" = 1 要么 where contains("lastName", '"a*"') 它会立即返回。 两列都被索引,lastName列也被全文索引。 CREATE TABLE Physician ( id int identity NOT NULL, firstName nvarchar(100) NOT NULL, lastName nvarchar(100) NOT NULL ); ALTER TABLE Physician ADD CONSTRAINT Physician_PK PRIMARY …

4
从整数输入重建日期的最佳方法是什么?
我有很多财务报告,我们希望能够将两个输入(年份和季度)作为变量传递给他们。 我这样做,但是我真的不喜欢它: declare @quarter int, @year int, @date date set @quarter = 4 set @year = 2018 set @date = cast(@year as varchar(4)) + '-01-01' set @date = dateadd(quarter, @quarter - 1, @date) print @date 问题从整数输入重建日期的最佳方法是什么? 预期结果: 2018-10-01

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.