根据此博客,函数或存储过程的参数如果不是OUTPUT参数,则本质上是按值传递的,如果它们是参数,则基本上被视为按引用传递的更安全版本OUTPUT。
起初我认为强制声明 TVP 的目的READONLY是向开发人员明确表示 TVP 不能用作OUTPUT参数,但必须有更多的进展,因为我们不能将非 TVP 声明为READONLY. 例如以下失败:
create procedure [dbo].[test]
@a int readonly
as
select @a
Run Code Online (Sandbox Code Playgroud)
消息 346,级别 15,状态 1,过程测试
参数“@a”不能声明为 READONLY,因为它不是表值参数。
OUTPUT出于某种原因不希望 TVP 成为参数有关?简单:我想计算子查询中的行数。请注意,状态是主机是否在线。
SELECT COUNT(ip_address) FROM `ports` (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)
Run Code Online (Sandbox Code Playgroud)
第一个查询在单独运行时返回:
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(ip_address) FROM `ports` (
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)
Run Code Online (Sandbox Code Playgroud)
自行运行的第二个查询返回:
SELECT COUNT(ip_address) FROM `ports`
Run Code Online (Sandbox Code Playgroud)
SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
Run Code Online (Sandbox Code Playgroud)
我想知道如何计算 5 个 IP 地址的列表。
我一直在网上寻找这个简单问题的可能解决方案,但感到沮丧,所以我想问问专家。
产生“Excessive Grant”执行计划警告的条件是什么?
查询内存授予检测到“ExcessiveGrant”,这可能会影响可靠性。授权大小:初始 5128 KB,最终 5128 KB,已用 16 KB。
<Warnings>
<MemoryGrantWarning GrantWarningKind="Excessive Grant"
RequestedMemory="5128" GrantedMemory="5128" MaxUsedMemory="16" />
</Warnings>
Run Code Online (Sandbox Code Playgroud) 我昨天在查询时遇到了一些性能问题,经过进一步调查,我注意到我认为我试图深入了解聚集列存储索引的奇怪行为。
该表是
CREATE TABLE [dbo].[NetworkVisits](
[SiteId] [int] NOT NULL,
[AccountId] [int] NOT NULL,
[CreationDate] [date] NOT NULL,
[UserHistoryId] [int] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
与索引:
CREATE CLUSTERED COLUMNSTORE INDEX [CCI_NetworkVisits]
ON [dbo].[NetworkVisits] WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
该表目前有 13 亿行,我们不断向其中插入新行。当我说不断时,我的意思是一直。这是一次向表中插入一行的稳定流程。
Insert Into NetworkVisits (SiteId, AccountId, CreationDate, UserHistoryId)
Values (@SiteId, @AccountId, @CreationDate, @UserHistoryId)
Run Code Online (Sandbox Code Playgroud)
执行计划在这里
我还有一个每 4 小时运行一次的预定作业,用于从表中删除重复的行。查询是:
With NetworkVisitsRows
As (Select SiteId, UserHistoryId, Row_Number() Over (Partition By SiteId, UserHistoryId
Order By CreationDate Asc) RowNum
From NetworkVisits
Where CreationDate …Run Code Online (Sandbox Code Playgroud) 我们有多台机器,我们已将事务日志的大小预先分配为 50GB。我试图重组的表的大小是 55 - 60 GB,但会不断增加。我想重组的主要原因是回收空间和任何性能优势,因为这是一个额外的好处。
表的碎片级别为 30 - 35%。在其中一些机器上,我收到“事务日志已满”错误并且重组失败。事务日志大小高达 48GB。有什么好的方法可以解决这个问题?我们没有打开自动增量,我不愿意这样做。
我可以将日志大小增加到更大的值,但是随着将来表大小的增加,该值可能不够。如果我要同等地增加日志大小,它也会破坏进行重组以回收空间的目的。关于如何有效应对这种情况的任何想法?使用批量模式不是一种选择,因为数据丢失是不可接受的。
sql-server-2008 sql-server transaction-log index-maintenance
考虑到优化器不能花它需要的所有时间(它必须最小化执行时间而不是贡献它)来探索所有可能的执行计划,它有时会被切断。
我想知道这是否可以覆盖以便您可以在需要时(或一定数量的毫秒)始终提供优化器。
我不需要这个(atm),但我可以想象一个场景,一个复杂的查询在一个紧密的循环中执行,你想提出最佳计划并事先缓存它。
当然,你有一个紧密的循环,你应该重写查询,这样它就会消失,但请耐心等待。
这更多是出于好奇而提出的问题,也是为了查看短路优化和完整优化之间有时是否存在差异。
事实证明,您可以使用跟踪标志 2301 为优化器提供更多时间。这不完全是我所要求的,但它很接近。
我在这方面找到的最佳信息是Ian Jose 的SQL Server 2005 SP1中的查询处理器建模扩展。
小心使用这个跟踪标志!但是在提出更好的计划时它会很有用。也可以看看:
我正在考虑具有大量连接的查询,其中连接顺序的解决方案空间呈指数级增长。SQL Server 使用的启发式方法非常好,但我想知道如果优化器有更多时间(在几秒甚至几分钟的范围内),它是否会提出不同的顺序。
如何分析 SQL Server 2008 数据库以查看正在特定数据库上执行的代码?我记得使用过 SQL Server profiler,但是我在下载 SQL Server 2008 R2 Express 后在 SQL Server Management Studio 中没有看到它。我在哪里可以下载该工具并安装它?我是否需要完整版的 SQL Server 2008 才能看到此选项?
sql-server profiler ssms sql-server-2008-r2 sql-server-express
最近包含 SQL Server 启动跟踪标志 8048 以解决 SQL Server 2008 R2 系统中严重的自旋锁争用问题。
有兴趣听取其他人的意见,他们发现性能值由跟踪标志 8048(将查询内存授予策略从每个 NUMA 节点提升到每个核心)、跟踪标志 8015(SQL Server 忽略物理 NUMA)或 SUMA(交错足够统一的内存访问,某些 NUMA 机器上的 BIOS 选项)。
系统工作负载的详细信息、从出现问题的系统收集的指标以及在干预后从系统收集的指标。
跟踪标志 8048 是一个“修复”,但它是最好的修复吗?SQL Server 是否会因为跟踪标志 8015 而忽略物理 NUMA 已经完成了同样的事情?如何将 BIOS 设置为交错内存,让服务器使用 SMP 模拟 SUMA 行为而不是 NUMA 行为?
从 …
我正在使用索引对数据仓库进行性能调整。我对 SQL Server 2014 还是很陌生。Microsoft 描述了以下内容:
“我们将聚集列存储索引视为存储大型数据仓库事实表的标准,并预计它将用于大多数数据仓库场景。由于聚集列存储索引是可更新的,您的工作负载可以执行大量的插入、更新、和删除操作。” http://msdn.microsoft.com/en-us/library/gg492088.aspx
但是,如果您进一步阅读文档,您会发现限制和限制:
“不能有唯一约束、主键约束或外键约束。”
这让我很困惑!出于各种原因(数据完整性、语义层可见的关系......)
所以微软提倡数据仓库场景使用聚集列存储索引;但是,它不能处理外键关系?!
我在这方面正确吗?您会建议哪些其他方法?过去,我在数据仓库场景中使用了非聚集列存储索引,对数据加载进行删除和重建。然而,SQL Server 2014 并没有为数据仓库增加真正的新价值??
foreign-key data-warehouse sql-server columnstore sql-server-2014
我有一个表,其中有一列我不希望在其上创建或更新统计信息。如果我强制查询优化器使用主键上的统计密度而不是该列上的统计直方图,我会得到更好的连接基数估计。自动更新和自动创建统计信息在数据库级别启用,我无法更改。
如果您想建议防止创建统计信息的替代方法,请记住该表用于被数千个不同查询引用的视图中。我无法控制运行的查询。
我最初的策略是使用NOCOMPUTE和SAMPLE 0 ROWS选项在列上创建统计信息。我的印象是 SQL Server 不会在已经有统计对象的列上自动创建统计信息,但这已经发生在我们的开发和 QA 服务器上。
创建了新的统计信息COL_GROUP。我的NORECOMPUTE统计数据没有更新。我不知道为什么要创建统计信息,而且我自己也无法通过运行查询来触发它。
有没有办法阻止 SQL Server 自动为一列创建统计信息?我的表只有两列,因此防止在单个表上创建自动统计的解决方案也可以解决我的问题。
跟踪标志 4139 和 2371 处于打开状态,以防有所不同。
如果你想玩转表结构,我已经包含了它和下面的示例数据:
CREATE TABLE X_NO_COLUMN_STATS(
[COL_USER] [varchar](256) NOT NULL,
[COL_GROUP] [int] NOT NULL,
CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED
(
[COL_USER] ASC,
[COL_GROUP] ASC
)WITH (DATA_COMPRESSION = PAGE)
);
-- prevent stats from being updated on COL_GROUP
CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS ([COL_GROUP]) WITH NORECOMPUTE, SAMPLE 0 ROWS;
BEGIN TRANSACTION;
INSERT INTO X_NO_COLUMN_STATS VALUES …Run Code Online (Sandbox Code Playgroud) sql-server ×9
columnstore ×2
foreign-key ×1
memory ×1
memory-grant ×1
mysql ×1
mysql-5.5 ×1
numa ×1
optimization ×1
parameter ×1
performance ×1
profiler ×1
select ×1
ssms ×1
statistics ×1
warning ×1