Questions tagged «sql-server-2014»

SQL Server 2014(主要版本12.0.xxxx)。还请标记sql-server。

1
SQL Server 2014可以在批处理模式下执行什么操作?
在查询中使用列存储索引时,SQL Server可以使用批处理模式。关于可以在批处理模式下运行什么以及不能在批处理模式下运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行大量操作: (这是一个估计的计划。我使用实际计划来验证实际执行模式确实是批处理的。) 请注意,只有T1的构建方使用列存储索引。所有探针输入(T2和T3)都是行存储。他们的数据似乎转换为批处理模式。我一直认为批处理模式仅用于通过探针侧运行的数据流。 似乎数据可以转换为批处理模式,即使它不是源自于列存储索引。这就提出了一个问题:为什么SQL Server也不将批处理模式也用于仅行存储的查询?对于其中一些人可能是有益的。使用列存储索引是否是使SQL Server考虑批处理模式所必需的正式要求?我们是否可以添加一个带有列存储索引的零行伪表来引入批处理模式并实现性能提升? 自SQL Server 2014起,批处理模式下到底可以运行什么?

1
SQL Server 2014 Express中的SQLCMD.EXE在哪里?
使用“ SQLCMD.EXE”备份我的SQL Server Express数据库多年后,我才发现安装2014版本后,再也找不到SQLCMD.EXE。 在以前的版本中,它位于 C:\ Program Files \ Microsoft SQL Server \ 110 \ Tools \ Binn \ SQLCMD.EXE 但是在我的2014安装中,不存在SQLCMD.EXE C:\ Program Files \ Microsoft SQL Server \ 120 \ Tools \ Binn 我的问题: 有机会将SQLCMD.EXE放入SQL Server Express 2014吗?

2
为什么串联运算符估计的行数少于其输入的行数?
在下面的查询计划摘要中,很明显,该Concatenation运算符的行估计应为~4.3 billion rows,或其两个输入的行估计之和。 但是,~238 million rows会产生一个估计值,从而导致次优Sort/ Stream Aggregate策略,该策略会将数百GB的数据溢出到tempdb。在这种情况下,逻辑上一致的估计将产生Hash Aggregate,消除了溢出,并显着提高了查询性能。 这是SQL Server 2014中的错误吗?在任何合理的情况下,估算值低于输入值可能是合理的?可能有哪些解决方法? 这是完整的查询计划(匿名)。我没有对该服务器的sysadmin访问权限,无法提供来自QUERYTRACEON 2363或类似跟踪标记的输出,但是如果有帮助的话,也许可以从管理员那里获取这些输出。 该数据库的兼容性级别为120,因此正在使用新的SQL Server 2014基数估计器。 每次加载数据时都会手动更新统计信息。给定数据量,我们当前正在使用默认采样率。较高的采样率(或FULLSCAN)可能会产生影响。

1
使用GUI还原数据库-还原错误的文件
我只是在弄弄SSMS图形界面,并研究“恢复”任务的选项。 我注意到的一件事是,当我单击“生成脚本”时,查询的第一行是: RESTORE DATABASE [MyDatabase] FROM DISK = N'Server_Patch\Database_name_LOGSHIPPING.BKP' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5 ( and a lot of log backups for point in time ) 好的,没问题,但是,我正在对该数据库进行每日备份。这Database_name_LOGSHIPPING.BKP是我一个月前用于日志传送的文件的名称。 为什么当我尝试使用SSMS图形界面还原备份时,它指向此备份文件?我什至没有这个文件了。 通过来自MSSQLTIPS的查询,我可以看到该数据库中的所有备份: SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date, msdb.dbo.backupset.expiration_date, CASE msdb..backupset.type WHEN 'D' THEN 'Database' WHEN 'L' …

3
SQL Server中的巨大数据和性能
我已经编写了一个带有SQL Server后端的应用程序,该应用程序可以收集和存储大量记录。我已经计算出,在高峰时,平均记录量约为每天3亿4千万(运行20小时)。 我的原始解决方案(在完成数据的实际计算之前)是让我的应用程序将记录插入到客户查询的同一张表中。显然,该崩溃和烧毁很快,因为不可能查询插入了这么多记录的表。 我的第二个解决方案是使用2个数据库,一个用于应用程序接收的数据,另一个用于客户端就绪的数据。 我的应用程序将接收数据,将其分块成约10万条记录,然后批量插入到临时表中。在记录约100k之后,应用程序将即时创建另一个具有与以前相同的架构的登台表,然后开始插入该表中。它将在作业表中创建一条记录,该表的名称具有100k条记录,并且SQL Server端的存储过程会将数据从登台表移至可用于客户端的生产表,然后删除表由我的应用程序创建的临时表。 除了具有Jobs表的登台数据库之外,两个数据库都具有相同模式的5个表的相同集合。暂存数据库在将要存储大量记录的表上没有完整性约束,键,索引等。如下所示,表名称为SignalValues_staging。目的是让我的应用程序尽快将数据装入SQL Server。动态创建表以便轻松迁移表的工作流程效果很好。 以下是我的登台数据库中的5个相关表以及我的作业表: 我编写的存储过程负责处理所有登台表中的数据并将其插入生产环境。以下是我的存储过程的一部分,该过程从登台表插入生产环境: -- Signalvalues jobs table. SELECT * ,ROW_NUMBER() OVER (ORDER BY JobId) AS 'RowIndex' INTO #JobsToProcess FROM ( SELECT JobId ,ProcessingComplete ,SignalValueStagingTableName AS 'TableName' ,(DATEDIFF(SECOND, (SELECT last_user_update FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID(DB_NAME()) AND OBJECT_ID = OBJECT_ID(SignalValueStagingTableName)) ,GETUTCDATE())) SecondsSinceLastUpdate FROM SignalValueJobs …

