天蓝色专用 sql 池 (sqldw) 可序列化表提示语句奇怪的行为

Posted

技术标签:

【中文标题】天蓝色专用 sql 池 (sqldw) 可序列化表提示语句奇怪的行为【英文标题】:azure dedicated sql pool (sqldw) serializable table hint statement odd behavior 【发布时间】:2021-11-09 18:23:24 【问题描述】:

平台:天蓝色

产品:专用 sql 池 (sqldw)

如果有人知道的话,我有一个奇怪的行为,希望能更好地理解。我正在尝试测试可序列化表提示是否有效。我找不到任何官方文档,所以我假设它不受支持,并且返回的错误似乎同意。除此之外,我的问题与 t-sql 语法有关。

如果我执行这个:

select *
from serialtest with (serializable)
order by session_id

我明白了:

Msg 103022, Level 16, State 1, Line 2
Parse error at line: 2, column: 26: serializable is not a recognized table or a view hint.

但是,如果我执行此操作,它会起作用!?:

select *
from serialtest (serializable)
order by session_id

我只是在查询我刚刚创建的新表。因此,除非有一些新的语法或提示可以在没有“with”字的情况下使用,否则我会傻眼了。我还测试了这个提示,并且能够在这个语句仍在运行时更新表,这意味着可序列化提示实际上并没有按应有的方式工作。

那么这个 select 语句究竟是用这个“可序列化”提示做什么的呢?我尝试将它包裹在 BEGIN TRANSACTION...COMMIT 周围,但仍然是相同的行为。

【问题讨论】:

Azure Synapse Analytics,专用 SQL 池不支持表提示,我认为您正在做的事情是不小心给表名“(可序列化)”的别名。 @wBob 感谢您的评论。我之前也想过同样的事情并将“可序列化”更改为“tbla”,我得到了这个:Msg 207,Level 16,State 1,Line 110 Invalid column name 'tbla'。为不是函数的对象“serialtest”提供的参数。如果参数旨在作为表提示,则需要 WITH 关键字。 【参考方案1】:

这是一个有趣的问题/问题。

serializable 是一个锁定提示,但 serializable 不是 SQLDW/Dedicated Pool 上支持的事务隔离级别。

Read Uncommitted 和 READ COMMITTED SNAPSHOT 是。 https://docs.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-develop-transactions

像这样的其他提示不会出错,例如,不需要“WITH” - (READUNCOMMITTED) 和 (NOLOCK)。 https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-ver15#:~:text=Hints%20%28Transact-SQL%29%20-%20Query%201%20Remarks.%20Query%20hints,the%20query.%20The%20example%20uses%20the%20AdventureWorks2012%20database.

那么它在做什么呢?我不认为它实际上在做任何事情。 看起来它被忽略了。 如果您查看解释计划 - (可序列化)提示不会传递给计算节点。

【讨论】:

我从没想过要查看解释计划,但是当我使用(NOLOCK)提示执行查询时,我在解释计划中也没有看到“(NOLOCK)”? NOLOCK 不是 SQLDW/SQL 专用池的有效提示。只有少数人可以工作。我只是将它用作其他提示的示例,这些提示不会出错,但也不会做任何事情。 感谢您的澄清。你能指出我在哪里可以看到这些有用的提示吗?感谢您的时间。

以上是关于天蓝色专用 sql 池 (sqldw) 可序列化表提示语句奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

Polybase 外部表与 OPENROWSET 无服务器 sql 池架构

如何写入 Synapse 专用 sql 池

Databricks 写回天蓝色突触错误

Azure Synapse Analytics 专用 SQL 池 - IIF 语句不起作用

写入 Synapse DWH 池时出现 Spark 错误

是否可以将数据从 ADLS 加载到 DBX 中的 SQL DW?