我有一类查询测试两件事中的一个的存在。它的形式
SELECT CASE
WHEN EXISTS (SELECT 1 FROM ...)
OR EXISTS (SELECT 1 FROM ...)
THEN 1 ELSE 0 END;
Run Code Online (Sandbox Code Playgroud)
实际语句是用 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 秒。第二个查询立即完成。
值得一提的是,最近还添加了“优化未知”位,因为参数嗅探会破坏某些情况。
原始查询:
SELECT CASE
WHEN EXISTS (SELECT 1 FROM zumero.dbf_1162761$z$rv$1257927703 rv INNER JOIN zumero.dbf_1162761$t$tx tx ON tx.txid=rv.txid WHERE tx.generation BETWEEN …Run Code Online (Sandbox Code Playgroud) SQL Server 2016 引入了STRING_SPLIT,它非常快,是人们在 2016 年之前推出的任何自制实现的绝佳替代品。
不幸的是,STRING_SPLIT 只支持单字符分隔符,这并不总是足够的。有谁知道允许在分隔符中使用多个字符的良好实现?
我们正在尝试blob使用一个简单的脚本将(二进制数据)从一个数据库复制到另一个数据库。这是我们要做的步骤。
INSERT脚本中notepad。我们注意到值现在是一个以ASCII它开头的值,0x255....它似乎是数据的hexadecimal表示binary。有没有办法在插入过程中将其转换回二进制?
有没有更好的方法来blob使用脚本复制数据?假设,我们没有直接连接到目标数据库。
我尝试针对 SQL Server 2008 服务器运行 SQL Server Upgrade Advisor 2014。
连接到 2008 服务器时一切正常,我可以选择要分析的数据库。
但是一旦启动,它就会永远运行,什么也不做(停留在分析规则:0/112步骤)。
发生了什么,我该如何解决?
SQL Server 2008 和 2014 都是 Express 版本并安装在我的笔记本电脑上。不幸的是,这是我发现运行升级顾问的唯一方法(在真正的生产/开发数据库上运行它有太多限制)。
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: )
Run Code Online (Sandbox Code Playgroud)
当 Advisor 被冻结时,我们可以看到 4 个休眠查询(没有活动查询):
SELECT name,
cmptlevel
FROM
(SELECT name,
dbid,
cmptlevel,
DATABASEPROPERTYEX(name, N'UserAccess') AS 'UserAccess',
DATABASEPROPERTYEX(name, …Run Code Online (Sandbox Code Playgroud) 我有一个将 650 个字段插入表中的存储过程。插入失败并出现截断错误。
这是一个简单的
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Run Code Online (Sandbox Code Playgroud)
下面是错误信息:
消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行 字符串或二进制数据将被截断。
有没有一种快速的方法可以识别导致截断错误的字段?
要插入表中的 select 语句有 650 个字段,因此很难确定哪个字段导致了截断错误。
我想我可以一次注释掉字段块,以便 SP 一次只插入 100 个字段,然后运行 SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。
或者,我在想,也许我可以只创建SELECT INTO一个新表,然后将表中的数据长度与我尝试插入到我的 SP 中的目标表的数据长度进行比较,以查看哪个字段包含比预期更长的字段长度。 ..
我正在使用 SQL Server 2014。
有没有更简单的替代品?
有两个原因促使我提出这个问题:
tSQLt当存在具有非默认排序规则的列时
,T-SQL 测试框架 tSQLt 将其视为“高严重性”问题。测试的作者声明如下:
我并不是建议每个字符串列都应该有一个与数据库的默认排序规则相匹配的排序规则。相反,我建议当它不同时,应该有一个很好的理由。
然而,如前所述,失败测试的严重性被认为是高的。
八达通部署
在配置八达通部署服务器时,在八达通服务器实例的初始化过程中,设置失败并出现致命错误。与错误消息相关的文章并没有解释为什么这是一项要求,而只是说明它将成为未来部署的一项要求,包括 Octopus 3.8 版。
附带说明一下,RedGate 的 CI 工具包DLM 自动化套件支持具有不同排序规则的部署而不会出现投诉。
将所有列排序规则保留为数据库默认值的建议对我来说更像是指南或最佳实践。为什么有人认为这是一个严重的错误?
我对 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 status mssql-server
? mssql-server.service - Microsoft SQL Server 数据库引擎
已加载:已加载(/usr/lib/systemd/system/mssql-server.service;已启用;供应商预设:已禁用)
Active:自 2017-08-23 周三 13:43:49 IST 开始活跃(运行);2 小时 42 分钟前
文档: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 … 我有一个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
Run Code Online (Sandbox Code Playgroud)
我团队中的一些人建议聚集索引应该在OrderId,但我认为CustomerId+OrderId将是更好的选择,原因如下:
WHERE CustomerId = @param,而不是OrderIdCustomerId是Customer表的外键,因此使用聚集索引CustomerId应该会加快连接速度CustomerId不是唯一的,但OrderId在索引中指定额外的列将确保唯一性(我们可以UNIQUE在这两列上创建聚集索引时使用关键字,以避免没有唯一性的开销)CustomerId并且OrderId永远不会改变,所以这些行在初始写入后不会移动。CustomerId进来时,聚集索引将能够提供所有列而无需任何额外工作。是否CustomerId和OrderId做法的声音是最好的选择给出了上述?或者,OrderId它本身更好,因为它是一个单独的列,它本身就保证了唯一性?
目前,该表在 上有一个聚集索引,在 上有一个OrderId非聚集索引CustomerId,但它没有覆盖,所以由于我们使用的是 ORM …
我在 Linux (Ubuntu 16.04) 上使用 SQL Server 2017, Release Candidate 2 (RC2)。
当服务器启动时,SQL Server 通常也会启动。但出于某种原因,SQL Server 将无法再启动。至少我无法使用sqlcmd连接到它。我现在每次都收到 ODBC 超时(“Sqlcmd:错误:Microsoft ODBC Driver 13 for SQL Server ”)错误:
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 Server is configured to allow remote connections.
For more information see SQL Server …Run Code Online (Sandbox Code Playgroud) 我知道有一些问题可以解决数据库卡在RESTORING状态的问题,并且已经使用这些解决方案手动使数据库重新联机,但我的情况有些不同。
我使用 Powershell 脚本进行自动恢复,该脚本将生产副本恢复到 DEV 实例。脚本大约一年没有变化,偶尔恢复过程完成但恢复的数据库卡在RESTORING状态(有时脚本工作正常,有时会像这样失败)。
每次如果我手动重新运行该过程,它就会工作,或者如果我从 SSMS 的用户界面或通过 T-SQL 手动恢复数据库,它都会毫无问题地完成。
我找到了建议CHECKDB在恢复的数据库上运行的答案,但没有发现导致此问题的原因。
由于恢复脚本恢复了数据库的完整备份并使用了一个"WITH RECOVERY"选项,我试图找出可能会停止恢复过程的原因,尽管我实际上是使用"WITH RECOVERY".
任何建议都非常感谢,因为我一直试图理解为什么会不时发生这种情况。
我很想解决问题的根本原因而不是治标,即再次手动恢复数据库。
更新:
正如@Brent 推荐的那样,Github Gist在这里。
sql-server ×10
linux ×2
t-sql ×2
backup ×1
blob ×1
collation ×1
connectivity ×1
errors ×1
powershell ×1
upgrade ×1