标签: sql-server

附加/分离与备份/恢复

我需要将数据库(作为一个整体)传输到另一台服务器,以制作一个重复的数据库来设置另一个测试环境。

我有两个选择:

  1. 在源服务器上进行完整备份/在目标服务器上进行还原;
  2. 在源服务器上分离/在目标服务器上附加。

根据我的要求,这两种解决方案的优缺点是什么?

我正在使用 SQL Server 2008 企业版。

sql-server-2008 sql-server backup restore

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

SQL Server VARCHAR 列宽

在网上搜索,我发现在指定过宽的 VARCHAR 列时是否会影响性能的建议相互矛盾,例如 VARCHAR(255) 时 VARCHAR(30) 可能会这样做。

我一致认为,如果整行超过 8060 字节,性能会受到影响。除此之外,我看到了分歧。

索赔是真的The default is SET ANSI PADDING ON = potential for lots of trailing spaces吗?只要总行宽小于 8060,过大的 VARCHAR 列是否有任何真正的性能问题?

列宽很重要的证据


The same goes for CHAR and VARCHAR data types. Don’t specify more characters in character columns that you need.

http://www.sql-server-performance.com/2007/datatypes/


  • Length is a constraint on the data (like CHECK, FK, NULL etc)
  • Performance when the row exceeds 8060 bytes
  • Can not have unique constraint or index (key column width must …

sql-server-2008 sql-server varchar

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

为什么简单的 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 Server 2008 - 分区和聚集索引

所以让我先说我不能完全控制我的数据库设计,所以当前系统的很多方面都不能为了这个场景的目的而改变

关于我们应该如何重新思考设计方面的评论可能是正确的,但无济于事:)

我有一个非常大的表,大约 150 个字段宽,大约 600m 行,它驱动大量进程。这是在数据仓库情况下,因此我们在计划加载过程之外没有任何更新/插入,因此它被大量索引。

已决定尝试对该表进行分区,我对索引分区表有一些担忧。我没有任何分区经验,因此感谢任何输入或链接。我无法在 BOL 或 msdn 上具体找到我所追求的内容。

目前,我们聚集在一个我们称之为IncidentKeyavarchar(50)而非唯一的字段上——我们可以有 1-100 条相同的记录IK(请不要发表评论)。我们确实经常在旧IncidentKey记录上获取新数据,因此它也不是连续的。

我知道我需要IncidentDate在我的聚集索引键中包含我的分区字段 ,才能使分区正常工作。我想它会是IncidentKey, IncidentDate

问题是,如果“新”分区中的记录应该在聚集索引中“旧”分区中的记录之前,聚集索引的机制将如何在分区表中的 2 部分键上工作?

例如,我有 5 条记录:

IncidentKey    Date

ABC123        1/1/2010
ABC123        7/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010
XYZ999        7/1/2010
Run Code Online (Sandbox Code Playgroud)

如果我得到一个新记录,ABC123, 2/1/2011它将需要在聚集索引BEFORE 中 XYZ999, 1/1/2010。这是如何运作的?

我假设有碎片和指针,但我找不到关于具有双部分键的分区表上非分区聚集索引的物理存储和配置的任何信息。

index sql-server sql-server-2008-r2 partitioning

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

我应该如何在我的 SQL Server 上配置 SSD 驱动器的 RAID 阵列?

我正在构建一个带有 48 GB RAM、1 个 CPU 和 8 个 SATA III (6GB/s) SSD 驱动器 (128 GB Crucial m4) 和一个 LSI MegaRAID 控制器 (SAS 9265-8i) 的 SQL Server。我希望典型的工作负载主要是读取。会有一些较重的写入活动(每小时数据与 3rd 方数据提供商同步 - 每晚备份),但我怀疑典型的读/写比率约为 90% 读取/10% 写入。

选项 1:
逻辑驱动器 C:- RAID 1(2 个物理驱动器)- OS
逻辑驱动器 D:- RAID 10(6 个物理驱动器)- DB 文件/日志/tempdb/备份?

或者

选项 2:
逻辑驱动器 C:- RAID 1(2 个物理驱动器)- OS
逻辑驱动器 D:- RAID 1(2 个物理驱动器)- Db 文件
逻辑驱动器 E:- RAID 1(2 个物理驱动器)- 日志文件/备份?
逻辑驱动器 F:- RAID 1(2 个物理驱动器)- tempdb

或者

选项 3: …

sql-server configuration

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

解释 SQL Server 的 Showplan XML

