假设我有一张这样的表:
create table SomeTable
(
id int identity(1, 1) not null primary key clustered,
SomeString1 varchar(50) not null,
SomeString2 varchar(50) not null
)
go
create nonclustered index IX_SomeString1
on SomeTable(SomeString1)
go
Run Code Online (Sandbox Code Playgroud)
如果我要这样做:
insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go
Run Code Online (Sandbox Code Playgroud)
并查看实际执行计划,我只看到一个Clustered Index Insert。为什么我在执行计划中没有看到非聚集索引插入?
我需要按表定义顺序列出表中的列:
select * from syscolumns
where id = object_id('MyTable')
--order by colid
Run Code Online (Sandbox Code Playgroud)
通过检查syscolumns表,两列看起来相关:colid和colorder。关于 syscolumns 的 MSDN 文章说:
colid | smallint | Column or parameter ID.
colorder | smallint | Identified for informational purposes only.
| Not supported. Future compatibility is not guaranteed.
Run Code Online (Sandbox Code Playgroud)
我试着跑
select * from syscolumns where colorder <> colid
Run Code Online (Sandbox Code Playgroud)
这没有产生任何行,这让我认为这些列在大多数情况下具有相同的值。
看起来最安全的选择是使用colid。但是我很想知道:这两列之间是否有区别,如果有,区别是什么?
MSDN 文章也没有确认,colid 反映了表定义的顺序。虽然可以合理地假设情况确实如此,但您能否告诉我,如果您确定确实如此,您是如何知道是这样的?
我在一个表中插入了两条记录。
create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num
Run Code Online (Sandbox Code Playgroud)
当我查询它们时,它们都显示为23. 这意味着 SQL Server 忽略前导 0。这背后的机制是什么?我如何让 SQL Server 在我插入它们时返回值(即0023和23)?
我之前使用过完全外部联接来获得我想要的结果,但也许我不完全理解这个概念,因为我无法完成应该是简单的联接。
我有 2 个表(我称之为 t1 和 t2),每个表有 2 个字段:
t1
Policy_Number Premium
101 15
102 7
103 10
108 25
111 3
Run Code Online (Sandbox Code Playgroud)
t2
Policy_Number Loss
101 5
103 9
107 20
Run Code Online (Sandbox Code Playgroud)
我想要做的是从两个表以及 Policy_Number 中获取 Premium 和 Sum of Losses 的总和。我正在使用的代码是:
select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber
Run Code Online (Sandbox Code Playgroud)
上面的代码将返回正确的总和,但它会将在“NULL”policy_number 下没有 policy_number 匹配的所有记录分组。
我希望我的结果看起来像这样
Policy_Number Prem_Sum Loss_Sum
107 NULL 20
111 3 NULL
101 15 5
Run Code Online (Sandbox Code Playgroud)
等等.....
我不想要显示 NULL policy_number …
我想运行一个包含 Transfer SQL Server Objects 任务的 SSIS 包。涉及的服务器在同一个域中,但 SQL Server 服务在本地服务帐户上运行。所以环境看起来是这样的:
领域
服务器 1
服务器 2
为了能够登录到两台服务器,我创建了一个域帐户以用作服务帐户。当我使用这个域帐户登录到服务器1,然后从文件系统执行包时,每一步都成功。但是,当我尝试将作业添加到 SQL Server 时,我遇到了以下问题之一:
情况1.工作负责人:本地帐户;运行 SSIS 步骤作为域帐户的代理。当我将作业所有者设置为本地帐户,但将作业作为域帐户的代理运行时,作业本身将成功执行,但程序包会引发类似错误
执行失败,出现以下错误:“目录‘LocalApplicationData’不存在。”。
可以通过为服务器 1 上的域用户创建具有管理员权限的登录来修复此错误,但这显然不是理想的解决方案。将帐户添加到 SQL Server 代理/DTS 组之一也不起作用。
情况 2. 作业所有者:域帐户;运行 SSIS 步骤作为域帐户的代理。当我为域帐户的步骤设置作业所有者和“以用户身份运行”时,作业根本无法启动,并出现以下错误:
无法确定作业的所有者(域\域用户)
Job name是否具有服务器访问权限(原因:无法获取有关 Windows NT 组/用户“域\域用户”的信息,错误代码 0x5。[SQLSTATE 42000](错误 15404)) .
我相信最后一个错误是因为 SQL Server 在本地帐户上运行,因此无法查看域帐户具有哪些权限。
使作业运行的正确方法是什么?情况 2 对我来说感觉更清晰,但似乎不可能,因为 SQL Server 在本地帐户上运行。情况 1 也可以使用,但不会在我的 SQL Server 上授予域用户管理权限。
更新:
@JonSeigel 和 @Mr.Brownstone: …
SQL Server 2005
我需要能够在 900M 记录表中连续处理大约 350M 条记录。我用来选择要处理的记录的查询在我处理时变得严重碎片化,我需要停止处理以重建索引。伪数据模型&查询...
/**************************************/
CREATE TABLE [Table]
(
[PrimaryKeyId] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[ForeignKeyId] [INT] NOT NULL,
/* more columns ... */
[DataType] [CHAR](1) NOT NULL,
[DataStatus] [DATETIME] NULL,
[ProcessDate] [DATETIME] NOT NULL,
[ProcessThreadId] VARCHAR (100) NULL
);
CREATE NONCLUSTERED INDEX [Idx] ON [Table]
(
[DataType],
[DataStatus],
[ProcessDate],
[ProcessThreadId]
);
/**************************************/
/**************************************/
WITH cte AS (
SELECT TOP (@BatchSize) [PrimaryKeyId], [ProcessThreadId]
FROM [Table] WITH ( ROWLOCK, UPDLOCK, READPAST )
WHERE [DataType] = …Run Code Online (Sandbox Code Playgroud) 我在任何地方都找不到关于此的明确资源,所以希望大师可以在这里给我一个答案。
我有一个非常大的表,我们必须向其中添加一列。聚集索引非常碎片化,我想做一个ALTER INDEX REBUILD清理它。
我通常也做一个 ALTER TABLE REBUILD在更改列时,因为这会清除该操作中的任何指针或拆分。
由于我们谈论的是聚集索引(本质上是表),所以我是否需要同时执行这两项操作?
我的怀疑是ALTER INDEX REBUILD在集群上不会更新所有的东西ALTER TABLE,但我也担心ALTER TABLE不会清理索引碎片。
每个月我们都会制作生产数据库的月末快照。这些月末快照严格用于报告目的,没有对其进行任何插入、更新或删除。这些快照中的每一个都有一个.MDF和.LDF文件。
我想删除.LDF文件并释放服务器上的一些空间。我需要保留.LDF文件有什么原因吗?
澄清:
我们的生产数据库每晚从另一个系统的文件提取中重新创建。我们只报告生产数据库......从来没有更新过。
每晚流程:据
我所知......
每天晚上数据库表都会被截断
这些表通过一系列批量插入语句填充
索引被重建
我有一个 ASP.NET 网站,它自己独立缓存数据,并且数据在很长一段时间内不会改变,所以它不需要用相同的查询第二次查询 SQL Server。我需要提高到该 SQL Server 的首次(原始)查询的性能。某些查询处理的数据过多,可能会导致 SQL Server 使用tempdb. 我不使用临时表变量或临时表,因此 SQL Server 决定tempdb在需要时自行使用。
我的数据库大小是 16Gb,我的服务器机器上有 32Gb 的物理 RAM。
我知道 MS SQL Server 缓存策略会尝试将数据保留在 RAM 中,以在类似查询需要再次加载相同数据时提高它们的性能。除此之外,它会尝试使用可用 RAM 而不是 tempdb 来提高性能,而不会导致磁盘访问。
我想当需要在 tempdb SQL Server 中存储某些内容的查询出现并且没有足够的可用 RAM 时,SQL Server 有两种选择:
1) 卸载一些缓存数据并使用备用 RAM 而不是 tempdb 以避免磁盘写入
2) 为将来的查询保留缓存数据并开始使用 tempdb,这会导致写入磁盘速度变慢。
我不知道 SQL Server 在这种情况下会做出什么选择,但我希望它做出选择 #1,因为我只关心首次(原始)查询的性能,因为我再也不会向 SQL Server 发送相同的查询(虽然我可能会发送类似的查询)。
这种情况下的 SQL Server 缓存策略是什么?
它如何在避免原始查询的 tempdb 和第二次查询的速度之间平衡 RAM 的使用?
是否可以将 SQL Server 配置为做出选择 #1 的方式?如果是,那么如何?
我还能如何提高所有原始 SQL 查询的性能?
由于我不知道 …
我在 SQL Server Management Studio 2008 R2 中看不到复制数据库选项。
谁能告诉我这是怎么回事?

sql-server ×10
backup ×1
cache ×1
datafile ×1
join ×1
optimization ×1
performance ×1
query ×1
ssis ×1
ssms ×1