Questions tagged «sql-server»

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

2
SQL Server联接/位置处理顺序
在阅读了慢速SQL查询之后,不确定如何优化,这让我开始思考查询的一般性能。当然,我们需要将第一个表(在连接其他表时)的结果尽可能小,然后再进行连接(此问题的内部连接),以使我们的查询快一点。 示例,应该这样: SELECT * FROM ( SELECT * FROM table1 WHERE col = @val ) t INNER JOIN table2 ON col = col2 比以下更好/更快: SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 我的理论如下(这可能不是正确的实现,我试图从我读过的一本SQL Server 2008内部书籍(MSFT Press)中记住): 查询处理器首先获取左表(表1) 在过滤掉必要的行之前,连接第二个表(表2)并形成笛卡尔积(如果适用) 然后使用SEELCT语句最后执行WHERE,ORDER BY,GROUP BY,HAVING子句。 因此,如果在上面的语句1中表较小,则在形成笛卡尔积时SQL引擎要做的工作较少。然后,当您到达where语句时,您将得到减少的结果集,可以从中筛选出结果集。 我可能还差得远,这是不真实的。就像我说的,这是一种理论。 …


2
IDENTITY列中出现意外间隔
我正在尝试生成从1开始并以1递增的唯一采购订单号。我有一个使用以下脚本创建的PONumber表: CREATE TABLE [dbo].[PONumbers] ( [PONumberPK] [int] IDENTITY(1,1) NOT NULL, [NewPONo] [bit] NOT NULL, [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(), CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC) ); 使用此脚本创建的存储过程: CREATE PROCEDURE [dbo].[GetPONumber] AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1); SELECT SCOPE_IDENTITY() AS PONumber; END 在创建时,这可以正常工作。当存储过程运行时,它将以所需的编号开始,并以1递增。 奇怪的是,如果我关闭计算机或使其进入休眠状态,那么下一次该过程运行时,序列将增加近1000。 查看以下结果: 您会看到数字从8跃升至1002! …

2
活页和非活页有什么区别?
我一直在运行一些索引使用情况报告,并且正在尝试获取Leaf和Non-leaf的定义。似乎同时存在叶子和非叶子插入,更新,删除,页面合并和页面分配。我真的不知道这意味着什么,或者一个比另一个更好。 如果有人可以给每个简单的定义,并解释为什么叶子或非叶子很重要,不胜感激!

1
集群列存储上的非集群索引存储
在SQL Server中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别上都包含基础对象的书签(RID或群集键)。书签作为所有索引级别上非聚集索引键的一部分存储。 另一方面,如果非聚集索引是唯一的,则书签仅在索引的叶级别存在-不作为键的一部分(实际上,书签作为一个或多个包含的列存在)。 在SQL Server 2016中,可以在面向列的表(具有群集列存储索引的表)上构建非群集b树索引。 集群列存储表上非集群b树索引使用的“书签”是什么? 上述唯一索引和非唯一非聚集索引之间的区别是否仍然适用?

1
什么是好的SQL Server备份计划?
关于设置备份任务的过程似乎有很多信息,但是关于数据库备份的全局视图却没有太多信息。至少,很难制定出能够为您提供该信息的搜索引擎查询。我知道有三种不同类型的备份: 完整的数据库备份 差异数据库备份 事务日志备份 看来我应该全部使用这三个。那么,这是一个有意义的时间表吗? 每月的1号 -进行完整的数据库备份。 每天午夜 -进行差异数据库备份。 每15分钟 -进行事务日志备份。 这样,如果我的数据库在第12个数据库上发生故障,则只需从第1个数据库还原完整的数据库备份,从第1个数据库还原到第12个数据库的差异备份,然后最终还原最新的事务日志(交易记录差异?)。 最后,完整的数据库备份是否是自包含的?即在2月1日进行完整的数据库备份后,是否可以删除1月的所有文件?当然,我会保留前几个月的设置,以防万一,但是这个问题是概念性的。

