标签: sql-server-2012

列存储索引的结构是什么?

SQL Server 2012 中代号DenaliColumnstore 索引的新功能之一

我对常规的旧行存储索引非常了解,例如 b 树结构、叶级和 b 树页面之间的存储差异、包含字段的影响、优化使用它们、键的顺序等。

我很难获得有关列存储索引内部结构的任何好的信息。

  • 它的结构如何?
  • 有b树吗?有其他结构吗?
  • 数据是如何组织的?
  • 什么样的特定运算符最适合使用它?
  • 使用它们时要避免的任何其他反模式?

我能找到的很多关于它们的信息基本上与“正常”索引完全相反,即没有键的排序,没有包含的字段,只有非聚集。

任何见解表示赞赏。

index sql-server sql-server-2012 columnstore

21
推荐指数
1
解决办法
2422
查看次数

什么是 SQL Server“Denali”?什么是新的?

我在 MSDN 的下拉列表中找到了一个名为SQL Server "Denali"的新标题,但我没有找到太多关于它的信息:

是否有人对此版本中的新功能或重大错误修复有更详细的信息?我希望有人使用过或测试过它。

新功能

features sql-server-2012

20
推荐指数
6
解决办法
6257
查看次数

为什么 DELETE 会对性能产生挥之不去的影响?

最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了 - 性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。

@Table Variable  #Temp (delete)  #Temp (truncate)
---------------  --------------  ----------------
5723             5180            5506
15636            14746           7800
14506            14300           5583
14030            15460           5386
16706            16186           5360
Run Code Online (Sandbox Code Playgroud)

只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka GetDate()) 是在语句时使用的,而不是批处理时,因此 TRUNCATE/DELETE 与SET @StartTime = CURRENT_TIMESTAMP语句之间不应有交互。

select current_timestamp
waitfor delay '00:00:04'
select current_timestamp

-----------------------
2012-10-21 11:29:20.290

-----------------------
2012-10-21 11:29:24.290
Run Code Online (Sandbox Code Playgroud)

当使用 DELETE 清除表时,第一次运行和后续运行之间的跳转非常一致。我对DELETE 的理解缺少什么?我已经重复了很多次,交换了顺序,调整了 tempdb 的大小以使其不需要增长等。

CREATE TABLE #values (
  id int identity primary key, -- will be clustered …
Run Code Online (Sandbox Code Playgroud)

performance sql-server delete truncate sql-server-2012

20
推荐指数
1
解决办法
4094
查看次数

SQL Server Management Studio 2012:如何在 SSMS 项目中拥有文件夹?

我正在使用 SSMS 2012 与我们使用的 SQL Server 2012 和 Azure SQL Server 进行通信。我承认我不是 SQL 专家,所以我一直在保存我的大部分 SQL 脚本以备将来参考。我很快在 SSMS 项目中遇到了 20 个左右的 .SQL 脚本,它们都位于同一个“查询”文件夹下。

有没有办法在项目中创建“子文件夹”,以便我可以正确组织我的脚本?大多数其他人如何保持他们的脚本有条理?我很确定这是否会困扰像我这样的新手,这对于真正的管理员来说一定是一个真正的问题(可能有数百个脚本?)

ssms sql-server-2012

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

在 SQL Server 中检测锁定的表或行

我正在尝试了解/学习如何追踪被阻止会话的详细信息。

所以我创建了以下设置:

create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;
Run Code Online (Sandbox Code Playgroud)

现在我从两个不同的客户端连接到数据库两次。

第一届会议议题:

begin transaction
update foo set some_data = 'update'
  where id = 1;
Run Code Online (Sandbox Code Playgroud)

我明确没有在那里提交以保持锁定。

在第二个会话中,我发布了相同的声明,当然,由于锁定而等待。现在我正在尝试使用不同的查询来查看会话 2 正在等待foo表。

sp_who2 显示以下内容(我删除了一些列以仅显示重要信息):

SPID | 状态 | BlkBy | 数据库名称 | 命令 | SPID | 请求ID
-----+--------------+-------+---------+---------- ------+------+-------
52 | 睡觉| . | 食物b | 等待命令 | 52 | 0        
53 | 睡觉| . | 食物b | 等待命令 | …

sql-server-2012 locking

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

为什么这个连接基数估计这么大?

