是否有关于 SQL Server 2016 中关于如何估计包含 SUBSTRING() 或其他字符串函数的谓词的基数的更改的任何文档或研究?
我问的原因是我正在查看一个在兼容模式 130 下性能下降的查询,原因与与包含对 SUBSTRING() 调用的 WHERE 子句匹配的行数估计值的变化有关。我通过查询重写更正了这个问题,但我想知道是否有人知道有关 SQL Server 2016 中该领域更改的任何文档。
演示代码如下。在这个测试案例中,估计值非常接近,但准确度因数据而异。
在测试用例中,在兼容级别 120 中,SQL Server 似乎使用直方图进行估计,而在兼容级别 130 中,SQL Server 似乎假定表的固定 10% 匹配。
CREATE DATABASE MyStringTestDB;
GO
USE MyStringTestDB;
GO
DROP TABLE IF EXISTS dbo.StringTest;
CREATE TABLE dbo.StringTest ( [TheString] varchar(15) );
GO
INSERT INTO dbo.StringTest
VALUES
( 'Y5_CLV' );
INSERT INTO dbo.StringTest
VALUES
( 'Y5_EG3' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_NE' );
INSERT INTO dbo.StringTest
VALUES
( 'ZY_PQT' );
INSERT INTO …Run Code Online (Sandbox Code Playgroud) sql-server optimization substring sql-server-2016 cardinality-estimates
是否@os_run_priority在sp_add_jobstep实际工作中,在SQL Server 2008 R2?
它被描述为“保留”或“未记录”。但是,我在sp_add_jobstep定义中看到了它:
@os_run_priority INT = 0, -- -15 = Idle, -1 = Below Normal, 0 = Normal, 1 = Above Normal, 15 = Time Critical)
Run Code Online (Sandbox Code Playgroud) 哪个数据库角色成员资格授予在 SQL Server 2012 中执行所有现有存储过程的权限?
我尝试为每个用户添加一个用户,但仍然无法执行存储过程。我不想EXECUTE单独授予每个存储过程,我想将用户添加到角色并且他能够执行其中的任何一个。
是什么导致将对象名称传递给系统存储过程是合法的sp_helptext?
什么机制将对象名称转换为字符串?
例如
-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'
-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax
Run Code Online (Sandbox Code Playgroud)
我不需要单引号有效的.过程名称似乎很奇怪,除非它具有分隔模式名称和过程名称。我正在寻找有关如何将其从带引号的名称自动转换为要作为参数值传递的字符串文字的解释。
我没有要解决的具体问题;我只是对没有记录的事情感到好奇。
sql-server stored-procedures syntax parameter database-internals
这是一个奇怪的情况,但我希望有人有答案。
在一些性能故障排除期间,我们按照sp_BlitzIndex. 第二天我们检查了它的使用情况,它显示0 次读取(0 次扫描/搜索,0 次单例查找),因此我们禁用了它。
就在下一分钟,我们收到了与我们在添加 INDEX 时首先尝试检查和解决的应用程序缓慢(性能问题)相同的投诉。
现在,我知道理论上,这听起来纯属巧合。INDEX 是可证明的,可衡量的,NOT USED。禁用它不应该导致查询性能下降。但它几乎TOO巧合。
所以我的问题很简单,就是这样:
是否有可能,一个未使用的索引(来自 DMV / sp_BlitzIndex)的使用统计数据显示没有使用,仍然以某种方式帮助受影响表上的查询性能?
database-design sql-server index-tuning nonclustered-index sql-server-2016
我正在尝试创建一个新表,其中的列后跟它们的约束,如下所示。
Create tblTest(
columns..
..
..
Gender int,
Constraint DF_tblTest_Gender Default 3 For Gender,
..
..
..
)
Run Code Online (Sandbox Code Playgroud)
但是,我在默认约束附近收到一条错误消息,
'for' 附近的语法不正确
我试图了解逻辑运算的优先顺序并具有以下代码:
declare @T bit ='TRUE'
declare @F bit ='False'
print @T and @F
Run Code Online (Sandbox Code Playgroud)
它返回一个错误
关键字“and”附近的语法不正确。
我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。
我们的供应商应用程序数据库是 TempDB 密集型的。
该服务器是虚拟的 (VMWare),具有 40 个内核和 768GB RAM,运行 SQL 2012 Enterprise SP3。
包括 TempDB 在内的所有数据库都位于 SAN 中的第 1 层 SSD 上。我们有 10 个 tempdb 数据文件,每个文件都预先增长到 1GB 并且它们永远不会自动增长。与 70GB 日志文件相同。跟踪标志 1117 和 1118 已经设置。
sys.dm_io_virtual_file_stats 显示过去一个月对 tempdb 数据和日志文件的读取/写入超过 50 TB,累计 io_stall 为 250 小时或 10 天。
在过去的 2 年中,我们已经调整了供应商的代码和 SP。
现在,我们正在考虑将 tempdb 文件放在 RAM 驱动器上,因为我们有大量内存。由于 tempdb 在服务器重新启动时被破坏/重新创建,因此它是放置在易失性内存中的理想候选者,该内存在服务器重新启动时也会被刷新。
我已经在较低的环境中对此进行了测试,它导致查询时间更快,但 CPU 使用率增加,因为 CPU 正在做更多的工作,而不是等待缓慢的 tempdb 驱动器。
有没有其他人将他们的 tempdb 放在高 oltp 生产系统的 RAM 上?有什么大的缺点吗?是否有任何供应商可以专门选择或避免?
这是一个冗长的选项;没有文档,网络搜索也无济于事。当我执行查询时,我没有注意到选中或未选中选项的区别。这个设置控制什么?
我正在努力寻找有关 SQL Server 如何实际存储非持久计算列的任何文档。
以下面的例子为例:
--SCHEMA
CREATE TABLE dbo.Invoice
(
InvoiceID INT IDENTITY(1, 1) PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID),
InvoiceStatus NVARCHAR(50) NOT NULL,
InvoiceStatusID AS CASE InvoiceStatus
WHEN 'Sent' THEN 1
WHEN 'Complete' THEN 2
WHEN 'Received' THEN 3
END
)
GO
--INDEX
CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice
(
CustomerID ASC
)
INCLUDE
(
InvoiceStatusID
)
GO
Run Code Online (Sandbox Code Playgroud)
我知道它存储在叶级别,但是如果该值没有持久化,那么如何存储任何内容?在这种情况下,索引如何帮助 SQL Server 找到这些行?
非常感谢任何帮助,
非常感谢,
编辑:
感谢 Brent & Aaron 回答这个问题,这里的 PasteThePlan清楚地展示了他们的解释。
sql-server ×10
constraint ×1
index ×1
index-tuning ×1
jobs ×1
optimization ×1
parameter ×1
permissions ×1
security ×1
ssms ×1
substring ×1
syntax ×1
t-sql ×1
tempdb ×1