从SQL Server 2008 开始的From 子句文档简要提到了 3 个连接提示及其基本机制:
然而,似乎没有太多关于何时可能需要使用它们的信息。
似乎它们可以与散列、循环和合并结合使用,这些已经被理解为这个问题的目的。
文档中的相关部分:
对于 SQL 数据仓库和并行数据仓库,这些联接提示适用于两个分布不兼容的列上的 INNER 联接。它们可以通过限制查询处理期间发生的数据移动量来提高查询性能。SQL 数据仓库和并行数据仓库的允许连接提示如下:
REDUCE
减少要为联接右侧的表移动的行数,以使两个分布不兼容的表兼容。REDUCE 提示也称为半连接提示。REPLICATE
将连接左侧表的连接列中的值复制到所有节点。右侧的表连接到这些列的复制版本。REDISTRIBUTE
强制将两个数据源分布在 JOIN 子句中指定的列上。对于分布式表,Parallel Data Warehouse 会执行shuffle move。对于复制表,并行数据仓库将执行修剪移动。要了解这些移动类型,请参阅并行数据仓库产品文档中“了解查询计划”主题中的“DMS 查询计划操作”部分。当查询计划使用广播移动来解决分发不兼容的连接时,此提示可以提高性能。
join sql-server hints sql-server-pdw azure-sql-data-warehouse
这里有没有人在Azure 数据仓库数据库上创建和使用 UDF 很幸运?我正在将本地仓库从 SQL Server 2014 迁移到 Azure 数据仓库,但遇到了 UDF 问题。
CREATE FUNCTION dbo.fn_GetImpliedRate (@Multiple float, @term int)
RETURNS float
AS
BEGIN
DECLARE @ImpInt float
IF(@Term = 1)
SET @ImpInt = (select [1] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 2)
SET @ImpInt = (select [2] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 3)
SET @ImpInt = (select [3] from dbo.ImpliedRate where Multiple = @Multiple);
IF(@Term = 4)
SET @ImpInt = (select [4] from dbo.ImpliedRate …
Run Code Online (Sandbox Code Playgroud) 我有一个 Active Directory 用户 LDomain\LUser,我希望该用户能够连接到 Azure-Sql-DB。MS 使用的语法会引发错误。
T-SQL:
CREATE USER [LDomain\LUser] FROM EXTERNAL PROVIDER
Run Code Online (Sandbox Code Playgroud)
错误:
找不到主体“LDomain\LUser”或不支持此主体类型。
我只是在寻找添加 AD 用户的脚本 - 没有界面。我知道 AD 用户存在于 Azure 中并已确认,但 Azure-Sql-DB 无法识别它,或者此 T-SQL 无效 - 尽管这是来自他们的文档。
security azure-sql-database active-directory azure azure-sql-data-warehouse
我什至不确定我是否正确地提出了这个问题,但我会尝试 - 我有一堆从 Linux 系统上的 Oracle 导出生成的巨大文本文件。每个文件大小约为 30 GB,我有大约 50 个。
目标是将此数据导出到 Azure SQL 数据仓库。在这种情况下,考虑到数据的大小,BCP 不是正确的方法,所以我不得不使用 Polybase。
从 ASCII 转换为 UTF8 编码后,我在查询外部表时遇到了问题。Polybase 不能很好地处理固定宽度的文本文件,每行都有一个换行符。
文本文件看起来像这样:
101,102,103,104,105,106,107 108,108,109,110,111,112,113 114,115,116,117,118,119,120 121,122,123 --这里什么都没有,只是一个空行 201、202、203、204、205、206、207 208,209,210,211,212,213,214 215,216,217
Polybase 尝试从 101 到 107 进行处理,并且出现错误,抱怨此文件中没有足够的列可供处理。
这是我认为正在发生的事情:固定宽度和换行符使其将换行符视为行分隔符。
如何将此文件转换为如下所示:
101,102,103,104,105,106,107,108,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123{CR} 201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217{CR}{LF}
编辑:这是来自文件的示例数据。我在 Windows VM 上用 git bash 打开它。
这些文件应该有 167 列,,
作为列分隔符。问题是,由于每行产生多行,因此很难从 Polybase 外部表处理它们。
查询 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) 为了说明我的问题,以下是一个查询,检测尚未插入数据仓库并插入它们的订单的 id:
With NewOrders
As
(
Select OrderID From Orders
Except
Select OrderID From FactOrders
)
Insert Into FactOrders(OrderID, OrderDate, CustomerId)
Select OrderID, OrderDate, CustomerId From Orders
Where OrderID in (Select OrderID from NewOrders);
Run Code Online (Sandbox Code Playgroud)
假设查询是第一次运行并且Orders
包含 4 亿行或更多行:
SQL Server 能否在一条INSERT
语句中处理这么多行?
如果没有,我应该如何进行?我应该限制INSERT
语句中提取的行数吗?引擎可以在单个INSERT
语句中处理多少行?
我想向 azure数据仓库中的表添加检查约束。
我有以下脚本:
alter table [FactTbl_Test] add constraint Ck_Test_id check ([Test_Id] != 'Unknown')
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
第 2 行解析错误,第 74 列:'check' 附近的语法不正确。
编辑:
如果在表声明中创建约束,也会出现相同的错误。