我有我的SSMS 2016年在查询窗口一个奇怪的问题backspace,del,up,down,left,right钥匙已经停止工作。当我使用“导入和导出设置”将我的环境设置重置为默认设置时,它可以工作,但是当我退出 SSMS 客户端时更改不会持续存在。每次我启动 SSMS 2016 时,我都必须做这个练习。
我在同一系统上也有 SSMS 2014,它没有任何问题,我尝试卸载并安装 SSMS 16 客户端,但没有成功。
有人遇到同样的问题吗?
请帮助,如何完全卸载 SQL Server Management Studio 2016?
为什么一个 SQL Server 表不能有多个标识列?
CREATE TABLE t(id INT IDENTITY, id2 INT IDENTITY)
Run Code Online (Sandbox Code Playgroud)
消息 2744,级别 16,状态 2,第 5
行 为表 't' 指定了多个标识列。
每个表只允许一个标识列。
我知道我们可以使用计算列来解决它。
根据产品文档,一张表不能有多个标识列。但为什么?背后的真正原因是什么?
我正在尝试学习表分区。但是,我很难理解为什么 SQL Server 会在一个简单的查询中表现出阶段性。
/* --------------------------------------------------
-- Create helper function GetNums by Itzik Ben-Gan
-- http://sqlmag.com/sql-server/virtual-auxiliary-table-numbers
-- GetNums is used to insert test data
-------------------------------------------------- */
-- Drop helper function if it already exists
IF OBJECT_ID('GetNums') IS NOT NULL
DROP FUNCTION GetNums;
GO
-- Create helper function
CREATE FUNCTION GetNums(@n AS BIGINT) RETURNS TABLE AS RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS …Run Code Online (Sandbox Code Playgroud) 希望有人可以帮助我了解 SQL Server 如何使用 stats 来估计记录数。
测试脚本
USE [tempdb]
GO
CREATE TABLE t1
(
a INT NOT NULL,
b INT NOT NULL,
c INT CHECK (c between 1 and 50),
CONSTRAINT pk_a primary key(a)
);
GO
INSERT INTO t1(a,b,c)
SELECT number, number%1000+1, number%50+1
FROM master..spt_values
WHERE type = 'P' AND number BETWEEN 1 and 1000;
GO
CREATE STATISTICS s_b ON t1(b);
CREATE STATISTICS s_c ON t1(c);
GO
Run Code Online (Sandbox Code Playgroud)
示例查询
DECLARE @c INT=300
SELECT * FROM t1 WHERE b>@c
SELECT * FROM …Run Code Online (Sandbox Code Playgroud) 我试图了解 SQL Server 在将记录插入堆表时的行为。根据关于 sql Server博客文章,第 2 段“如果其大小超过页面大小的 20%(8,060 字节 * 0.2 = 1,612 字节),SQL Server 将不会将新行放入页面。 ”
如果我正确理解了该语句,那么如果该表有一个大小为 2025 字节的记录,则第二条记录应该放在另一页上。但是,我的测试并不同意
设置脚本
环境:SQL 2019 x64 开发版。
create table dbo.Heap(id INT, Val varchar(8000) not null);
GO
insert into dbo.heap(ID, val) values (1,replicate('*',2010));
insert into dbo.heap(ID, val) values (2,replicate('*',2010));
insert into dbo.heap(ID, val) values (3,REPLICATE('*',2010));
insert into dbo.heap(ID, val) values (4,REPLICATE('*',2010));
Run Code Online (Sandbox Code Playgroud)
并运行以下代码
SELECT PARSENAME(REPLACE(REPLACE(REPLACE(CAST(sys.fn_PhysLocFormatter (%%physloc%%) AS varchar),')',''),'(',''),':','.'),2)PageNo,
sys.fn_PhysLocFormatter (%%physloc%%) AS [Location],* FROM heap ORDER BY [ID]
Run Code Online (Sandbox Code Playgroud)
上面的 SELECT …
我试图了解 SQL Server 如何从聚集索引访问数据。我的理解是,当表具有聚集索引时,SQL 应该能够使用搜索谓词搜索保存记录的单页。
但是,我的测试向我展示了执行查询时它会加载更多数据页。
CREATE TABLE t2(id INT IDENTITY PRIMARY KEY CLUSTERED,col2 VARCHAR(500),col3 VARCHAR(500));
INSERT INTO [dbo].[t2]([col2],[col3])
SELECT TOP 10010 REPLICATE('z',490),REPLICATE('*',490)
FROM sys.all_columns c1,
sys.all_columns c2
Run Code Online (Sandbox Code Playgroud)
以下查询
select *
from sys.dm_db_index_physical_stats(db_id(),object_id(N'dbo.t2'),DEFAULT,null,'DETAILED');
Run Code Online (Sandbox Code Playgroud)
将输出显示为
然后我清除了缓存
CHECKPOINT
GO
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)
并将以下SELECT搜索运行到一行中
SELECT [fplc].*,[t2].[col3] FROM [dbo].[t2] AS [t2]
CROSS APPLY sys.[fn_PhysLocCracker](%%physloc%%) AS [fplc]
WHERE id=4582
Run Code Online (Sandbox Code Playgroud)
上面的查询告诉我记录位于第 1061 页
我使用下面的代码检查有多少页已加载到缓冲区中以获取我的 SELECT 结果
SELECT buffers.* FROM sys.dm_os_buffer_descriptors buffers
INNER JOIN sys.allocation_units AS au
ON au.[allocation_unit_id] = buffers.[allocation_unit_id]
INNER JOIN sys.partitions AS …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下为什么以下内容没有被缓存
use AdventureWorks2014
go
DECLARE @id INT=43865
SELECT
sp.[BusinessEntityID]
, so.salesorderid
FROM sales.salesorderheader so JOIN sales.salesperson sp
ON sp.[BusinessEntityID] = so.salespersonid
WHERE so.salesorderid = @id
Run Code Online (Sandbox Code Playgroud)
每次我使用不同的参数执行上述查询时,它都会在计划缓存中创建一个条目
顺便说一下,优化临时工作负载已设置
谢谢