我刚刚在我的网站http://sqlfiddle.com上推出了一项功能,允许用户查看其查询的原始执行计划。对于 PostgreSQL、MySQL 和(在某种程度上)Oracle,查看原始执行计划输出似乎很容易理解。但是,如果您查看 SQL Server 的执行计划输出(使用 生成SET SHOWPLAN_XML ON),即使对于相对简单的查询,也有大量的 XML 需要处理。这是一个示例(取自此“小提琴”的最后一个查询的执行计划:http : //sqlfiddle.com/#!3/ 1fa93/1):

<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.2500.0">
    <BatchSequence>
        <Batch>
            <Statements>
                <StmtSimple StatementText="&#xa;select * from supportContacts" StatementId="1" StatementCompId="1" StatementType="SELECT" StatementSubTreeCost="0.0032853" StatementEstRows="3" StatementOptmLevel="TRIVIAL" QueryHash="0x498D13A3874D9B6E" QueryPlanHash="0xD5DDBD3C2D195E96">
                    <StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/>
                    <QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72">
                        <RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="3" EstimateIO="0.003125" EstimateCPU="0.0001603" AvgRowSize="42" EstimatedTotalSubtreeCost="0.0032853" TableCardinality="3" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
                            <OutputList>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" Column="id"/>
                                <ColumnReference Database="[db_1fa93]" Schema="[dbo]" Table="[supportContacts]" …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2008-r2

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

SQL Server 2012 与 2008 备份的向后兼容性

我有许多使用 SQL Server 2008 的客户端,这也是我服务器上的客户端。我使用备份文件在客户和我的办公室之间来回发送数据库。

我读到当您从 SQL Server 2012 创建备份时,无法将其还原到 2008 实例。我认为兼容性级别会解决这个问题,但事实并非如此。因此,我不知道如何升级。除了一次升级所有客户端(这是不可能的)之外,我想不出干净的方法来做到这一点。

我需要将数据库发送到客户端以及从客户端接收数据库。这是我在 SQL Server 上的第一次版本升级,所以我是这个问题的新手。关于如何进行的任何想法?

sql-server

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万
查看次数

主键中指定的排序顺序,但排序是在 SELECT 上执行的

我将传感器数据存储在表SensorValues 中。表和主键如下:

CREATE TABLE [dbo].[SensorValues](
  [DeviceId] [int] NOT NULL,
  [SensorId] [int] NOT NULL,
  [SensorValue] [int] NOT NULL,
  [Date] [int] NOT NULL,
CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED 
(
  [DeviceId] ASC,
  [SensorId] ASC,
  [Date] DESC
) WITH (
    FILLFACTOR=75,
    DATA_COMPRESSION = PAGE,
    PAD_INDEX = OFF,
    STATISTICS_NORECOMPUTE = OFF,
    SORT_IN_TEMPDB = OFF,
    IGNORE_DUP_KEY = OFF,
    ONLINE = OFF,
    ALLOW_ROW_LOCKS = ON,
    ALLOW_PAGE_LOCKS = ON)
  ON [MyPartitioningScheme]([Date])
Run Code Online (Sandbox Code Playgroud)

然而,当我选择在特定时间有效的传感器值时,执行计划告诉我它正在执行排序。这是为什么?

我原以为,由于我存储了按日期列排序的值,因此不会发生排序。还是因为索引不仅仅按日期列排序,即它不能假设结果集已排序?

SELECT TOP 1 SensorValue
  FROM SensorValues
  WHERE SensorId = 53
    AND DeviceId = …
Run Code Online (Sandbox Code Playgroud)

sql-server primary-key

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

SQL Server 如何知道谓词是相关的?

在诊断基数估计不佳的 SQL Server 2008 R2 查询(尽管有简单的索引、最新的统计数据等)和查询计划不佳时,我发现了一篇可能相关的知识库文章: FIX:运行查询时性能不佳包含 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中的关联 AND 谓词

我可以猜测知识库文章中“相关”的含义,例如谓词#2 和谓词#1 主要针对相同的行。

但我不知道 SQL Server 是如何知道这些相关性的。表是否需要包含来自两个谓词的列的多列索引?SQL 是否使用统计信息来检查一列中的值是否与另一列相关?还是使用了其他方法?

我问这个有两个原因:

  1. 确定使用此修补程序可以改进我的哪些表和查询
  2. 知道我应该在索引、统计等方面做些什么来影响 #1

performance sql-server statistics sql-server-2008-r2 query-performance

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