标签: sql-server-2008

@table_variable 或 #temp_table

我有一个大的用户定义的表类型变量,它有 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

performance sql-server-2008 sql-server

12
推荐指数
2
解决办法
555
查看次数

SQL Server 备份 - 几个问题

我们在周五晚上 9 点运行每周备份作业,我们遇到了一些关于磁盘空间(有时会变得非常低)和性能方面的问题。我们正在考虑精简/优化所发生的事情,并感谢您的意见。

具体来说:

  1. 备份过程大约需要 4 小时才能在备份期间更新统计信息。我们可以安全地禁用此过程以节省时间吗?

  2. 我们经常会遇到磁盘空间不足的情况,想知道是否应该重新调整这个过程。目前它创建备份,然后删除以前的备份,这就是占用磁盘空间的原因。我们可以安全地删除前一,然后做备份?

非常欢迎任何其他评论或意见编辑:服务器上 SQL 文件的总大小约为 35GB。一个 db 的大小约为 25GB,而其他 6 个共享组成了另外 10GB 左右。

sql-server-2008 backup maintenance disk-space

12
推荐指数
4
解决办法
659
查看次数

为什么默认情况下 SQL Server 代理服务未设置为自动启动?

默认安装 SQL Server 2008 R2 后,SQL Server 代理进程似乎设置为手动启动。这是什么原因?出于某种原因,设置为自动是一个坏主意还是毫无意义?

sql-server-2008 sql-server sql-server-agent

12
推荐指数
2
解决办法
2万
查看次数

多少存储过程参数太多了?

我刚刚开始在 SQL Server 2008 中编写存储过程,并且有 30 多个参数。我从来没有写过一个参数超过 10 个的,这让我开始思考……什么时候参数太多了?

对于背景...这个程序基本上将INSERT单列成一个单一的表。也会有一个非常相似的;虽然有点小;在同一个表上执行UPDATE 的版本。大多数列相对较小,混合了 int 和 string (varchar(200) )。

有哪些问题;是好是坏; 有一个包含大量参数的程序,我应该开始考虑其他模式的阈值是多少?

performance sql-server-2008 database-design optimization

12
推荐指数
1
解决办法
6373
查看次数

用户定义表类型的 sp_executesql 行为不正确

问题

用户定义的表类型作为sp_executesql 的参数是否存在已知问题?

设置脚本

此脚本创建一个表、过程和用户​​定义的表类型(仅限 SQL Server 2008+)。

  • 堆的目的是提供一个审计,是的,数据进入了程序。没有限制,没有任何东西可以阻止数据被插入。
  • 该过程将用户定义的表类型作为参数。proc 所做的就是插入到表中。
  • 用户定义的表类型也很简单,只有一列

我已经运行了以下内容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-2008 sql-server sql-server-2012

12
推荐指数
1
解决办法
7452
查看次数

TinyInt 的 SQL SERVER 存储

在 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

12
推荐指数
2
解决办法
543
查看次数

由于“客户端处理时间”很长,远程 SELECT 语句很慢,但本地速度很快

当连接到我们的生产服务器(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)

performance sql-server-2008 remote

12
推荐指数
2
解决办法
1万
查看次数

为什么我的 ORDER BY 在 EXCEPT 之前(慢)而不是之后(快)对两个表进行排序?

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)

sql-server-2008 sql-server

12
推荐指数
1
解决办法
2869
查看次数

处理 CXPACKET 等待 - 设置并行成本阈值

作为我之前关于对 Sharepoint 站点进行性能故障排除的问题的后续问题,我想知道我是否可以对 CXPACKET 等待做些什么。

我知道下意识的解决方案是通过将 MAXDOP 设置为 1 来关闭所有并行性 - 听起来是个坏主意。但另一个想法是在并行开始之前增加成本阈值。执行计划成本的默认值 5 相当低。

所以我想知道是否已经写了一个查询,可以找到执行计划成本最高的查询(我知道你可以找到那些执行持续时间最长的查询等等 - 但是执行计划成本是否可以在某处检索,也是?),这也会告诉我这样的查询是否已并行执行。

有没有人手头有这样的脚本,或者可以向我指出相关的 DMV、DMF 或其他系统目录视图的方向以找出这一点?

performance sql-server-2008 parallelism query-performance performance-tuning

12
推荐指数
1
解决办法
3028
查看次数

使用带有覆盖列的唯一非聚集索引而不是主键的含义

我们有一个大表[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.KeyColumn
  • MyTable.KeyColumn完全删除主键
  • 将外键重新添加到表中(即 RI 将通过 强制执行MyTable.KeyColumn

我能想到这样做的唯一含义是我们不会在 ERD 图表上得到可视化的关键符号,并且(叶)索引密度会因为包含的列而减少。

我已阅读/sf/ask/34112011/并且对这样做的完整性和性能方面感到满意。

我的问题是:这种方法有缺陷吗?

编辑 我想要完成的工作:性能优化和春季大扫除。通过删除 PK 或索引,我的索引将需要更少的页面 = 更快的写入,加上维护/操作的好处,即少一个索引来保持碎片整理等。

为了提供一些背景知识,我以前从未有过没有 PK 的表被引用。但是,将带有覆盖列的 NC 索引添加到表中这一事实意味着我需要调整我的想法。

sql-server-2008 sql-server

12
推荐指数
1
解决办法
5659
查看次数