我有一个基于浮点列值排除数据的查询
select *
from My_Table
where my_Float_column != 0 and my_Float_column is not null
Run Code Online (Sandbox Code Playgroud)
如果可以的话,我不想索引浮点类型。执行计划是否足够聪明以使用像下面这样的过滤索引(我只索引 0 和 null 值)来提高性能?
CREATE NONCLUSTERED INDEX IX_My_Table_Float_Filtered
ON My_Table (my_Float_column)
WHERE my_Float_column = 0 or my_Float_column is null
Run Code Online (Sandbox Code Playgroud) 运行更新语句时,例如下面的语句,我收到一条错误消息,告诉我
窗口函数只能出现在 SELECT 或 ORDER BY 子句中。
UPDATE dbo.Dim_Chart_of_Account
SET Account_Order = LAG([Account_Order]) OVER (ORDER BY [Account_SKey])
Run Code Online (Sandbox Code Playgroud)
我知道这可以使用可更新的 cte 轻松解决,如下所示
WITH my_cte AS (
SELECT [Account_Order], LAG([Account_Order]) OVER (ORDER BY [Account_SKey]) AS acc_order_lag
FROM Dim_Chart_of_Account
)
UPDATE my_cte
SET [Account_Order] = acc_order_lag
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有任何原因在更新语句中不允许这样做,我是否应该避免使用可更新的 cte 作为解决方法?
我担心的是在使用带有更新语句的窗口函数时会出现问题,因此我想了解这是一种可接受的方法还是应该避免的方法。
select into 语法将创建一个新表以将数据插入其中(我知道类型可能不一致等,但它为您提供了一个粗略的副本)。
delete output into 语句是否也可以以相同的方式创建新表,而不必先定义表?
查询 sys.partitions 可以返回表的近似行数。
我注意到,无论实际内容如何(即使是空分区),这都会为所有分区返回相同的行数。
该表具有聚集列存储索引,并且几乎所有列上都创建了统计信息。每次数据加载后,每天都会更新统计信息。该表按日期分区。
sys.partitions 查询:
SELECT convert(date, convert(varchar,rv.[value])) as partitionDate, p.rows as syspartitions_RowCount
FROM sys.tables t
join sys.schemas sc on sc.schema_id = t.schema_id
JOIN sys.partitions p ON p.[object_id] = t.[object_id]
JOIN sys.indexes i ON i.[object_id] = p.[object_id]
AND i.[index_id] = p.[index_id]
JOIN sys.data_spaces ds ON ds.[data_space_id] = i.[data_space_id]
LEFT JOIN sys.partition_schemes ps ON ps.[data_space_id] = ds.[data_space_id]
LEFT JOIN sys.partition_functions pf ON pf.[function_id] = ps.[function_id]
LEFT JOIN sys.partition_range_values rv ON rv.[function_id] = pf.[function_id]
AND rv.[boundary_id]+1 = p.[partition_number]
WHERE p.[index_id] …
Run Code Online (Sandbox Code Playgroud) 如果我在数据库中的两个不同表上有一个 rowversion,它们是否保证在两个表中都是唯一的?如果没有,有没有办法设置这种行为?
我有一个将两个表连接在一起的视图,我想知道是否可以保证这种行为,以便我可以从任一表中获取最大的行号,以形成视图的行版本。
想象一下,我正在通过管理工作室运行多个批次,由 GO 命令分隔。我想知道隐式事务的行为方式 - 事务是按批次提交还是在整个执行过程中提交一次。
我有一项任务需要将现有数据库迁移到新服务器。
有问题的数据库具有查询同一服务器上的另一个数据库的存储过程,不会移动第二个数据库。
我很想使用同义词指向链接服务器上的另一个数据库,因为这将使设置和维护变得非常容易,但是我想知道同义词是否可能导致执行计划的性能问题,或者如果只是跨服务器查询是问题所在。
我有两个相同的表并保存相同的数据行。
一个为表的每一列使用 varchar(255),另一个为每列正确键入(使用日期、整数、十进制等)。
使用 Management Studio 的属性窗口,我可以看到将所有数据存储为 varchar 的表要小得多,这不是我期望看到的。我的理解是 int 只使用 4 个字节的空间,因此使用的空间比存储为 varchar 的 int 少得多。
我应该寻找什么来了解这里发生的事情?两个表在 int 列上都有一个主键,没有其他索引。出于测试目的,它们填充了来自同一源查询的相同数据集。
我想向 azure数据仓库中的表添加检查约束。
我有以下脚本:
alter table [FactTbl_Test] add constraint Ck_Test_id check ([Test_Id] != 'Unknown')
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
第 2 行解析错误,第 74 列:'check' 附近的语法不正确。
编辑:
如果在表声明中创建约束,也会出现相同的错误。
是否可以为某个用户生成用户已获得显式访问权限的对象列表?
我想查看用户拥有明确权限的所有项目的列表,不包括通过角色等继承的任何权限。