数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
如果没有计划卸载,是否可以删除Setup Bootstrap文件夹中的Log and Update Cache文件夹?
我在笔记本电脑上安装了多个版本的SQL Server(用于测试)(2012年,2014年,2016年和2017年)。几天前,我注意到有一个文件夹,其中包含更新(SP,CU)中文件的先前版本。在所有版本中,实际上占用了大量空间: (在C:\ Program Files(x86)\ Microsoft SQL Server \中) 110\Setup Bootstrap\Log - 91.8 MB (818 files) 110\Setup Bootstrap\Update Cache - 608 MB (2,382 files) (下面的所有文件夹都位于:C:\ Program Files \ Microsoft SQL Server \) 110\Setup Bootstrap\Log - 1.18 GB (3,715 files) 110\Setup Bootstrap\Update Cache - 9.58 GB (14,766 files) 120\Setup Bootstrap\Log - …

1
bcp命令'。'附近的语法不正确。字符实际上是:“ä”
我 在Ubuntu(Linux)上安装了mssql-server和mssql-tools。当我尝试使用bcp命令使用以下命令行导出数据时: bcp DBname.dbo.Täble_Name out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ 我收到此错误: SQLState = 37000,NativeError = 102 错误= [Microsoft] [用于SQL Server的ODBC驱动程序13] [SQL Server]'。'附近的语法不正确。 该�是ä。 如果我Täble_Name用方括号括起来: bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ 我在对象名称上收到此错误: SQLState = S0002,NativeError = 208 错误= [Microsoft] [SQL Server的ODBC驱动程序13] [SQL Server]无效的对象名'DBname.dbo.Täble_Name'。 …

2
聚集索引选择-PK还是FK?
我有一个SQL Server 2014表,如下所示: OrderId int not null IDENTITY --this is the primary key column OrderDate datetime2 not null CustomerId int not null Description nvarchar(255) null 我团队中的某些人建议应将聚集索引设置为on OrderId,但由于以下原因,我认为CustomerId+ OrderId是更好的选择: 几乎所有查询都会查找WHERE CustomerId = @param,而不是OrderId CustomerId是Customer表的外键,因此具有聚集索引CustomerId可以加快连接速度 虽然CustomerId不是唯一的,但OrderId在索引中指定其他列将确保唯一性(我们可以UNIQUE在这两列上创建聚集索引时使用关键字,以避免不唯一性的开销) 插入数据后,CustomerId和OrderId永远不会更改,因此在初始写入后这些行将不会移动。 数据访问通过默认情况下请求所有列的ORM进行,因此当基于的查询CustomerId进入时,聚集索引将能够提供所有列而无需任何其他工作。 是否CustomerId和OrderId做法的声音是最好的选择给出了上述?或者,OrderId由于它是一个单独保证其唯一性的列,它本身会更好吗? 当前,该表在上有一个聚集索引,在上有一个OrderId非聚集索引CustomerId,但是没有覆盖,因此,由于我们使用的是ORM,并且要求所有列,因此检索它们是额外的工作。因此,通过这篇文章,我试图考虑使用更好的CI来提高性能。 我们数据库上的活动是大约85%的读取和15%的写入。

2
Linux上的SQL Server在首次启动时挂起,没有错误,并且没有新的/更新的ErrorLog文件
我正在Linux(Ubuntu 16.04)上使用SQL Server 2017,候选发布版2(RC2)。 服务器启动时,SQL Server通常也会启动。但是由于某种原因,SQL Server将无法启动。至少我无法使用sqlcmd连接到它。我每次都收到一个ODBC超时(“ Sqlcmd:错误:Microsoft SQL Server的Microsoft ODBC驱动程序13 ”)错误: Login timeout expired. TCP Provider: Error code 0x2749. A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL …

1
从GUI客户端连接到本地MS SQL Server
我对SQL和数据库服务器非常陌生。我最近一直在使用SQL Server Express,并在Windows上使用SQL Server Management Studio访问数据库。我现在正在尝试在Linux机器上实现类似的设置。 我想在计算机上创建一个本地SQL Server实例,然后将SQLectron用作查询我的数据库的GUI客户端。我正在使用Manjaro Linux,因此从AUR安装我的软件包。 到目前为止,我已经安装了mssql-server,mssql-tools并且sqlectron-gui。我已经运行了该sudo /opt/mssql/bin/mssql-conf setup命令,以便(我相信)设置本地服务器。这样做之后,运行命令systemctl status mssql-server将返回以下内容: [kev @ XPS-Manjaro〜] $ systemctl状态mssql-server ●mssql-server.service-Microsoft SQL Server数据库引擎 已加载:已加载(/usr/lib/systemd/system/mssql-server.service;已启用;供应商预设:已禁用) 活跃:活跃于(跑步)自星期三2017-08-23 13:43:49 IST; 2h 42min前 文件:https://docs.microsoft.com/en-us/sql/linux 主PID:9130(sqlservr) 任务:165 CGroup:/system.slice/mssql-server.service ├─9130/ opt / mssql / bin / sqlservr └─9144/ opt / mssql / bin / sqlservr 8月23日13:43:52 XPS-Manjaro …

