Questions tagged «sql-server»

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

2
参数嗅探解决方案
我过去曾使用两种方法来解决参数嗅探问题: 1)使用WITH RECOMPILE 2)将参数值重新分配给局部变量,并使用这些值代替参数 据我了解,这两者的最终结果是相同的-创建并使用了针对当前查询/参数优化的新执行计划。 如果是这样,那么这两种方法之间是否存在任何区别,或者它们本质上是相同的?一个比另一个更好吗?

3
在中央数据库中创建功能还是在每个数据库中重复?
我的一位开发人员编写了一个SQL函数,该函数的功能类似于VB.Net函数(LastIndexOf),并希望将其发布。我的问题是将其放入中央数据库而不是将其放入每个用户数据库的原因是什么? 开发人员试图将其放在sys模式中的主数据库上,这样他就不必限定来自用户数据库的调用... 但是我不确定将其集中到每个用户数据库的有效借口(显然不是主数据库)是什么?


3
逻辑读取与扫描计数
我要在SQL Server 2008中将一个小表(1,000行)与一个大表(8M行)连接起来。该连接在大表上使用非聚集覆盖索引,并且该连接可以产生三种可能的查询计划。我试图找出哪种计划更好,但我也想对此知识进行概括,以便下次在查看SQL I / O统计信息时可以更好地了解要使用的启发式方法。 计划#1是一个循环联接,并为大型表发出统计信息,如下所示: Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052 计划2是合并联接,并发出如下统计信息: Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004 计划3是哈希联接,并发出如下统计信息: Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010 覆盖率索引由排序(ID, Date)。查询返回大约50%的ID的数据,并且对于每个ID,返回最近3个月数据的连续块,通常为每个ID的大约1/4或行。该查询返回索引中总行的约1/8。换句话说,查询是稀疏的,但始终如此。 我的假设是,计划1对于这种工作负载而言是糟糕的,因为将磁盘头移动大约2500次(甚至是1,041次)比顺序进行磁盘扫描要昂贵得多。我还假定#3和#2具有相似的顺序I / O模式(因此效率更高)。 …

2
事务日志和镜像-寻找最简单的解释
首先,我必须承认我在处理事务日志的概念上遇到困难。我的意思是-我确实知道数据库中发生的所有事务的日志,但是在某些任务中将其正确地放入上下文时,我显然缺少一些东西。因此,对于将要回答该问题的任何人-请随时扩展事务日志背后的理论。 主要问题是-我有需要镜像的SQL Server 2008和2 GB数据库(具有12GB事务日志)。如果我不镜像该数据库,我想我可以切换到“简单”模式或在备份后截断日志。但是在这种情况下-如果我希望控制该事务日志,该怎么办?据我了解-如果我希望能够轻松镜像数据库(只需执行完全备份),就需要保留整个事务日志。 有没有办法解决?理想情况下,我希望可以进行备份,使每次和在备份完成后将MDF和LDF都保存在一个文件中。数据库上的事务日志(LDF)减少为0。这种情况的问题是增量备份-如果我是第一次备份截断的日志,我认为如果以后要进行镜像,则第二个备份将需要引用第一个备份(即,我将不得不保留一堆文件而不是一个文件)。 所以-有人能启发我这个问题吗?我了解我在这里试图填补很多空白,而我提议的“解决方案”可能不是最佳的解决方案,但是如果有人可以向我正确地介绍事务日志,它们如何影响镜像以及实现最佳解决方案,我将不胜感激。这两个的做法。

