Questions tagged «sql-server»

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

1
SQL Server-处理嵌套的非确定性视图堆栈中的字符串本地化
在对数据库进行概要分析时,我遇到了一个视图,该视图引用了一些不确定性函数,对于该应用程序池中的每个连接,每分钟可访问1000-2500次。从视图中看,一个简单的代码将产生以下执行计划:SELECT 对于少于一千行的视图来说,这似乎是一个复杂的计划,每隔几个月可能会看到一两行发生变化。但是随着以下其他情况的恶化,情况变得更糟: 嵌套视图是不确定的,因此我们无法为其编制索引 每个视图都引用多个UDFs来构建字符串 每个UDF都包含嵌套UDF的,以获取本地化语言的ISO代码 堆栈中的视图使用从s 返回的其他字符串构建器UDF作为JOIN谓词 每个视图堆被视为一个表,这意味着有INSERT/ UPDATE/ DELETE在每个触发器来写入底层表 在视图上,这些触发器使用CURSORS该EXEC存储过程作为参考更多的这些串建设UDF秒。 这对我来说似乎很烂,但是我只有几年使用TSQL的经验。它也会变得更好! 看来开发人员认为这是个好主意,做了所有这些工作,以便所存储的几百个字符串可以基于从UDF特定于模式的a返回的字符串进行翻译。 这是堆栈中的视图之一,但是它们都同样糟糕: CREATE VIEW [UserWKStringI18N] AS SELECT b.WKType, b.WKIndex , CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.I18NString ELSE il.I18nString END AS WKString ,CASE WHEN ISNULL(il.I18NID, N'') = N'' THEN id.IETFLangCode ELSE il.IETFLangCode END AS IETFLangCode ,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, …

3
为什么创建一个简单的CCI行组最多需要30秒?
当我发现一些插入内容花费的时间比预期的长时,我正在进行一个涉及CCI的演示。要重现的表定义: DROP TABLE IF EXISTS dbo.STG_1048576; CREATE TABLE dbo.STG_1048576 (ID BIGINT NOT NULL); INSERT INTO dbo.STG_1048576 SELECT TOP (1048576) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN FROM master..spt_values t1 CROSS JOIN master..spt_values t2; DROP TABLE IF EXISTS dbo.CCI_BIGINT; CREATE TABLE dbo.CCI_BIGINT (ID BIGINT NOT NULL, INDEX CCI CLUSTERED COLUMNSTORE); 对于测试,我将从登台表中插入所有1048576行。只要它由于某种原因没有被修剪,就足以填充一个压缩的行组。 …