1
分区约束不适用于涉及按时间戳进行分区的表的联接
我有一个分区表结构,如: CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

1
SQLServer升级顾问2014挂起
我尝试对SQL Server 2008服务器运行SQL Server Upgrade Advisor 2014。 连接到2008服务器时,一切看起来都很好,我可以选择要分析的数据库。 但是一旦启动,它将永远运行,无需进行任何操作(停留在分析规则步骤:0/112)。 发生了什么事,我该如何解决? SQL Server 2008和2014均为Express版本,均安装在我的笔记本电脑上。不幸的是,这是我发现运行升级顾问的唯一方法(存在太多限制,无法在实际的pro / dev数据库上运行它)。 在SQL 2008实例是SP3的需要。 Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) 当Advisor冻结时,我们可以看到4个休眠查询(没有活动查询): SELECT name, cmptlevel FROM …

4
为什么在单个数据库中混合列排序规则被认为是不好的?
有两个原因促使我问这个问题: tSQLt当存在具有非默认归类的列时 ,T-SQL测试框架tSQLt认为它是“高严重性”问题。测试的作者指出以下内容: 我不建议每个字符串列都应具有与数据库默认排序规则匹配的排序规则。相反,我建议,如果有所不同,应该有充分的理由。 但是,如上所述,失败测试的严重性被认为是很高的。 Octopus Deploy 在配置Octopus Deploy Server时,在OctopusServer-instance初始化期间,安装失败并出现致命错误。与错误消息相关的文章没有解释为什么这样做是必需的,而只是指出,从(包括)Octopus 3.8版开始,它将成为将来部署的要求。 作为附带说明,RedGate的CI工具包DLM自动化套件支持具有多种排序规则的部署,而不会产生任何抱怨。 对我而言,将所有列排序规则保留为数据库默认值的建议似乎更像是准则或最佳实践。为什么有些人将其视为如此严重的错误?

3
我们的生产SQL Server上的主要性能问题,该如何解决?
此问题基本上是该问题的后续问题: SQL Server 2016的奇怪性能问题 现在,我们使用此系统提高了生产率。尽管自上次发布以来,另一个应用程序数据库已添加到此SQL Server。 这些是系统统计信息: 128 GB RAM(SQL Server最大110GB内存) 4核心@ 2.6 GHz 10 GBit网络连接 所有存储均基于SSD 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上 Windows Server 2012 R2 VMware版本HPE-ESXi-6.0.0-Update3-iso-600.9.7.0.17 VMware Tools版本10.0.9,内部版本3917699 Microsoft SQL Server 2016(SP1)(KB3182545)-13.0.4001.0(X64)2016年10月28日18:17:30版权所有(c)Windows Server 2012 R2 Standard 6.3(Build 9600 :)上的Microsoft Corporation标准版(64位) (主管) 我们的系统现在存在主要的性能问题。很高的CPU使用率和线程数: 活动监视器的等待统计信息(我知道这不是很可靠) sp_blitzfirst的结果: sp_configure的结果: 进阶伺服器设定(只有德文才可使用) 我更改了MAXDOP设置。 我知道这可能不是SQL Server本身的问题。可能是虚拟化(vmware),与网络相关(我已经测试过)或应用程序本身的问题。我只是想进一步确定它。 高ASYNC_NETWORK_IO是否会导致sqlserver进程的线程数增加?我以为它会激怒许多工作人员,因为无法关闭线程。那正确吗? 我将提供您需要的任何其他信息。预先感谢您的支持! 编辑: 的结果 …

1
如何使用初始空B +树的键输入记录?
显示按顺序输入键(1、2、3、4、5)到初始为空的B + –m = 3的树的记录结果。如果发生溢出,请分割节点,不要重新分配邻居的钥匙。是否可以以不同的顺序使用键输入记录以使树的高度减小? 从Relational DBMS Internals,第5章:动态树结构组织,第50页 我对此并不擅长,但我尝试在左侧做≤,在右侧做>: 直到插入1,2: 然后,就我们必须拆分节点而不要将密钥重新分配给邻居(我理解为子节点)而言,我仅在单元格右侧插入了2: 当插入5时,我继续做同样的事情: 但这很奇怪,我从未见过像这样的空节点...而且我不知道它是否尊重一些非常基本的B树属性: 每个节点最多具有(m-1)个键,并且至少具有(⌈(m / 2)⌉-1)个键,除非键可以为空,并且我会将键理解为“指针”。 第一次尝试:订单错误显示一棵模糊的树 一开始,我误解了“顺序”是什么(每个节点的最大子节点数)。所以我认为一个节点可以有3个空格(因此有4个孩子。我正在创建4阶树): 直到插入1,2,3为止: 插入4,至于我们必须拆分节点并且不将密钥重新分配给邻居(这似乎是矛盾的),我会让1,2,3和4,5在3之后的右叶上:
11 btree 

