我有一个大的用户定义的表类型变量,它有 129 列。我将一次在这个表变量中存储大约 2000-3000 条记录,并将其传递给各种存储过程和函数以获取附加数据并进行修改。然后,这些附加数据和新修改将存储在相同类型的新表变量中,并通过OUTPUT参数返回到源存储过程。(这是因为表类型参数只能作为READONLY.)
这是我的伪代码:
SP1
@tmp tableType
{
INSERT @tmp EXEC
SP2 (@tmp)
INSERT @tmp EXEC
SP3 (@tmp)
}
Run Code Online (Sandbox Code Playgroud)
我应该使用 a@table_variable还是#temp_table?
我们在周五晚上 9 点运行每周备份作业,我们遇到了一些关于磁盘空间(有时会变得非常低)和性能方面的问题。我们正在考虑精简/优化所发生的事情,并感谢您的意见。
具体来说:
备份过程大约需要 4 小时才能在备份期间更新统计信息。我们可以安全地禁用此过程以节省时间吗?
我们经常会遇到磁盘空间不足的情况,想知道是否应该重新调整这个过程。目前它创建备份,然后删除以前的备份,这就是占用磁盘空间的原因。我们可以安全地删除前一首,然后做备份?
非常欢迎任何其他评论或意见编辑:服务器上 SQL 文件的总大小约为 35GB。一个 db 的大小约为 25GB,而其他 6 个共享组成了另外 10GB 左右。
默认安装 SQL Server 2008 R2 后,SQL Server 代理进程似乎设置为手动启动。这是什么原因?出于某种原因,设置为自动是一个坏主意还是毫无意义?
我刚刚开始在 SQL Server 2008 中编写存储过程,并且有 30 多个参数。我从来没有写过一个参数超过 10 个的,这让我开始思考……什么时候参数太多了?
对于背景...这个程序基本上将INSERT单列成一个单一的表。也会有一个非常相似的;虽然有点小;在同一个表上执行UPDATE 的版本。大多数列相对较小,混合了 int 和 string (varchar(200) )。
有哪些问题;是好是坏; 有一个包含大量参数的程序,我应该开始考虑其他模式的阈值是多少?
用户定义的表类型作为sp_executesql 的参数是否存在已知问题?
此脚本创建一个表、过程和用户定义的表类型(仅限 SQL Server 2008+)。
我已经运行了以下内容11.0.1750.32 (X64) ,10.0.4064.0 (X64)是的,我知道可以修补该框,但我无法控制。
-- this table record that something happened
CREATE TABLE dbo.UDTT_holder
(
ServerName varchar(200)
, insert_time datetime default(current_timestamp)
)
GO
-- user defined table type transport mechanism
CREATE TYPE dbo.UDTT
AS TABLE
(
ServerName varchar(200)
)
GO
-- Stored Procedure to reproduce issue
CREATE PROCEDURE dbo.Repro
(
@MetricData dbo.UDTT READONLY
)
AS
BEGIN
SET NOCOUNT ON
INSERT INTO dbo.UDTT_holder
(ServerName) …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 中,为什么一个 tinyint 以 9B 存储在行中。出于某种原因,在 NULL 位图掩码的末尾似乎还有一个额外的字节。
使用临时数据库;
走
创建表 tbl
(
我 TINYINT 不为空
);
走
插入 tbl (i)
值 (1) ;
走
DBCC IND ('tempdb','tbl',-1) ;
走
DBCC TRACEON (3604) ; -- 页面转储将进入控制台
走
DBCC 页面 ('tempdb',1,168,3);
走
结果(由于 DBCC PAGE 首先显示最低有效字节,因此我颠倒了字节):
Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count …Run Code Online (Sandbox Code Playgroud) 当连接到我们的生产服务器(SQL Server 2008,非常强大的机器)时,这个 SELECT 语句需要2 秒,吐回所有字段(总共 4 MB 数据)。
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Run Code Online (Sandbox Code Playgroud)
从同一网络上的任何其他框(使用 SQL 身份验证或 Windows 身份验证连接),相同的查询需要1 分 8 秒。
我正在使用这个非常简单的语句进行测试,以说明它不是索引问题或与查询相关的问题。(我们目前所有查询都存在性能问题......)
这些行成块出现,而不是一次全部出现。我立即得到我的第一行,然后等待超过 1 分钟让成批的行进来。
这是从远程框运行时查询的客户端统计信息:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent …Run Code Online (Sandbox Code Playgroud) SQL Server 2008 R2 查询优化器拼图
我们有两个表,都包含 900 万行。70.000 行不同,其他相同。
这很快,13秒,
select * from bigtable1
except select * from similar_bigtable2
Run Code Online (Sandbox Code Playgroud)
这对输出进行排序并且也很快,13 秒,
select * into #q from bigtable1
except select * from similar_bigtable2
select * from #q order by sort_column
Run Code Online (Sandbox Code Playgroud)
虽然这非常缓慢:
;with q as (
select * from bigtable1
except select * from similar_bigtable2
)
select * from q order by sort_column
Run Code Online (Sandbox Code Playgroud)
甚至我有时用来提示 SQL Server 需要预先计算查询的某个部分才能继续执行的“技巧”也不起作用并导致查询速度变慢:
;with q as (
select top 100 percent * from bigtable1
except select * from …Run Code Online (Sandbox Code Playgroud) 作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续问题,我想知道我是否可以对 CXPACKET 等待做些什么。
我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行开始之前增加成本阈值。执行计划成本的默认值 5 相当低。
所以我想知道是否已经写了一个查询,可以找到执行计划成本最高的查询(我知道你可以找到那些执行持续时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。
有没有人手头有这样的脚本,或者可以向我指出相关的 DMV、DMF 或其他系统目录视图的方向以找出这一点?
performance sql-server-2008 parallelism query-performance performance-tuning
我们有一个大表[MyTable]目前既有Primary Key,和一个Unique Non Clustered Index在同一列([KeyColumn])。UNC 索引还有额外的覆盖栏。
在同一列上同时拥有 PK 和唯一 NC 索引似乎是多余的,所以我考虑删除主键,而是使用唯一非聚集索引来实现引用完整性。
请注意,该表完全由另一列聚集在一起。
即所以我们有:
ALTER TABLE [MyTable]
ADD CONSTRAINT [PK_MyTable]
PRIMARY KEY NONCLUSTERED ([KeyColumn])
GO
Run Code Online (Sandbox Code Playgroud)
和
CREATE UNIQUE NONCLUSTERED INDEX [IX_MyTable_SomeIndex]
ON [MyTable] ([KeyColumn])
INCLUDE ([Column1], [Column2])
GO
Run Code Online (Sandbox Code Playgroud)
据我所知,不可能向主键添加覆盖列,所以我打算这样做:
MyTable.KeyColumnMyTable.KeyColumn完全删除主键MyTable.KeyColumn)我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。
我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。
我的问题是:这种方法有缺陷吗?
编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。
为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。
sql-server-2008 ×10
sql-server ×5
performance ×4
backup ×1
disk-space ×1
maintenance ×1
optimization ×1
parallelism ×1
remote ×1