2
选择所有记录,如果存在联接,则与表A联接,如果不存在,则与表B联接
所以这是我的情况: 我正在为我的一个项目进行本地化,通常我会在C#代码中进行此操作,但是我想在SQL中进行更多操作,因为我想稍微弄点点SQL。 环境:SQL Server 2014 Standard,C#(.NET 4.5.1) 注意:编程语言本身应该无关紧要,为了完整起见,我仅将其包括在内。 所以我完成了我想要的,但是没有达到我想要的程度。自从我完成了JOIN除基本SQL 之外的任何SQL以来,已经有一段时间了(至少一年),这相当复杂JOIN。 这是数据库相关表的示意图。(还有更多,但是这部分不是必需的。) 映像中描述的所有关系都已在数据库中完成- PK和FK约束都已设置和运行。所描述的列均不null可用。所有表都具有架构dbo。 现在,我有一个查询这几乎做什么,我想:即给定任何的标识SupportCategories和任何的标识Languages,这将返回: 如果有合适的,正确的翻译是语言该字符串(即StringKeyId- > StringKeys.Id存在,并在LanguageStringTranslations StringKeyId,LanguageId以及StringTranslationId是否同时存在,那么它的负载StringTranslations.Text为StringTranslationId。 如果LanguageStringTranslations StringKeyId,LanguageId和StringTranslationId组合没有不存在,那么它加载的StringKeys.Name值。该Languages.Id是给定的integer。 我的查询很混乱,如下所示: SELECT CASE WHEN T.x IS NOT NULL THEN T.x ELSE (SELECT CASE WHEN dbo.StringTranslations.Text IS NULL THEN dbo.StringKeys.Name ELSE dbo.StringTranslations.Text END AS Result FROM dbo.SupportCategories INNER JOIN dbo.StringKeys ON …

3
强制流量不同
我有一张这样的桌子: CREATE TABLE Updates ( UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, ObjectId INT NOT NULL ) 本质上跟踪ID不断增加的对象的更新。 该表的使用者将选择一个由100个不同的对象ID组成的块,这些ID UpdateId由一个特定的并从其开始UpdateId。从本质上讲,跟踪它停止的位置,然后查询任何更新。 我发现这是一个有趣的优化问题,因为我只能通过编写恰好由于索引而做我想要做的查询的查询来生成一个最大最优查询计划,但不能保证我想要的: SELECT DISTINCT TOP 100 ObjectId FROM Updates WHERE UpdateId > @fromUpdateId @fromUpdateId存储过程参数在哪里。 有以下计划: SELECT <- TOP <- Hash match (flow distinct, 100 rows touched) <- Index seek 由于UpdateId正在使用对索引的查找,因此结果已经不错,并且可以按照我想要的那样从最低更新ID到最高更新ID进行排序。这会生成一个流程明确的计划,这正是我想要的。但是排序显然不能保证行为,所以我不想使用它。 此技巧还导致了相同的查询计划(尽管具有冗余的TOP): …

6
始终将单个整数列作为主键的不利之处是什么?
在我正在处理的一个Web应用程序中,所有的数据库操作都使用在Entity Framework ORM上定义的一些通用存储库来抽象。 但是,为了对通用存储库进行简单设计,所有涉及的表都必须定义一个唯一的整数(Int32在C#中,int在SQL中)。到目前为止,这始终是表格的PK以及IDENTITY。 外键被大量使用,它们引用这些整数列。它们是一致性和ORM生成导航属性所必需的。 应用程序层通常执行以下操作: 从表(*)加载初始数据 -SELECT * FROM table 更新 -UPDATE table SET Col1 = Val1 WHERE Id = IdVal 删除 -DELETE FROM table WHERE Id = IdVal 插入 -INSERT INTO table (cols) VALUES (...) 不太频繁的操作: 批量插入 - BULK INSERT ... into table所有数据加载后跟(*)(以检索生成的标识符) 批量删除 -这是正常的删除操作,但是从ORM的角度来看,这是“笨拙的”:DELETE FROM table where …

12
在SQL Server中仅将每个句子的每个单词的首字母大写
我只想将SQL列中每个句子的每个单词的首字母大写。 例如,如果句子是: 我喜欢电影 然后我需要输出: 我喜欢电影 查询: declare @a varchar(15) set @a = 'qWeRtY kEyBoArD' select @a as [Normal text], upper(@a) as [Uppercase text], lower(@a) as [Lowercase text], upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only] 在这里,我只在专栏中对上,下和大写第一个字母(这里我只输入了一个随机单词)。 这是我的结果: 有这样做的可能性吗? 不使用用户定义的功能就可以得到结果吗? 我需要输出 Qwerty Keyboard