2
用于有效范围聚合查询的数据库?
作为一个简化的示例,假设我有一个像这样的表: seq | value ----+------ 102 | 11954 211 | 43292 278 | 19222 499 | 3843 该表可能包含数亿条记录,我需要经常执行以下查询: SELECT sum(value) WHERE seq > $a and seq < $b 即使seq已建立索引,典型的数据库实现也将遍历每一行以计算最佳情况下的总和O(n),其中n范围的大小是。 是否有任何数据库可以像在O(log(n))每个查询中一样有效地做到这一点? 我所遇到的数据结构称为段树所描述这里。尽管所有这些名称通常都被描述为数据结构略有不同的变体,但有时也称为范围树或间隔树。 但是,我还没有遇到任何实现这种数据结构的数据库。对于内存结构,从头开始实现它很容易,但是如果必须持久或太大而无法容纳到内存中,则变得棘手。如果有一个有效的模式可以在现有数据库之上实施,那也可能会有所帮助。 旁注:这不是仅追加表,因此在这种情况下,诸如保留累计和之类的解决方案将不起作用。

1
SQL规范是否要求EXISTS()中的GROUP BY
Microsoft当前允许使用此语法。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); 请注意,GROUP BY该EXISTS子句中没有有效的ANSI SQL。还是仅公开实现细节。 作为参考,PostgreSQL不允许使用相同的语法。 错误:“ tx”列必须出现在GROUP BY子句中或在聚合函数中使用 但是允许使用此语法。 SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS …

2
有副作用的标准SQL函数吗?
SQL标准是否定义了具有副作用的函数? 例如,当您执行以下操作时,它们是否具有用于写入文件 *或更新表中某些列中的值的功能? SELECT myfunction(params...); 我有时见过这些,但是我很好奇SQL标准是否也这样做。 *这不是专门针对PostgreSQL的问题。我仅使用在PostgreSQL中看到的副作用示例。

1
SQL Server查询计划XML:QueryPlanHash长度
更新:这绝对是一个错误。有关详细信息,请参见此连接项。 在测试对sp_BlitzCache的一些更改(完整披露,我是作者之一)时,我遇到了我认为是代码中的错误的地方。 一方面,我们要匹配查询计划哈希以获取查询成本。我们这样做是这样的: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') 据我所知,这已经奏效了。但是,在一种奇怪的情况下,XML中的子字符串引发了一个NULL值,尽管成本很高,但该计划的成本却显示为0。 深入研究执行计划(全面披露,我在负责Paste The Plan的公司工作),我注意到一个问题哈希的“查询计划哈希”长为17个字符,其余为18个字符。以下示例: QueryPlanHash =“ 0x4410B0CA640CDA89” QueryPlanHash =“ 0x2262FEA4CE645569” QueryPlanHash =“ 0xED4F225CC0E97E5” –问题! QueryPlanHash =“ 0xBF878EEE6DB955EA” QueryPlanHash =“ 0x263B53BC8C14A452” QueryPlanHash =“ 0x89F5F146CF4B476F” QueryPlanHash =“ 0xEF47EA40805C8961” QueryPlanHash =“ 0xB7BE27D6E43677A5” QueryPlanHash =“ 0x815C54EC43A6A6E9” 查询计划哈希上市为BINARY 8-想必这应该是相同的长度,但到底是什么像我这样的人了解二进制值? 稍微玩一下XQuery,我发现通过将子字符串更改为从第二个位置开始,它会得出一个有效的(尽管不正确)哈希值。 WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS p) SELECT QueryPlanCost = …

1
“存在(…)或存在(…)”中子句的顺序
我有一类查询,用于测试两件事之一的存在。它的形式 SELECT CASE WHEN EXISTS (SELECT 1 FROM ...) OR EXISTS (SELECT 1 FROM ...) THEN 1 ELSE 0 END; 实际语句是用C生成的,并通过ODBC连接作为临时查询执行。 最近发现,在大多数情况下,第二个SELECT可能会比第一个SELECT更快,并且切换两个EXISTS子句的顺序会导致至少在我们刚创建的一个滥用测试用例中实现了急剧的加速。 显而易见的事情是继续进行两个子句的切换,但是我想看看是否有更熟悉SQL Server的人愿意考虑这一点。感觉就像我在依靠巧合和“实现细节”。 (如果SQL Server更聪明,它似乎将并行执行两个EXISTS子句,并让其中一个先完成另一个短路。) 有没有更好的方法来使SQL Server持续改善此类查询的运行时间? 更新资料 感谢您的时间和对我的问题的关注。我本来不会对实际的查询计划有任何疑问,但是我愿意与他们分享。 这是用于支持SQL Server 2008R2及更高版本的软件组件。数据的形状可以根据配置和用途而有很大不同。我的同事考虑对查询进行此更改,因为(在示例中)dbf_1162761$z$rv$1257927703表中的行数总是大于或等于dbf_1162761$z$dd$1257927703表中的行数-有时要多得多(数量级)。 这是我提到的虐待案件。第一个查询是慢速查询,大约需要20秒。第二个查询立即完成。 对于它的价值,最近还添加了“ OPTIMIZE FOR UNKNOWN”位,因为参数嗅探会浪费某些情况。 原始查询: SELECT CASE WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN …
11 sql-server 

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.