2
为什么不使用IS NULL值的筛选索引?
假设我们有一个这样的表定义: CREATE TABLE MyTab ( ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY ,GroupByColumn NVARCHAR(10) NOT NULL ,WhereColumn DATETIME NULL ) 和一个过滤的非聚集索引,如下所示: CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab (GroupByColumn) WHERE (WhereColumn IS NULL) 为什么此索引未针对此查询“覆盖”: SELECT GroupByColumn ,COUNT(*) FROM MyTab WHERE WhereColumn IS NULL GROUP BY GroupByColumn 我正在得到这个执行计划: KeyLookup用于WhereColumn IS NULL谓词。 这是计划:https …

2
将SSMS连接到Integration Services时“访问被拒绝”
尝试使用特定SQL Server群集的网络名称将SSMS连接到Integration Services时收到以下错误: 连接到计算机“ FooDB”上的Integration Services服务失败,出现以下错误:“访问被拒绝”。 如果尚未将计算机配置为允许通过DCOM进行远程连接,或者用户确实具有通过DCOM访问SQL Server Integration Services服务的权限,则会发生此错误。 这是有据可查的解决方案的常规问题。例如,在此处和此处查看解决方案。 但是,我尝试了所有已知的解决方案,但问题仍然存在。 更详细地说,我已经完成了以下工作: 验证连接的用户具有MsDtsServer100上上面链接到的文章中列出的DCOM权限: 启动和激活权限:允许本地启动,允许远程启动,本地激活,远程激活 访问权限:允许本地访问,允许远程访问 配置权限:允许读取 使用数据包嗅探器确认与连接有关的所有通信都已成功通过防火墙。在断开TCP连接之前显示的最后一个数据包是来自服务器的答复,其中包含Windows状态代码,表示MSRPC标头中的“拒绝访问”。 已测试将用户添加到“分布式COM用户”组和/或本地管理员组,然后重新启动服务器。这允许用户使用本地节点名称(FooDBN1,FooDBN2)从SSMS连接到SSIS,但是当他们连接到群集网络名称(FooDB)时,他们仍然会遇到“拒绝访问”错误。使用以及在其他集群上有效的方法。 另外,我还没有发现在其他集群上必须更改这些组的成员身份。 在检查过的其他群集上,我可以使用群集名称将SSMS连接到SSIS,而无需任何非默认配置。 我意识到这可能更适合ServerFault,并且可以根据需要迁移该问题,但是这也是SQL Server的问题,我认为此处的用户以前更可能会对其进行处理。 平台详细信息: Windows Server 2008 R2 SP1 SQL Server 2008 R2 SP2 具有单个SQL Server实例的2节点主动-被动群集 有人可以建议我接下来在这里看什么吗? 更新:这神秘地从今天开始工作,但仅适用于本地管理员组的成员。据我所知,没有任何改变。

2
插入期间磁盘空间已满,会发生什么?
今天,我发现存储我的数据库的硬盘驱动器已满。这是以前发生的,通常原因很明显。通常会有一个错误的查询,这会导致大量的溢出到tempdb,直到磁盘装满为止。这次不太清楚发生了什么,因为tempdb不是驱动器满载的原因,而是数据库本身。 事实: 通常的数据库大小约为55 GB,后来增加到605 GB。 日志文件大小正常,数据文件很大。 数据文件具有85%的可用空间(我将其解释为“空气”:已使用但已释放的空间。SQLServer分配后将保留所有空间)。 Tempdb大小正常。 我发现了可能的原因;有一个查询选择了太多行的查询(错误的联接会导致选择110亿行,预计会有几十万行)。这是一个SELECT INTO查询,使我想知道是否可能发生以下情况: SELECT INTO执行 目标表已创建 数据被选择时插入 磁盘已满,导致插入失败 SELECT INTO被中止并回滚 回滚可以释放空间(已插入的数据将被删除),但是SQL Server不会释放释放的空间。 但是,在这种情况下,我不希望由创建的表SELECT INTO仍然存在,应该通过回滚将其删除。我测试了这个: BEGIN TRANSACTION SELECT T.x INTO TMP.test FROM (VALUES(1))T(x) ROLLBACK SELECT * FROM TMP.test 结果是: (1 row affected) Msg 208, Level 16, State 1, Line 8 Invalid object name 'TMP.test'. …