对于以下查询,我遇到了我认为不可能高的基数估计:

SELECT dm.PRIMARY_ID
FROM
(
    SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID
    FROM X_DRIVING_TABLE dt
    LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID
    LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID
    LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID
    LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID
) dm
INNER JOIN X_LAST_TABLE lst ON dm.PRIMARY_ID = lst.JOIN_ID;
Run Code Online (Sandbox Code Playgroud)

估计的计划在这里。我正在处理表格的统计副本,因此无法包含实际计划。但是,我不认为它与这个问题非常相关。

SQL Server 估计将从“dm”派生表返回 481577 行。然后估计在连接到 X_LAST_TABLE 后将返回 4528030000 行,但 JOIN_ID 是 X_LAST_TIME 的主键。我希望连接基数估计在 0 到 481577 行之间。相反,当交叉连接外部表和内部表时,行估计值似乎是我得到的行数的 10%。计算结果为四舍五入:481577*94025*0.1 …

sql-server sql-server-2012 cardinality-estimates

20
推荐指数
2
解决办法
1721
查看次数

SSMS 工具包替代品

是否有任何工具可与SSMS Tools Pack 2012相媲美?许可(每台机器 30 美元,任意数量的机器 100 美元……3 个月)还有很多不足之处,我不确定还有哪些其他选项可用。

例如,我真正怀念的一件事是“保存您运行的每个查询”。在修修补补和研究时,在运行不同版本的查询时进行备份是非常宝贵的。或者当我意识到我没有 2 个月前正在处理的查询的备份时。

说明:SQL Server Management Studio 没有官方插件支持,但有一些工具。SSMS Tools Pack 是我非常喜欢的一个(2005、2008 版本),但是 2012 年的许可费太可怕了。(我会为合理的许可证付费,但这不是这里的问题。)

例如,我发现SSMS BoostSSMS有一些很酷的补充,这似乎是值得的。

SQL Server 2012 还有哪些其他插件可用?我希望有一些东西可以在我点击 F5 时像 SSMS 工具包那样保存查询,或者除了列出的两个工具之外的任何东西?

sql-server ssms sql-server-2012

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

查询计划“基数估计”中的警告

create table T(ID int identity primary key)
insert into T default values
insert into T default values

go

select cast(ID as varchar(10)) as ID
from T
where ID = 1
Run Code Online (Sandbox Code Playgroud)

上面的查询在查询计划中有一个警告。

<Warnings>
  <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)

为什么它有警告?

字段列表中的强制转换如何影响基数估计?

sql-server execution-plan type-conversion sql-server-2012 cardinality-estimates

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

将 SQL Server 中的兼容模式从 100 更改为 110 的影响

我有一个Mydatabase在 SQL Server 2008 R2 中创建的数据库。我已经升级到 SQL Server 2012。

我试图执行以下查询来计算百分位数

select Distinct [KEY],PERCENTILE_CONT(0.25)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q1,PERCENTILE_CONT(0.50)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q2,
PERCENTILE_CONT(0.75)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q3,
PERCENTILE_CONT(1)  within group(order by EachPrice)
OVER(Partition By [KEY]) As Q4
from Mydatabase
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误说明

消息 10762,级别 15,状态 1,第 1 行
当前兼容模式下不允许使用 PERCENTILE_CONT 函数。仅允许在 110 模式或更高模式下使用。

  1. 我可以将兼容模式更改为 110 吗?
  2. 将兼容模式从 100 更改为 110 有什么影响?

请指教

sql-server-2012 compatibility-level

19
推荐指数
3
解决办法
4万
查看次数

锁定创建表

在另一个应用程序中,我被糟糕的设计震惊了:多个线程EnsureDatabaseSchemaExists()同时执行一个方法,它看起来基本上是这样的:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN

    CREATE TABLE MyTable ( ... );

END
Run Code Online (Sandbox Code Playgroud)

但是,即使在 SERIALIZABLE 事务中执行,此代码似乎也不是线程安全的(即并行代码尝试多次创建表)。是否有机会强制 SELECT 语句获取阻止另一个线程执行相同 SELECT 语句的锁?

是否有更好的多线程 EnsureSchemaExists() 方法模式?

sql-server sql-server-2012 locking

19
推荐指数
2
解决办法
1424
查看次数