1
存储顺序与结果顺序
这是主键中指定的排序顺序的一个衍生问题,但排序是在SELECT上执行的。 @Catcall说这关于存储顺序(聚集索引)和输出顺序 许多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。 我已经阅读了Hugo Kornelis的博客文章,并且了解到索引并不能保证sql服务器按特定顺序读取记录。但是我很难接受我不能为我的情况承担这个责任吗? CREATE TABLE [dbo].[SensorValues]( [DeviceId] [int] NOT NULL, [SensorId] [int] NOT NULL, [SensorValue] [int] NOT NULL, [Date] [int] NOT NULL, CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED ( [DeviceId] ASC, [SensorId] ASC, [Date] DESC ) WITH ( FILLFACTOR=75, DATA_COMPRESSION = PAGE, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …


1
为什么在SQL Server 2005上页面预期寿命为0(零)
我们一直想知道我们SQL Server的页面预期寿命。因此,我们使用Perform查看计数器。该值为零,并且永不更改。我以为一定有错误,所以我检查了SQL Server DMV查询 SELECT [object_name],[counter_name],[cntr_value] FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Manager%' AND [counter_name] = 'Page life expectancy' 整天也返回零。 为了使这一点更有趣,我们检查了“缓冲区高速缓存命中率”计数器,该计数器的平均值约为99-100。 那么,当“缓冲区高速缓存命中率”为100时,页面预期寿命如何为零? 我们缺少什么?如果始终为零,则对我而言意味着没有任何内容保留在缓冲区高速缓存中,如果缓冲区高速缓存命中率为100,这似乎是不正确的? 提前致谢


1
从SQL Server 2000到2008的事务复制
我在两台SQL Server 2000服务器上有旧数据库,这些数据库正尝试使用事务复制复制到SQL Server 2008 R2数据库。 2008服务器不在同一LAN中,因此我正在通过Internet复制。我创建了别名,以便每个服务器都可以按名称(为复制所必需)或多或少连接到其他服务器,如MohammedU(和其他用户)在此处所述:http : //social.msdn.microsoft.com/forums/en-US/ sqlreplication / thread / 9a8cf6b1-a449-4748-b3c2-1c13e2bfcc5b / 唯一的区别是,我使用客户端网络实用程序而不是Configuration Manager在SS2000计算机上创建别名。这似乎工作正常。 我设置了一个SS2000服务器,称为Distributor,作为这两个服务器的分发器。我已经在Distributor上成功创建了出版物,并使用推送订阅将其复制到SS 2008服务器,称为“订阅服务器”。 现在,我在第二台SS2000服务器上设置了出版物,将其称为Publisher。我以相同的方式为其创建了推送订阅。这些订阅不起作用。 在分发服务器上的复制监视器中,发布服务器上发布的分发代理具有以下错误消息: Error message: The process could not connect to Subscriber 'SUBSCRIBER' Error details: Login failed for user 'SUBSCRIBER\Guest.' (Source: SUBSCRIBER (Data source); Error number: 18456) 我还尝试在订阅服务器上创建请求订阅。该向导表示已成功创建它们,并且相应的分发代理正确显示在“分发服务器上的复制监视器”中,但是复制从未发生。代理不断显示一条消息,说明快照不可用,即使快照不可用。 有人可以帮忙吗?

1
递归CTE性能
需要递归CTE性能方面的帮助。低于CTE的速度非常慢,因为它试图以回溯方式提取分层数据。表很大,每个根ID最多具有3个递归itemid。可能有大约200000或更多根ID。我知道对于大型数据集,递归CTE的速度很慢,因为锚中的每个rootid都会递归itemid。 架构: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上表有超过一百万行。 CTE查询: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) 我们无法修改表架构并使用继承权。我也尝试了while循环,但是那也很慢。 还有什么其他方法可以优化此查询? …

3
修复孤儿用户“来宾”吗?
如果guest孤立了该特殊用户(未链接到任何登录名),该怎么办? 对于我的一个数据库(SQL Server 2005),执行以下操作会将来宾用户列为孤立用户。 exec sp_change_users_login 'report' 结果: UserName UserSID guest 0x3C2E66759FFBC14F84127D6795C27FD3 如果尝试使用该过程修复来宾用户,则会得到以下信息: exec sp_change_users_login 'update_one', 'guest', 'guest' 终止此过程。在此过程中,“ guest”是登录名参数的禁止值。 如果我尝试删除用户,则会得到: 不能删除用户“来宾”,只能将其禁用。 select * from sys.database_principals where name = 'guest' 结果是: name guest principal_id 2 type S type_desc SQL_USER default_schema_name guest create_date 11/13/98 2:58 AM modify_date 10/16/01 4:31 PM owning_principal_id …

1
为什么禁用SQL Browser服务?
我在安装我们的产品的软件安装包中遇到间歇性问题(使用InstallShield / InstallScript编写)。在安装过程中,我们重新启动SQL Browser服务。在大多数情况下,这可以正常工作。但是偶尔-我还没有弄清楚如何可预测地重现-服务无法重新启动,并且在我的“服务”管理器中发现服务状态设置为“已禁用”。 有什么想法会导致该服务被禁用,以及如何防止它发生?


2
可用性组可以代替事务复制吗?
我一直在研究SQL Server 2012的新功能,以及它如何帮助解决当前的问题。 当前,我们使用SQL Server 2008 R2,并通过事务复制将两个OLTP服务器的数据库复制到单个报告服务器。然后,我们使用这些复制的DB进行报告。 我对SQL Server 2012和可用性组是否可以替代它感兴趣-因此,我将使用新的可用性组并将这两个OLTP服务器的数据库镜像到报告服务器,而不是事务复制,在该服务器上,报告将能够执行访问只读副本。 我不确定这是否会奏效,甚至根本不会奏效。 我想摆脱复制,因为它会导致我的部署策略出现问题(使用VSDBCMD.exe)。我还想摆脱大型数据库上复制重新初始化的延迟。 有人对此有任何好的例子或经验吗?是否可以按照较低版本中的常规镜像将可读副本从多个服务器镜像到单个服务器? 最初是在这里问到的:https : //stackoverflow.com/questions/10415225/mirroring-and-availability-groups-in-sql2012对不起,我认为我还不能迁移问题。

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.