标签: sql-server-2005

包含表的所有列的主键有什么好处吗?

我有一个包含四列的表,这些列都是不可为空的,并且数据是这样的,需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回单个记录,即所有列都将在查询中被过滤。

由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?

sql-server-2005 primary-key

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

唯一聚集索引和聚集主键之间有什么明显的区别吗?

我知道两者之间的含义意图可能有所不同,但是聚集主键和聚集唯一索引之间是否存在任何行为或性能差异?

index sql-server-2005 primary-key clustered-index

17
推荐指数
2
解决办法
1545
查看次数

我可以通过更新分区键在分区之间移动行吗?

我认为这将是一个相当简单的问题,但实际上我很难找到答案。

问题:您能否通过简单地更新分区列使其跨越分区边界将分区表中的数据行从一个分区移动到另一个分区?

例如,如果我有一个包含分区键的表:

CREATE TABLE SampleTable
(
    SampleID INT PRIMARY KEY,
    SampleResults VARCHAR(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

使用映射到主键的分区函数:

CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Run Code Online (Sandbox Code Playgroud)

我可以通过将 SampleID 从 1 更改为(例如)500,000 将一行从第一个分区移动到第三个分区吗?

注意:我将其标记为 sql server 2005 和 2008,因为它们都支持分区。他们的处理方式不同吗?

sql-server-2005 sql-server-2008 sql-server partitioning

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

DBCC CheckDB 会错过哪些类型的损坏?

这个问题是由这篇较早的帖子提示的,我有一个数据库归档以备将来调查,该数据库在以下情况下恢复:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.
Run Code Online (Sandbox Code Playgroud)

在链接的问题和备份中,我已准备好进行 DBCC PAGE 调查,DBCC CHECKDB 无错误通过,但显然存在损坏。

哪些类型的损坏会导致 CHECKDB 通过但 BACKUP WITH CHECKSUM 会失败?

sql-server-2005 sql-server-2008 dbcc corruption

16
推荐指数
1
解决办法
2172
查看次数

使用动态sql在指定的数据库中创建视图?

我正在编写一个动态 sql 以在不同的数据库中删除和创建视图。

所以我写道:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

'CREATE VIEW' 必须是查询批处理中的第一条语句。

如果我删除 USE DATABASE 语句,它可以正常工作,但是不再指定数据库....

我怎么解决这个问题?

sql-server-2005 sql-server dynamic-sql

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

使用 RECOMPILE 查询提示时查询之间的执行时间存在巨大差异

我有两个几乎相同的查询在同一个 SQL Server 2005 实例上运行:

  1. 第一个是SELECT由 LINQ 生成的原始查询(我知道,我知道......我不是应用程序开发人员,只是 DBA :)。
  2. 第二个和第一个完全一样,OPTION (RECOMPILE)在最后加了一个。

没有其他任何改变。

第一个每次运行需要 55 秒。
第二个需要 2 秒。

两个结果集是相同的。

为什么这个提示会产生如此显着的性能提升?

在线图书条目RECOMPILE没有提供非常详细的解释:

指示 SQL Server 数据库引擎在执行后放弃为查询生成的计划,强制查询优化器在下次执行相同查询时重新编译查询计划。在不指定 RECOMPILE 的情况下,数据库引擎会缓存查询计划并重用它们。编译查询计划时,RECOMPILE 查询提示使用查询中任何局部变量的当前值,如果查询在存储过程中,则将当前值传递给任何参数。

RECOMPILE 是创建使用 WITH RECOMPILE 子句的存储过程的一种有用的替代方法,当必须重新编译存储过程中的查询子集而不是整个存储过程时。有关详细信息,请参阅重新编译存储过程。RECOMPILE 在您创建计划指南时也很有用。有关更多信息,请参阅使用计划指南优化已部署应用程序中的查询。

由于我的查询有很多局部变量,我的猜测是当我使用OPTION (RECOMPILE)查询提示时,SQL Server 能够(认真地)优化它。

我所看到的每个地方都有人说OPTION (RECOMPILE)应该避免这种情况。对此的解释通常是使用此提示 SQL Server 无法重用此执行计划,因此每次都必须浪费时间重新编译它。
(但是)考虑到巨大的性能优势,我倾向于认为这次使用这个查询提示会是一件好事。

我应该使用它吗?如果没有,有没有一种方法可以强制 SQL Server 使用更好的执行计划而无需此提示且无需更改应用程序?

performance sql-server-2005 sql-server optimization query-performance

16
推荐指数
1
解决办法
2429
查看次数

ASYNC_NETWORK_IO 等待类型有什么需要担心的吗?

在查看需要很长时间执行的存储过程列表时,其中一个会引起最多的等待。然而,大部分等待 (81%) 是 ASYNC_NETWORK_IO,我知道原因:存储过程传输大约 400 MB 的信息。

在文档中,它指出 ASYNC_NETWORK_IO 的原因是客户端无法跟上数据的洪流,这可能是真的。我不确定如何让客户端跟上,因为它所做的只是通过 ADO.NET 调用存储过程,然后只处理数据集。

因此,鉴于此信息,我是否应该担心此过程的 ASYNC_NETWORK_IO 等待类型?它实际上对服务器性能有影响吗?

补充资料:

  • 我使用的是 SQL Server 2005 的 Service Pack 2。
  • 客户端应用程序与 SQL Server 位于同一台机器上(我知道,我知道……但我对此无能为力)。

performance sql-server-2005 sql-server stored-procedures wait-types

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

使用子查询对大表进行缓慢更新

由于SourceTable具有 >15MM 记录和Bad_Phrase>3K 记录,以下查询需要将近 10 个小时才能在 SQL Server 2005 SP4 上运行。

UPDATE [SourceTable] 
SET 
    Bad_Count=
             (
               SELECT 
                  COUNT(*) 
               FROM Bad_Phrase 
               WHERE 
                  [SourceTable].Name like '%'+Bad_Phrase.PHRASE+'%'
             )
Run Code Online (Sandbox Code Playgroud)

在英语中,这个查询计数Bad_Phrase列出不同的短语是一个子领域的数量NameSourceTable,然后把该结果在现场Bad_Count

我想要一些关于如何让这个查询运行得更快的建议。

sql-server-2005 sql-server subquery update

16
推荐指数
2
解决办法
1519
查看次数

为什么简单的 ALTER TABLE 命令在带有全文索引的表上花费这么长时间?

我有一个大型(约 6700 万行)名称-值表,该表在DataValue列上具有全文索引。

如果我尝试运行以下命令:

ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL;
Run Code Online (Sandbox Code Playgroud)

它运行了 1 小时 10 分钟,但仍然无法在VisitorData包含约 6700 万行的表上完成。

  1. 为什么这需要这么长时间而没有完成?
  2. 我该怎么办?

以下是有关该表的更多详细信息:

CREATE TABLE [dbo].[VisitorData](
            [VisitorID] [int] NOT NULL,
            [DataName] [varchar](80) NOT NULL,
            [DataValue] [nvarchar](3800) NOT NULL,
            [EncryptedDataValue] [varbinary](max) NULL,
            [VisitorDataID] [int] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_VisitorData_VisitorDataID] PRIMARY KEY CLUSTERED (
            [VisitorDataID] ASC
) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY], 
CONSTRAINT [UNQ_VisitorData_VisitorId_DataName] …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server alter-table

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

用于存储标志数组的数据类型(位图/位数组)

我需要为表的每条记录存储一个位数组,支持以下操作:

  • 测试是否设置了位,并设置了位(使用 SQL)

  • 使用 ADO 2.8(不是 ADO.NET)查询和设置值

  • 索引(为了从“覆盖索引”功能中受益)

要存储在此数组中的最大位数是固定的,但可能会超过 32。也就是说,一个简单的int列并不总是有效。

从我目前所见,我的选择是:

  1. 使用多个int
  2. 使用bigint(只要位数 <= 64 即可)
  3. 使用二进制
  4. ?

第一个选项可行,但需要对访问数据的代码进行大量重构。第二个选项只是暂时的缓解,从我目前的搜索来看,我不太确定 ADO 是否与bigint一起工作得那么好。我没有使用binary 的经验,我不知道任何其他选项。

根据要求,您会选择哪种数据类型?

sql-server-2005 sql-server-2008 sql-server datatypes

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