服务器 (SQL Server 2008) 的 tempdb 每月数次增加到 500GB+。是否可以找出导致此问题的 SQL 语句?问题通常不是由create table #temp...; insert into #temp...或select ... into #temp...复杂的连接引起的。
某些 tempdb 文件的初始大小每次也会自动设置为更大的值。如何预防?
有时缓存的计划会阻止调整/缩小文件的大小。如何找到哪一个持有tempdb?
对于具有标识列的表,是否应该为标识列创建聚集或非聚集 PK/唯一索引?
原因是将为查询创建其他索引。使用非聚集索引(在堆上)并返回索引未涵盖的列的查询将使用较少的逻辑 I/O (LIO),因为没有额外的聚集索引 b 树查找步骤?
create table T (
Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table)
A .... -- A, B, C have mixed data type of int, date, varchar, float, money, ....
B ....
C ....
....)
create index ix_A on T (A)
create index ix_..... -- Many indexes can be created for queries
-- Common query is query on A, B, C, ....
select A, …Run Code Online (Sandbox Code Playgroud) performance sql-server database-internals index-tuning heap performance-tuning
我有一个包含 45M 行(45 GB 数据空间和 2GB 索引空间)的表。我添加了一个新列,它立即完成。
alter table T add C char(25)
Run Code Online (Sandbox Code Playgroud)
然后我发现尺寸太小,所以我运行以下查询。
alter table T alter column C varchar(2500)
Run Code Online (Sandbox Code Playgroud)
它运行了一个小时,并且仍在运行。sp_whoisactive 显示(目前,仍在运行)
reads: 48,000,000
writes: 5,000,000
physical reads: 3,900,000
Run Code Online (Sandbox Code Playgroud)
不是应该很快吗?
我有一个很大的分区表(300+M 行,70 个活动分区)。该表具有 (K0, K1) 的集群 PK,并在列 K1 上进行分区。而 K1 的选择性非常低。
但是,以下查询需要半分钟,扫描计数为 170,逻辑读取为 603K。
select max(K1) from table
Run Code Online (Sandbox Code Playgroud)
然而,在 K1 上索引的非分区表上的类似查询不需要时间,扫描计数为 1,逻辑读取为 5。
是否应该在 K1 上创建无分区索引?
编辑:
为 K1 上没有索引的分区表规划文本。在 K0,K1 上使用聚集 PK,然后在 C1 上创建索引。
|--流聚合(DEFINE:([Expr1004]=MAX([partialagg1005])))
|--Parallelism(Gather Streams)
|--Stream Aggregate(DEFINE:([partialagg1005]=MAX([DB1].[dbo].[table1].[K1])))
|--聚簇索引扫描(OBJECT:([DB1].[dbo].[table1].[PK_dbo_tabl1]))
为索引在 K1 上的非分区表规划文本。
|--流聚合(DEFINE:([Expr1003]=MAX([DB1].[dbo].[table2].[K1])))
|--顶(顶表达式:((1)))
|--索引扫描(OBJECT:([Db1].[dbo].[table2].[idx_K1]), ORDERED BACKWARD)
使用 K0、K1 上的聚集 PK 和 C1 上的索引为分区表规划文本。
|--流聚合(DEFINE:([Expr1004]=MAX([partialagg1005])))
|--Parallelism(Gather Streams)
|--Stream Aggregate(DEFINE:([partialagg1005]=MAX([db1].[dbo].[table1].[K1])))
|--索引扫描(OBJECT:([db1].[dbo].[table1].[IX_C1]))
我有下表。
create table T (K1 date, K2 int references S(Id), ....) on partitionScheme(K1)
Run Code Online (Sandbox Code Playgroud)
该表将按 K1 进行分区(K1 具有低选择性。数据将按顺序追加K1)。首选以下哪个主键(列顺序不同)?
alter table T add primary key clustered (K1, K2)
alter table T add primary key clustered (K2, K1)
Run Code Online (Sandbox Code Playgroud)
或者PK应该是非聚集的并创建另一个聚集索引?
很多查询看起来像:
select ....
from T join S on S.Id = T.K2
where ....
Run Code Online (Sandbox Code Playgroud) 我有一个 2008/2012 年的 Sql 服务器。一些用户运行非常昂贵的查询,例如在一个事务中更新 1G 行或交叉连接几个非常大的表,它会导致服务器时常无响应。
跟踪/触发服务器以在发生时保存正在运行的查询的好方法是什么?
我有一个几乎有 1T 行的表。
create table bigtable (
K1 int, K2 date, -- PK columns
C1 ..., C8 ...., -- columns with various data types like float, date, varchar, ...
B1 bit, B2 bit, ......, B10 bit -- 10 or so bit columns
primary key (K1, K2)
)
Run Code Online (Sandbox Code Playgroud)
我想使用列存储来提高查询性能。有以下选项。
用户将自己编写查询。许多查询将是聚合查询。选项 3 的运行速度是否与其他两个尺寸较小的选项一样快?
我正在使用 SQL Server 2014。在我的情况下,我可以定期删除/重新创建非聚集列存储索引,因为数据不经常更新。
我有一个返回一百多列的查询。列名包含重要的下划线、>、< 和大写/小写字符。但是,在创建报告时,SSRS 设计器 (3.0) 会自动添加空格并将这些特殊字符转换为空格。这真的很烦人。是否可以禁用此 SSRS 功能?
使用以下两种方法修复标题需要多少工作?
使用脚本将列标题更新回原始列名称。
转换 XML 报告 rdl 文件。
似乎Sql server 2012 的SSMS 不能再打印带有语法颜色的SQL 语句了。这是一个错误吗?它有任何解决方法吗?
我们发现很多bug都是因为缺少逗号,
select
aaaa,
bbbb -- forgot comma
ccc,
dddddddd,
.....
Run Code Online (Sandbox Code Playgroud)
它是一种使expression name无效的方法并且它必须expression as name在SQL语句中吗?(不是全局的,因为缺少“as”存在的遗留代码)
sql-server ×9
alter-table ×1
columnstore ×1
heap ×1
index-tuning ×1
partitioning ×1
performance ×1
ssms ×1
ssrs ×1
tempdb ×1