SQL Server 2012 中代号Denali为Columnstore 索引的新功能之一。
我对常规的旧行存储索引非常了解,例如 b 树结构、叶级和 b 树页面之间的存储差异、包含字段的影响、优化使用它们、键的顺序等。
我很难获得有关列存储索引内部结构的任何好的信息。
我能找到的很多关于它们的信息基本上与“正常”索引完全相反,即没有键的排序,没有包含的字段,只有非聚集。
任何见解表示赞赏。
我在 MSDN 的下拉列表中找到了一个名为SQL Server "Denali"的新标题,但我没有找到太多关于它的信息:
是否有人对此版本中的新功能或重大错误修复有更详细的信息?我希望有人使用过或测试过它。
最后是一个测试脚本,用于比较@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) 我正在使用 SSMS 2012 与我们使用的 SQL Server 2012 和 Azure SQL Server 进行通信。我承认我不是 SQL 专家,所以我一直在保存我的大部分 SQL 脚本以备将来参考。我很快在 SSMS 项目中遇到了 20 个左右的 .SQL 脚本,它们都位于同一个“查询”文件夹下。
有没有办法在项目中创建“子文件夹”,以便我可以正确组织我的脚本?大多数其他人如何保持他们的脚本有条理?我很确定这是否会困扰像我这样的新手,这对于真正的管理员来说一定是一个真正的问题(可能有数百个脚本?)
我正在尝试了解/学习如何追踪被阻止会话的详细信息。
所以我创建了以下设置:
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 | 等待命令 | …
对于以下查询,我遇到了我认为不可能高的基数估计:
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 …
是否有任何工具可与SSMS Tools Pack 2012相媲美?许可(每台机器 30 美元,任意数量的机器 100 美元……3 个月)还有很多不足之处,我不确定还有哪些其他选项可用。
例如,我真正怀念的一件事是“保存您运行的每个查询”。在修修补补和研究时,在运行不同版本的查询时进行备份是非常宝贵的。或者当我意识到我没有 2 个月前正在处理的查询的备份时。
说明:SQL Server Management Studio 没有官方插件支持,但有一些工具。SSMS Tools Pack 是我非常喜欢的一个(2005、2008 版本),但是 2012 年的许可费太可怕了。(我会为合理的许可证付费,但这不是这里的问题。)
例如,我发现SSMS Boost对SSMS有一些很酷的补充,这似乎是值得的。
SQL Server 2012 还有哪些其他插件可用?我希望有一些东西可以在我点击 F5 时像 SSMS 工具包那样保存查询,或者除了列出的两个工具之外的任何东西?
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
我有一个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 模式或更高模式下使用。
请指教
在另一个应用程序中,我被糟糕的设计震惊了:多个线程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-2012 ×10
sql-server ×6
locking ×2
ssms ×2
columnstore ×1
delete ×1
features ×1
index ×1
performance ×1
truncate ×1