4
为什么varchar数据类型允许unicode值?
我有一个带有varchar列的表。允许使用商标(™),版权(©)和其他Unicode字符,如下所示。 Create table VarcharUnicodeCheck ( col1 varchar(100) ) insert into VarcharUnicodeCheck (col1) values ('MyCompany') insert into VarcharUnicodeCheck (col1) values ('MyCompany™') insert into VarcharUnicodeCheck (col1) values ('MyCompany░') insert into VarcharUnicodeCheck (col1) values ('MyCompanyï') insert into VarcharUnicodeCheck (col1) values ('MyCompany') select * from VarcharUnicodeCheck 但是varchar的定义说,它允许非Unicode字符串数据。但是Trademark(™)和Registered(®)符号是Unicode字符。该定义是否与varchar数据类型的属性相矛盾?我读了几个链接,例如第一个和第二个。但是,当定义说它仅允许非Unicode字符串值时,我仍然不明白为什么它允许Unicode字符串。

1
忽略“哪里”的口音
在我们的数据库中,我们有关于caron / hatschek的多个条目。现在,当我们的用户搜索不带caron / hatschek的条目时,他们希望找到这些条目。我将通过一个简单的示例来说明这一点: 在我们的数据库中,我们有条目(带有姓名的联系方式) Millière 所以这个名字在这个人居住的国家是正确的。 在我们的国家/地区,caron / hatschek没有任何字符,因此我们的用户搜索Milliere。没有结果,è显然不匹配e。 我不知道这到底是怎么实现的é,è,ê还有更多可供选择(而这仅是字母一个例子e......)。 (另一种方法会容易得多,因为我可以简单地将所有字母替换为用caron / hatschek替换为基本字母。显然,我们的用户确实希望数据库中使用正确的名称版本,而不是残缺的名称。)

3
SQL Server中的分页
我有一个非常大的数据库,大约100 GB。我正在执行查询: select * from <table_name>; 我只想显示第100至200行。 我想了解内部情况。数据库是否将所有记录从磁盘中提取到内存中,然后将第100至400行发送回查询客户端?还是存在任何机制,以便仅使用B树等索引机制从数据库中提取那些记录(第100个-200个)? 我发现这与分页概念有关,但是我无法确切找到它在数据库级别内部如何发生。

4
SQL Server 2016 DB邮件未发送
我正在使用SQL Server 2016,并受到冲击...我的DB Mail无法发送,而且我的地方用光了。我仔细检查了对DBmail可执行文件的SQL帐户权限-它已读取并执行。我输入了防火墙出站端口587的规则。我尝试了另一个具有相同未发送问题的邮件帐户和配置文件。日志(db邮件日志)中唯一的条目是服务的开始和结束。我在任何地方都找不到错误。电子邮件似乎只是进入发送队列,而永不离开。这些帐户可以自己发送邮件,也可以从另一台计算机上的SQL Server 2014实例接收电子邮件。 我有一排发送状态为“未发送”的项目,除了一长列未发送的邮件之外,还检查了所有正常位置的所有预期结果: SELECT * FROM msdb..sysmail_event_log order by log_id DESC SELECT * FROM dbo.sysmail_mailitems SELECT * FROM dbo.sysmail_sentitems USE msdb SELECT sent_status, * FROM sysmail_allitems SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb'; EXECUTE msdb.dbo.sysmail_help_status_sp 我尝试将其关闭然后再打开...所以我错过了DMV等可能会发现这种情况的信息吗?这是我在搜索中没有发现的SQL Server 2016的已知问题吗?还有其他可能的步骤来发送此邮件吗?



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.