6
a = 0和b = 0以及…z = 0与a + b + c + d = 0的性能
这是一个简单的问题,我似乎找不到答案。 在性能方面,如果我有WHERE诸如这样的子句a=0 and b=0 and ... z=0,如果我用替换该条件,我会获得任何性能a+b+...+z=0吗? 换句话说,通过替换以下内容,可以提高性能吗? Select * From MyTable Where A=0 and B=0 and C=0 and D=0... 用 Select * From MyTable Where A+B+C+D=0... 我知道它可以依赖于索引,但是为此,我们只说不存在索引。算术运算符(+)的性能是否优于“或”或“与”逻辑运算符? 我的印象是,加法的效果要好于使用AND或OR的多个条件。 检测结果 在420万行的表上 返回行,其中A = 0 B = 0和C = 0-> 351748行 加法(A + B + C = 0)花费了5秒,而逻辑条件A = 0且B = …

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
通过互斥子类在类型/子类型设计模式中实现子类型的子类型
介绍 为了使该问题对将来的读者有用,我将使用通用数据模型来说明我面临的问题。 我们的数据模型由3个实体,这应标明的A,B和C。为了使事情简单,它们的所有属性都是int类型。 实体A具有以下属性:D,E和X; 实体B具有以下属性:D,E和Y; 实体C具有以下属性:D和Z; 由于所有实体都具有相同的属性D,因此我决定采用类型/子类型设计。 重要提示:实体是互斥的!这意味着实体是A或B或C。 问题: 实体A和B具有另一个公共属性E,但是该属性在实体中不存在C。 题: 如果可能的话,我想利用上述特征进一步优化设计。 老实说,我不知道如何执行此操作,也不知道从哪里开始尝试,因此不知道该帖子。

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
为什么这些字符在SQL Server中都相等?
我就是不明白。请参阅以下SQL查询: select nchar(65217) -- ﻁ select nchar(65218) -- ﻂ select nchar(65219) -- ﻃ select nchar(65220) -- ﻄ if nchar(65217) = nchar(65218) print 'equal' if nchar(65217) = nchar(65219) print 'equal' if nchar(65217) = nchar(65220) print 'equal' 基于传递关系,这意味着SQL Server会将它们全部视为相同的字符。 但是,在其他环境中(例如C#),它们是不同的。 我感到困惑的是: 字符串比较如何在SQL Server中工作 为什么比较在一台计算机和一个平台上的表现不一样,但是环境不同 这四个字符代表一个人类可理解的字符。为什么它们在Unicode字符图中如此丰富? 当然,这会导致巨大的问题,因为我正在处理文本处理应用程序,并且数据几乎来自任何地方,因此我需要在处理文本之前对其进行规范化。 如果我知道差异的原因,我可能会找到解决方案。谢谢。

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 …

4
您如何查找未安装SSMS的SQL Server版本/版本?
在未安装Management Studio的情况下如何查找已安装的版本?我有一台服务器,充当另一软件的许可证管理器。在调查内存使用率过高警报时,我发现sqlservr.exe进程占用了将近2 GB的RAM。 我浏览了程序菜单,发现已安装了配置管理器,否则,它几乎是白手起家。我单击了EXE文件的属性,找到了10.50.1600.1,但没有找到表明它是Express,Dev,STN,ENT等的位置。 如果要猜测,这是速成版,但我想知道是否有明显的告示牌。 更新:@Bob-文件告诉我我所知道的,而不是版本。 @valo-运行该命令并确认启用了命名管道时出现以下错误: HResult 0x35,级别16,状态1命名管道提供程序:无法打开与SQL Server [53]的连接。Sqlcmd:错误:Microsoft SQL Server本机客户端10.0:建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。无法找到服务器或无法访问服务器。检查实例名称是否正确,以及是否将SQL Server配置为允许远程连接。有关更多信息,请参见SQL Server联机丛书。Sqlcmd:错误:Microsoft SQL Server本机客户端10.0:登录超时已过期。 @thomas- 在问问题之前,我注意到库存单位名称,但这似乎太容易了,我想我最初的怀疑是正确的。
20 sql-server 

1
转换为数字后,奇怪的SQL Server实例崩溃
使用C#实体框架时,我注意到我的SQL Server实例崩溃了。 我能够将其追溯到以下语句: SELECT * FROM dbo.[TestTable] where mpnr in (1099059904, 1038139906, 1048119902, 1045119902, 1002109903, 1117109910, 1111149902, 1063149902, 1117159902, 1116109904, 1105079905, 1012079906, 1129129904, 1103059905, 1065059905, 1091059906, 1110149904, 1129149903, 1083029905, 1080139904, 1076109903, 1010019902, 1058019902, 1060019903, 1053019902, 1030089902, 1018149902, 1077149902, 1010109901, 1011109901, 1000119902, 1023049903, 1107119909, 1108119909, 1106119909) 该表如下所示: CREATE TABLE dbo.[TestTable]([MPNR] [numeric](9, …

2
是否有每个SQL Server版本的联机操作的完整列表?
当我们即将更改5TB数据库中的一些大表时,我发现自己需要一个可以在线执行的操作的列表,并且这些操作要求在运行时保持完全锁定。理想情况下,该列表还将包含有关哪些语句需要SCH-M锁在最后提交的信息。 虽然我在Microsoft时就了解了其中的大多数知识,但令我感到惊讶的是,由于它们是从SQL Server 2005一直发展到2014 CTP的,因此找不到公开的在线操作列表。 有人有这样的列表吗?如果没有,我可能决定创建它。

4
执行计划与STATISTICS IO顺序
SQL Server图形执行计划从右到左,从上到下阅读。产生的输出是否有意义SET STATISTICS IO ON? 以下查询: SET STATISTICS IO ON; SELECT * FROM Sales.SalesOrderHeader AS soh JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID JOIN Production.Product AS p ON sod.ProductID = p.ProductID; 生成此计划: 并STATISTICS IO输出: Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob …

2
如何使用Windows身份验证使链接服务器正常工作?
我正在尝试使用域环境中的“使用登录名的当前安全上下文制作”来链接到在另一台服务器ServerB上创建的ServerA的链接服务器。我读到我需要为在每个服务器上运行SQL Server的服务帐户创建SPN,以启用Kerberos。我已经做到了,并且现在都显示身份验证方案为Kerberos,但是,我仍然面临错误: "Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'". 在Active Directory中,我可以看到ServerB的服务帐户可以信任用于委派MSSQLSvc,但是我注意到ServerA的服务帐户尚未启用“信任此用户进行委派”。目标服务器是否还需要启用该选项?要使用当前的Windows登录名来使用链接服务器,是否还有其他必要?


4
在HashBytes函数中选择正确的算法
我们需要创建nvarchar数据的哈希值以进行比较。T-SQL中有多种可用的哈希算法,但是在这种情况下,哪一种是最好的选择? 我们要确保两个不同的nvarchar值具有重复哈希值的风险最小。根据我对互联网的研究,MD5似乎是最好的。那正确吗?MSDN向我们(下面的链接)介绍了可用的算法,但是没有说明在哪种条件下使用哪种算法? 哈希(Transact-SQL) 我们需要在两个nvarchar(max)列上联接两个表。可以想象,查询需要一段时间才能执行。我们认为最好保留每个nvarchar(max)数据的哈希值,然后对哈希值进行联接,而不是blob的nvarchar(max)值。问题是哪种哈希算法提供了唯一性,因此我们不会遇到为多个nvarchar(max)拥有一个哈希值的风险。

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.