3
集群列存储索引和外键
我正在使用索引对数据仓库进行性能优化。我对SQL Server 2014相当陌生,Microsoft描述了以下内容: “我们将群集列存储索引视为存储大型数据仓库事实表的标准,并期望在大多数数据仓库场景中使用该索引。由于群集列存储索引是可更新的,因此您的工作负载可以执行大量的插入,更新,和删除操作。” http://msdn.microsoft.com/en-us/library/gg492088.aspx 但是,如果您进一步阅读文档,则会发现存在以下限制和限制: “不能具有唯一性约束,主键约束或外键约束。” 这让我很困惑!出于各种原因(数据完整性,语义层可见的关系...),在数据仓库中具有外键是一种很好的做法(不是强制性的) 因此,Microsoft提倡针对数据仓库方案使用集群列存储索引。但是,它不能处理外键关系?! 我对此是否正确?您还建议其他哪些方法?过去,我在数据仓库场景中使用了非集群列存储索引,并为数据负载进行了删除和重建。但是,SQL Server 2014然后没有为数据仓库添加任何真正的新价值?

4
内存优化表-它们真的很难维护吗?
我正在研究从MS SQL 2012升级到2014的好处。SQL2014的最大卖点之一是内存优化表,该表显然使查询超快。 我发现在内存优化表上有一些限制,例如: 没有(max)大小字段 每行最大〜1KB 没有timestamp领域 没有计算列 无UNIQUE约束 这些都是令人讨厌的东西,但是如果我真的想解决这些问题以获得性能上的好处,我可以制定一个计划。 真正的缺点是您不能运行一条ALTER TABLE语句,并且每次将一个字段添加到索引列表中时,都必须经过这个严格INCLUDE的规定。此外,似乎必须将用户拒之于系统之外,以便对实时DB上的MO表进行任何模式更改。 我发现这完全是令人发指的,以至于我实际上无法相信Microsoft可以在此功能上投入这么多的开发资金,而使它的维护非常不切实际。这使我得出一个结论,就是我一定弄错了方向。我一定对内存优化表有误解,这使我相信维护它们的难度要比实际困难得多。 那么,我误会了什么?您是否使用过MO表?是否有某种秘密的开关或过程使它们易于使用和维护?

5
无法在计算列上创建过滤索引
在我的上一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 计算所得的列是PERSISTED,并且根据computed_column_definition(Transact-SQL): 坚持 指定数据库引擎将物理地将计算出的值存储在表中,并在更新计算出的列所依赖的任何其他列时更新这些值。将计算列标记为PERSISTED允许在确定的但不精确的计算列上创建索引。有关更多信息,请参见计算列上的索引。任何用作分区表分区列的计算列都必须显式标记为PERSISTED。当指定PERSISTED时,computed_column_expression必须是确定性的。 但是,当我尝试在列上创建索引时,出现以下错误: CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

4
在窗口功能中使用DISTINCT和OVER
我正在尝试将查询从Oracle迁移到SQL Server 2014。 这是我的查询,在Oracle中效果很好: select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable 这是我尝试在SQL Server 2014中运行此查询后遇到的错误。 Use of DISTINCT is not allowed with the OVER clause 有人知道是什么问题吗?在SQL Server中可以进行这种查询吗?请指教。


2
SQL Server UniqueIdentifier / GUID内部表示
我的一个同事给我发了一个有趣的问题,我无法完全解释。 他运行了一些代码(包括在下面),并从中获得了一些意外的结果。 本质上,将UniqueIdentifier(从现在开始,我将其称为)类型Guid转换为binary(或varbinary)类型时,结果的前半部分的顺序是向后的,但后半部分的顺序不是。 我的第一个想法是,系统的字节序是原因,并且Guid保留了显示,但是binary不能保证形式。 显然,这是一个实现细节,但是我想知道是否对此有一个很好的解释。 码: declare @guid uniqueidentifier = '8A737954-CBEC-40CE-A534-2AFFB5A0E207'; declare @binary binary(16) = (select convert(binary(16), @guid)); select @guid as [GUID], @binary as [Binary]; 结果: GUID Binary 8A737954-CBEC-40CE-A534-2AFFB5A0E207 0x5479738AECCBCE40A5342AFFB5A0E207 如您所见,Guid(一直到40CE)的前半部分对于每个部分都向后存储。也就是说,的第一部分Guid向后,然后是第二部分,然后是第三部分,但是保留了这些部分的顺序。之后,最后两节将按照它们在中显示的确切顺序进行存储Guid。 谁能解释一下?(下面包括一个更大的测试集。) 码: declare @guid_to_binary table ( [id] int identity(1,1), [guid] uniqueidentifier, [binary_conversion] binary(16) ); declare @i int = 1; …

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.