針對 Azure Synapse Analytics 中的無伺服器 SQL 集區進行疑難排解

本文包含如何針對 Azure Synapse Analytics 中無伺服器 SQL 集區最常見的問題進行疑難解答的相關信息。

若要深入瞭解 Azure Synapse Analytics,請參閱 概觀Azure Synapse Analytics 的新功能?

Synapse Studio

Synapse Studio 是一種易於使用的工具,您可以使用瀏覽器來存取您的數據,而不需要安裝資料庫存取工具。 Synapse Studio 並非設計來讀取大量數據或完整管理 SQL 物件。

Synapse Studio 中的無伺服器 SQL 集區呈現灰色

如果 Synapse Studio 無法建立與無伺服器 SQL 集區的連線,您會發現無伺服器 SQL 集區呈現灰色或顯示離線狀態

此問題通常會因為下列兩個原因之一而發生:

  • 您的網路可防止與 Azure Synapse Analytics 後端通訊。 最常見的情況是 TCP 連接埠 1443 遭到封鎖。 若要讓無伺服器 SQL 集區運作,請解除封鎖此埠。 其他問題可能會防止無伺服器 SQL 集區運作。 如需詳細資訊,請參閱 疑難解答指南
  • 您沒有登入無伺服器 SQL 集區的許可權。 若要取得存取權,Azure Synapse 工作區管理員必須將您新增至工作區管理員角色或 SQL 系統管理員角色。 如需詳細資訊,請參閱 Azure Synapse 訪問控制

Websocket 連線意外關閉

您的查詢可能會失敗,並出現錯誤訊息:這則訊息 Websocket connection was closed unexpectedly. 表示您與 Synapse Studio 的瀏覽器連線因為網路問題而中斷。

  • 若要解決此問題,請重新執行您的查詢。
  • 嘗試 使用 Azure Data StudioSQL Server Management Studio 進行相同的查詢,而不是 Synapse Studio 以進行進一步調查。
  • 如果此訊息經常在您的環境中發生,請從您的網路管理員取得協助。 您也可以檢查防火牆設定,並檢查 疑難解答指南
  • 如果問題持續發生,請透過 Azure 入口網站 建立支援票證

Synapse Studio 中不會顯示無伺服器資料庫

如果您沒有看到在無伺服器 SQL 集區中建立的資料庫,請檢查您的無伺服器 SQL 集區是否已啟動。 如果停用無伺服器 SQL 集區,則不會顯示資料庫。 執行任何查詢,例如 SELECT 1,在無伺服器 SQL 集區上啟動它,並讓資料庫出現。

Synapse 無伺服器 SQL 集區顯示為無法使用

不正確的網路設定通常是造成此行為的原因。 請確定埠已正確設定。 如果您使用防火牆或私人端點,也請檢查這些設定。

最後,請確定已授與適當的角色,且尚未撤銷。

無法建立新的資料庫,因為要求會使用舊/過期的密鑰

此錯誤是因為變更用於加密的工作區客戶管理金鑰所造成。 您可以選擇使用最新版的作用中金鑰重新加密工作區中的所有資料。 若要重新加密,請將 Azure 入口網站 中的金鑰變更為暫存密鑰,然後切換回您想要用於加密的密鑰。 在這裡瞭解如何 管理工作區金鑰

將訂用帳戶轉移至不同的 Microsoft Entra 租用戶之後,無法使用 Synapse 無伺服器 SQL 集區

如果您將訂用帳戶移至另一個 Microsoft Entra 租使用者,可能會遇到無伺服器 SQL 集區的問題。 建立支援票證,Azure 支援 會連絡您以解決問題。

儲存體存取

如果您在嘗試存取 Azure 記憶體中的檔案時收到錯誤,請確定您有權存取數據。 您應該能夠存取公開可用的檔案。 如果您嘗試在沒有認證的情況下存取數據,請確定您的 Microsoft Entra 身分識別可以直接存取檔案。

如果您有應該用來存取檔案的共用存取簽章密鑰,請確定您已建立 包含該認證的伺服器層級資料庫範圍 認證。 如果您需要使用工作區 受控識別 和自定義 服務主體名稱 (SPN) 來存取數據,則需要認證。

無法讀取、列出或存取 Azure Data Lake 儲存體 中的檔案

如果您使用不含明確認證的 Microsoft Entra 登入,請確定您的 Microsoft Entra 身分識別可以存取記憶體中的檔案。 若要存取檔案,您的 Microsoft Entra 身分識別必須具有 Blob 數據讀取者許可權,或 ADLS 中列出讀取訪問控制清單的許可權。 如需詳細資訊,請參閱 查詢失敗,因為無法開啟檔案。

如果您使用認證存取記憶體,請確定受控識別或SPN具有數據讀取者參與者角色或特定 ACL 許可權。 如果您使用 共用存取簽章令牌,請確定其具有 rl 許可權且尚未過期。

如果您使用 SQL 登入和OPENROWSET不含數據來源的函式,請確定您有符合記憶體 URI 且有權存取記憶體的伺服器層級認證。

查詢失敗,因為無法開啟檔案

如果您的查詢失敗並出現錯誤 File cannot be opened because it does not exist or it is used by another process ,而且您確定檔案存在,而且其他進程並未使用,則無伺服器 SQL 集區無法存取檔案。 此問題通常是因為您的 Microsoft Entra 身分識別沒有存取檔案的許可權,或因為防火牆封鎖檔案的存取。

根據預設,無伺服器 SQL 集區會嘗試使用您的 Microsoft Entra 身分識別來存取檔案。 若要解決此問題,您必須擁有適當的許可權才能存取檔案。 最簡單的方式是在您嘗試查詢的記憶體帳戶上,將 儲存體 Blob 數據參與者角色授與自己。

如需詳細資訊,請參閱

儲存體 Blob 數據參與者角色的替代方案

您也可以在檔案子集上授與更細微的許可權,而不是將 儲存體 Blob 數據參與者角色授與自己。

需要存取此容器中某些數據的所有使用者,也必須擁有根目錄 (容器) 上所有父資料夾的 EXECUTE 許可權。

深入了解如何在 Azure Data Lake Storage Gen2 中設定 ACL

注意

容器層級上的執行許可權必須在 Azure Data Lake 儲存體 Gen2 內設定。 您可以在 Azure Synapse 中設定資料夾的權限。

如果您想要在此範例中查詢data2.csv,則需要下列許可權:

  • 在容器上執行許可權
  • 對 folder1 執行許可權
  • data2.csv的讀取許可權

顯示 Data Lake 許可權結構的圖表。

  1. 使用具有您想要存取之數據完整許可權的系統管理員使用者登入 Azure Synapse。

  2. 在數據窗格中,以滑鼠右鍵按下檔案,然後選取 [ 管理存取權]。

    顯示管理存取選項的螢幕快照。

  3. 至少 選取 [讀取 ] 許可權。 輸入使用者的 UPN 或物件識別碼, 例如 user@contoso.com。 選取 [新增]。

  4. 授與此使用者的讀取許可權。

    顯示授與讀取許可權的螢幕快照。

注意

對於來賓使用者,此步驟必須使用 Azure Data Lake 直接完成,因為它無法透過 Azure Synapse 直接完成。

路徑上的目錄內容無法列出

此錯誤表示查詢 Azure Data Lake 的用戶無法列出記憶體中的檔案。 有數種情況可能會發生此錯誤:

  • 使用 Microsoft Entra 傳遞驗證的 Microsoft Entra 使用者沒有許可權列出 Data Lake 儲存體 中的檔案。
  • 使用共用存取簽章密鑰或工作區受控識別讀取數據的 Microsoft Entra ID 或 SQL 使用者,且該金鑰或身分識別無權列出記憶體中的檔案。
  • 存取 Dataverse 資料的用戶沒有在 Dataverse 中查詢數據的許可權。 如果您使用 SQL 使用者,就可能發生此案例。
  • 存取 Delta Lake 的使用者可能無權讀取 Delta Lake 事務歷史記錄。

解決此問題最簡單的方式,就是將您嘗試查詢的記憶體帳戶中的 儲存體 Blob 數據參與者角色授與自己

如需詳細資訊,請參閱

無法列出 Dataverse 數據表的內容

如果您使用適用於 Dataverse 的 Azure Synapse Link 來讀取連結的 DataVerse 數據表,則必須使用 Microsoft Entra 帳戶,使用無伺服器 SQL 集區來存取連結的數據。 如需詳細資訊,請參閱 Azure Synapse Link for Dataverse with Azure Data Lake

如果您嘗試使用 SQL 登入來讀取參考 DataVerse 數據表的外部資料表,您將會收到下列錯誤: External table '???' is not accessible because content of directory cannot be listed.

Dataverse 外部數據表一律使用 Microsoft Entra 傳遞驗證。 您無法將其設定為使用共用存取簽章金鑰工作區受控識別

無法列出 Delta Lake 事務歷史記錄的內容

當無伺服器 SQL 集區無法讀取 Delta Lake 事務歷史記錄資料夾時,會傳回下列錯誤:

Content of directory on path 'https://.....core.windows.net/.../_delta_log/*.json' cannot be listed.

請確定 _delta_log 資料夾存在。 或許您正在查詢未轉換成 Delta Lake 格式的純 Parquet 檔案。 _delta_log如果資料夾存在,請確定您具有基礎 Delta Lake 資料夾的 [讀取] 和 [清單] 許可權。 嘗試使用 FORMAT='csv'直接讀取 json 檔案。 將您的 URI 放在 BULK 參數中:

select top 10 *
from openrowset(BULK 'https://.....core.windows.net/.../_delta_log/*.json',FORMAT='csv', FIELDQUOTE = '0x0b', FIELDTERMINATOR ='0x0b',ROWTERMINATOR = '0x0b')  
with (line varchar(max)) as logs

如果此查詢失敗,呼叫端沒有讀取基礎記憶體檔案的許可權。

查詢執行

在下列情況下,您可能會在查詢執行期間收到錯誤:

查詢失敗,因為因為目前的資源條件約束而無法執行查詢

您的查詢可能會失敗,並出現錯誤訊息:此訊息 This query cannot be executed due to current resource constraints. 表示目前無法執行無伺服器 SQL 集區。 以下是一些疑難解答選項:

查詢逾時終止

如果查詢在無伺服器 SQL 集區上執行超過 30 分鐘,就會傳回錯誤 Query timeout expired 。 無法變更無伺服器 SQL 集區的限制。

  • 套用 最佳做法來嘗試優化查詢。
  • 嘗試使用 建立外部數據表做為 select (CETAS) 來具體化查詢的部分。
  • 檢查是否有在無伺服器 SQL 集區上執行的並行工作負載,因為其他查詢可能會採用資源。 在此情況下,您可以在多個工作區上分割工作負載。

無效的物件名稱

錯誤 Invalid object name 'table name' 表示您使用的物件,例如數據表或檢視表,不存在於無伺服器 SQL 集區資料庫中。 請嘗試這些選項:

  • 列出數據表或檢視表,並檢查物件是否存在。 使用 SQL Server Management Studio 或 Azure Data Studio,因為 Synapse Studio 可能會顯示一些無法在無伺服器 SQL 集區中使用的數據表。

  • 如果您看到 物件,請檢查您是否使用一些區分大小寫/二進位資料庫定序。 也許物件名稱不符合您在查詢中使用的名稱。 使用二進位資料庫定序, Employee 而且 employee 是兩個不同的物件。

  • 如果您沒有看到對象,或許您正嘗試從 Lake 或 Spark 資料庫查詢數據表。 資料表可能無法在無伺服器 SQL 集區中使用,因為:

    • 數據表有一些無法在無伺服器 SQL 集區中表示的數據行類型。
    • 數據表具有無伺服器 SQL 集區不支援的格式。 範例包括 Avro 或 ORC。

字串或二進位數據將被截斷

如果字串或二進位數據行類型(例如 VARCHARVARBINARYNVARCHAR) 的長度比您讀取的數據實際大小短,就會發生此錯誤。 您可以藉由增加資料行類型的長度來修正此錯誤:

  • 如果您的字串資料行定義為類型, VARCHAR(32) 且文字為 60 個字元,請使用 VARCHAR(60) 資料行架構中的類型(或更長)。
  • 如果您使用架構推斷(不含 WITH 架構),則所有字串數據行都會自動定義為 VARCHAR(8000) 類型。 如果您收到此錯誤,請在子句中 WITH 明確定義具有較大 VARCHAR(MAX) 數據行類型的架構,以解決此錯誤。
  • 如果您的數據表位於 Lake 資料庫中,請嘗試增加 Spark 集區中的字串數據行大小。
  • 如果不會影響您的功能,請嘗試 SET ANSI_WARNINGS OFF 讓無伺服器 SQL 集區自動截斷 VARCHAR 值。

字元字串後面未封閉的引號

在罕見的情況下,您可以在字串數據行上使用 LIKE 運算符,或與字串常值進行一些比較,您可能會收到下列錯誤:

Unclosed quotation mark after the character string

如果您在資料行上使用定序, Latin1_General_100_BIN2_UTF8 可能會發生此錯誤。 請嘗試在數據行上設定 Latin1_General_100_CI_AS_SC_UTF8 定序, Latin1_General_100_BIN2_UTF8 而不是定序來解決問題。 如果仍然傳回錯誤,請透過 Azure 入口網站 提出支援要求。

無法配置tempdb空間,同時將數據從一個散發傳送到另一個散發

當查詢執行引擎無法處理數據並在執行查詢的節點之間傳輸時,就會傳回錯誤 Could not allocate tempdb space while transferring data from one distribution to another 。 這是泛型 查詢的特殊案例,因為因為目前的資源條件約束 錯誤而無法執行。 配置給 tempdb 資料庫的資源不足以執行查詢時,就會傳回此錯誤。

在您提出支援票證之前,請先套用最佳做法。

查詢失敗,並處理外部檔案時發生錯誤(已達到錯誤計數上限)

如果您的查詢失敗並出現錯誤訊息 error handling external file: Max errors count reached,表示指定的數據行類型和需要載入的數據不相符。

若要取得錯誤的詳細資訊,以及要檢視的資料列和資料列,請將 剖析器版本從 2.0 變更為 1.0

範例

如果您要使用此查詢 1 查詢檔案names.csv,Azure Synapse 無伺服器 SQL 集區會傳回下列錯誤:例如: Error handling external file: 'Max error count reached'. File/External table name: [filepath].

names.csv檔案包含:

Id,first name,  
1, Adam
2,Bob
3,Charles
4,David
5,Eva

查詢 1:

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='2.0',
       FIELDTERMINATOR =';',
       FIRSTROW = 2
    )  
    WITH (
    [ID] SMALLINT,  
    [Text] VARCHAR (1) COLLATE Latin1_General_BIN2  
)

    AS [result]

原因

剖析器版本從 2.0 版變更為 1.0 之後,錯誤訊息就會協助找出問題。 新的錯誤訊息現在是 Bulk load data conversion error (truncation) for row 1, column 2 (Text) in data file [filepath].

截斷會告訴您數據行類型太小,無法符合您的數據。 此 names.csv 檔案中最長的名字有七個字元。 要使用的根據數據類型至少應為 VARCHAR(7)。 錯誤是由這一行程式代碼所造成:

    [Text] VARCHAR (1) COLLATE Latin1_General_BIN2

變更查詢會據此解決錯誤。 偵錯之後,再次將剖析器版本變更為 2.0,以達到最大效能。

如需何時使用哪個剖析器版本的詳細資訊,請參閱 在 Synapse Analytics 中使用無伺服器 SQL 集區使用 OPENROWSET。

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='2.0',
        FIELDTERMINATOR =';',
        FIRSTROW = 2
    )  
    WITH (
    [ID] SMALLINT,  
    [Text] VARCHAR (7) COLLATE Latin1_General_BIN2  
)

    AS [result]

無法大量載入,因為無法開啟檔案

如果在查詢執行期間修改檔案,則會傳回錯誤 Cannot bulk load because the file could not be opened 。 通常,您可能會收到類似的錯誤 Cannot bulk load because the file {file path} could not be opened. Operating system error code 12. (The access code is invalid.)

無伺服器 SQL 集區無法讀取查詢執行時正在修改的檔案。 查詢無法鎖定檔案。 如果您知道修改作業已 附加,您可以嘗試設定下列選項: {"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}

如需詳細資訊,請參閱如何 查詢僅限附加檔案 ,或在 僅限附加檔案上建立數據表。

查詢失敗,數據轉換錯誤

您的查詢可能會失敗,並出現錯誤訊息:此訊息 Bulk load data conversion error (type mismatches or invalid character for the specified code page) for row n, column m [columnname] in the data file [filepath]. 表示數據類型不符合數據列號 n 和數據行 m 的實際數據。

例如,如果您只預期數據中有整數,但在數據列 n 中有字串,則此錯誤訊息就是您將得到的錯誤訊息。

若要解決此問題,請檢查檔案和您選擇的數據類型。 也請檢查數據列分隔符和字段終止符設定是否正確。 下列範例示範如何使用 VARCHAR 做為數據行類型來完成檢查。

如需欄位終止符、數據列分隔符和逸出引號字元的詳細資訊,請參閱 查詢 CSV 檔案

範例

如果您要查詢檔案 names.csv

Id, first name,  
1,Adam
2,Bob
3,Charles
4,David
five,Eva

使用下列查詢:

查詢 1:

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='1.0',
       FIELDTERMINATOR =',',
       FIRSTROW = 2
    )  
    WITH (
    [ID] SMALLINT,  
    [Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2  
)

    AS [result]

Azure Synapse 無伺服器 SQL 集區傳回錯誤 Bulk load data conversion error (type mismatch or invalid character for the specified code page) for row 6, column 1 (ID) in data file [filepath].

您必須瀏覽數據,並做出明智的決策來處理此問題。 若要查看造成此問題的數據,必須先變更數據類型。 VARCHAR(100) 現在用來分析此問題,而不是使用SMALLINT資料類型查詢標識碼數據行。

有了這個稍微變更的查詢 2,現在可以處理數據以傳回名稱清單。

查詢 2:

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='1.0',
       FIELDTERMINATOR =',',
       FIRSTROW = 2
    )  
    WITH (
    [ID] VARCHAR(100),  
    [Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2  
)

    AS [result]

您可能會發現數據在第五個數據列中有未預期的識別碼值。 在這種情況下,請務必與數據的企業擁有者一致,以就如何避免這類損毀的數據達成一致。 如果應用層級無法預防,合理大小的 VARCHAR 可能是這裡唯一的選項。

提示

盡量縮短 VARCHAR()。 盡可能避免 VARCHAR(MAX),因為它可能會損害效能。

查詢結果看起來未如預期般

您的查詢可能不會失敗,但您可能會看到結果集未如預期般運作。 產生的數據行可能是空的,或可能會傳回非預期的數據。 在此案例中,數據列分隔符或字段終止符可能選擇不正確。

若要解決此問題,請再查看數據並變更這些設定。 偵錯此查詢很簡單,如下列範例所示。

範例

如果您想要在查詢 1 中使用查詢查詢檔案 names.csv ,Azure Synapse 無伺服器 SQL 集區會傳回結果看起來奇怪:

names.csv 中:

Id,first name,  
1, Adam
2, Bob
3, Charles
4, David
5, Eva
SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='1.0',
       FIELDTERMINATOR =';',
       FIRSTROW = 2
    )  
    WITH (
    [ID] VARCHAR(100),  
    [Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2  
)

    AS [result]
| ID            |   Firstname   |  
| ------------- |-------------  |  
| 1,Adam        | NULL |  
| 2,Bob         | NULL |  
| 3,Charles     | NULL |  
| 4,David       | NULL |  
| 5,Eva         | NULL |

數據行 Firstname中似乎沒有任何值。 相反地,所有值最終都位於 數據行中 ID 。 這些值是以逗號分隔。 此問題是由這行程式代碼所造成,因為必須選擇逗號,而不是以分號符號做為欄位終止符:

FIELDTERMINATOR =';',

變更此單一字元可解決問題:

FIELDTERMINATOR =',',

查詢 2 所建立的結果集現在看起來會如預期般:

查詢 2:

SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK '[FILE-PATH OF CSV FILE]',
        FORMAT = 'CSV',
        PARSER_VERSION='1.0',
       FIELDTERMINATOR =',',
       FIRSTROW = 2
    )  
    WITH (
    [ID] VARCHAR(100),  
    [Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2  
)

    AS [result]

傳回:

| ID            | Firstname   |  
| ------------- |-------------  |  
| 1             | Adam |  
| 2             | Bob |  
| 3             | Charles |  
| 4             | David |  
| 5             | Eva |

類型的數據行與外部數據類型不相容

如果您的查詢失敗,並出現錯誤訊息 Column [column-name] of type [type-name] is not compatible with external data type […], ,則 PARQUET 數據類型可能對應至不正確的 SQL 資料類型。

例如,如果您的 Parquet 檔案具有具有浮點數的數據行價格(例如 12.89),且您嘗試將它對應至 INT,則此錯誤訊息就是您會收到的錯誤訊息。

若要解決此問題,請檢查檔案和您選擇的數據類型。 此 對應數據表 有助於選擇正確的 SQL 資料類型。 最佳做法是,只針對會解析為 VARCHAR 數據類型的數據行指定對應。 盡可能避免 VARCHAR 會導致查詢的效能更好。

範例

如果您想要使用此查詢 1 查詢檔案 taxi-data.parquet ,Azure Synapse 無伺服器 SQL 集區會傳回下列錯誤:

taxi-data.parquet檔案包含:

|PassengerCount |SumTripDistance|AvgTripDistance |
|---------------|---------------|----------------|
| 1 | 2635668.66000064 | 6.72731710678951 |
| 2 | 172174.330000005 | 2.97915543404919 |
| 3 | 296384.390000011 | 2.8991352022851  |
| 4 | 12544348.58999806| 6.30581582240281 |
| 5 | 13091570.2799993 | 111.065989028627 |

查詢 1:

SELECT
    *
FROM
    OPENROWSET(
        BULK '<filepath>taxi-data.parquet',
        FORMAT='PARQUET'
    )  WITh
        (
        PassengerCount INT,  
        SumTripDistance INT,  
        AVGTripDistance FLOAT
        )

    AS [result]

Column 'SumTripDistance' of type 'INT' is not compatible with external data type 'Parquet physical type: DOUBLE', please try with 'FLOAT'. File/External table name: '<filepath>taxi-data.parquet'.

此錯誤訊息會告訴您數據類型不相容,並提供使用 FLOAT 而非 INT 的建議。 錯誤是由這一行程式代碼所造成:

SumTripDistance INT,

有了這個稍微變更的查詢 2,現在可以處理數據,並顯示這三個數據行:

查詢 2:

SELECT
    *
FROM
    OPENROWSET(
        BULK '<filepath>taxi-data.parquet',
        FORMAT='PARQUET'
    )  WITh
        (
        PassengerCount INT,  
        SumTripDistance FLOAT,  
        AVGTripDistance FLOAT
        )

    AS [result]

查詢參考分散式處理模式不支持的物件

錯誤The query references an object that is not supported in distributed processing mode表示您在查詢 Azure 儲存體 或 Azure Cosmos DB 分析記憶體中的數據時無法使用的物件或函式。

當您查詢儲存在 Azure Data Lake 或 Azure Cosmos DB 分析記憶體中的數據時,無法使用某些物件,例如系統檢視和函式。 請避免使用將外部數據與系統檢視聯結的查詢、在臨時表中載入外部數據,或使用某些安全性或元數據函式來篩選外部數據。

WaitIOCompletion 呼叫失敗

錯誤訊息 WaitIOCompletion call failed 指出查詢在等候完成從遠端記憶體 Azure Data Lake 讀取資料的 I/O 作業時失敗。

錯誤訊息具有下列模式: Error handling external file: 'WaitIOCompletion call failed. HRESULT = ???'. File/External table name...

請確定您的記憶體位於與無伺服器 SQL 集區相同的區域中。 檢查記憶體計量,並確認儲存層上沒有其他工作負載,例如上傳可能會使I/O要求飽和的新檔案。

欄位 HRESULT 包含結果碼。 下列錯誤碼是最常見的錯誤碼及其潛在解決方案。

此錯誤碼表示來源檔案不在記憶體中。

發生此錯誤碼的原因如下:

  • 另一個應用程式已刪除該檔案。
    • 在此常見案例中,查詢執行會啟動,它會列舉檔案,並找到檔案。 稍後,在查詢執行期間,會刪除檔案。 例如,Databricks、Spark 或 Azure Data Factory 可能會刪除它。 查詢失敗,因為找不到檔案。
  • 此問題也可能以 Delta 格式發生。 查詢可能會在重試時成功,因為有新版本的數據表,而且不會再次查詢已刪除的檔案。
  • 快取無效的執行計劃。
    • 暫時的緩解措施為執行命令 DBCC FREEPROCCACHE。 如果問題持續發生,請建立支援票證。

NOT 附近的語法不正確

錯誤 Incorrect syntax near 'NOT' 指出有一些外部數據表的數據行包含數據行定義中的NOT NULL條件約束。

  • 更新數據表,以從數據行定義中移除 NOT NULL。
  • 此錯誤有時也會在從 CETAS 語句建立的數據表時暫時發生。 如果問題無法解決,您可以嘗試卸除並重新建立外部數據表。

數據分割數據行會傳回NULL值

如果您的查詢傳回 NULL 值,而不是分割數據行,或找不到資料分割數據行,您有幾個可能的疑難解答步驟:

  • 如果您使用資料表來查詢資料分割數據集,請注意資料表不支援數據分割。 將數據表取代為 數據分割檢視表。
  • 如果您使用數據分割檢視搭配使用 FILEPATH() 函式查詢分割檔案的 OPENROWSET,請確定您已在位置正確指定通配符模式,並使用適當的索引來參考通配符。
  • 如果您要直接在分割資料夾中查詢檔案,請注意分割數據行不是檔案資料行的元件。 分割值會放在資料夾路徑中,而不是檔案。 基於這個理由,檔案不包含數據分割值。

DATETIME2失敗的數據行類型插入批次值

錯誤 Inserting value to batch for column type DATETIME2 failed 表示無伺服器集區無法從基礎檔案讀取日期值。 儲存在 Parquet 或 Delta Lake 檔案中的 datetime 值無法表示為數據 DATETIME2 行。

使用Spark檢查檔案中的最小值,並檢查某些日期是否小於 0001-01-03。 如果您使用 Spark 2.4(不支援的運行時間版本)版本或仍然使用舊版 datetime 儲存格式的較高 Spark 版本來儲存盤案,則之前的日期時間值是使用與無伺服器 SQL 集區中使用的 Proleptic 公曆不一致的 Julian 行事曆所撰寫。

朱利安行事歷可能會有兩天的差異,用來在 Parquet 中寫入值(在某些 Spark 版本中),以及無伺服器 SQL 集區中使用的親歷公曆。 此差異可能會導致轉換成負日期值,這無效。

嘗試使用 Spark 來更新這些值,因為它們被視為 SQL 中的無效日期值。 下列範例示範如何在 Delta Lake 中將 SQL 日期範圍外的值更新為 NULL:

from delta.tables import *
from pyspark.sql.functions import *

deltaTable = DeltaTable.forPath(spark,  
             "abfss://my-container@myaccount.dfs.core.windows.net/delta-lake-data-set")
deltaTable.update(col("MyDateTimeColumn") < '0001-02-02', { "MyDateTimeColumn": null } )

這項變更會移除無法表示的值。 其他日期值可能已正確載入,但未正確表示,因為朱利安和職業公曆之間仍有差異。 如果您使用 Spark 3.0 或較舊版本,您甚至可能會看到之前 1900-01-01 日期未預期的日期班次。

請考慮 移轉至 Spark 3.1 或更新版本 ,並切換至職業公曆。 最新的 Spark 版本預設會使用與無伺服器 SQL 集區中行事曆一致的 Proleptic Gregorian 行事曆。 使用較高版本的 Spark 重載舊版數據,並使用下列設定來更正日期:

spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite", "CORRECTED")

查詢失敗,因為拓撲變更或計算容器失敗

此錯誤可能表示在無伺服器 SQL 集區中發生一些內部進程問題。 請提出支援票證,其中包含可協助 Azure 支援 小組調查問題的所有必要詳細數據。

描述與一般工作負載相比可能不尋常的任何專案。 例如,在發生此錯誤之前,可能有大量的並行要求或特殊工作負載或查詢開始執行。

通配符擴充逾時

如查詢資料夾和多個檔案一節所述,無伺服器 SQL 集區支援使用通配符讀取多個檔案/資料夾。 每個查詢的最大限制為 10 個萬用字元。 您必須知道這項功能會付出代價。 無伺服器集區需要時間列出符合通配符的所有檔案。 這會導致延遲,而且如果您嘗試查詢的檔案數目很高,則此延遲可能會增加。 在這裡情況下,您可以遇到下列錯誤:

"Wildcard expansion timed out after X seconds." 

您可以執行數個風險降低步驟來避免此問題:

  • 套用最佳做法無伺服器 SQL 集區中所述的最佳做法。
  • 將檔案壓縮成較大的檔案,嘗試減少您嘗試查詢的檔案數目。 請嘗試將您的檔案大小保持在 100MB 以上。
  • 請確定盡可能使用資料分割資料行的篩選。
  • 如果您使用差異檔案格式,請使用 Spark 中的優化寫入功能。 這可藉由減少需要讀取和處理的數據量,來改善查詢的效能。 如何在 Apache Spark 上使用優化寫入中所述
  • 若要避免某些最上層通配符,請有效地硬式編碼數據分割數據行上的隱含篩選使用 動態 SQL

使用自動架構推斷時遺漏數據行

您可以省略 WITH 子句,輕鬆地查詢檔案,而不需知道或指定架構。 在此情況下,數據行名稱和數據類型將會從檔案推斷。 請記住,如果您要一次讀取檔案數目,則會從第一個檔案服務推斷架構從記憶體取得。 這可能表示會省略某些預期的數據行,全部是因為服務用來定義架構的檔案不包含這些數據行。 若要明確指定架構,請使用 OPENROWSET WITH 子句。 如果您指定架構(使用外部資料表或 OPENROWSET WITH 子句)預設的 lax 路徑模式將會使用。 這表示某些檔案中不存在的數據行會以 NULL 傳回(針對這些檔案的數據列)。 若要了解路徑模式的使用方式,請檢查下列檔和範例

組態

無伺服器 SQL 集區可讓您使用 T-SQL 來設定資料庫物件。 有一些條件約束:

  • 您無法在 masterlakehouse 或 Spark 資料庫中建立物件。
  • 您必須擁有主要金鑰才能建立認證。
  • 您必須具有參考物件中所使用資料的許可權。

無法建立資料庫

如果您收到錯誤 CREATE DATABASE failed. User database limit has been already reached.,則您已建立一個工作區中支援的最大資料庫數目。 如需詳細資訊,請參閱條件約束

  • 如果您需要分隔物件,請使用資料庫內的架構。
  • 如果您需要參考 Azure Data Lake Storage,請建立將在無伺服器 SQL 集區中同步處理的 Lakehouse 資料庫或 Spark 資料庫。

建立或改變數據表失敗,因為最小數據列大小超過允許的數據表數據列大小上限 8060 個字節

任何數據表每個數據列最多可以有 8KB 大小(不包括非數據列 VARCHAR(MAX)/VARBINARY(MAX) 數據)。 如果您建立一個數據表,其中數據列中儲存格的總大小超過 8060 個字節,您會收到下列錯誤:

Msg 1701, Level 16, State 1, Line 3
Creating or altering table '<table name>' failed because the minimum row size would be <???>,
including <???> bytes of internal overhead.
This exceeds the maximum allowable table row size of 8060 bytes.

如果您建立的數據行大小超過 8060 位元組的 Spark 數據表,而且無伺服器 SQL 集區無法建立參考 Spark 數據表數據的數據表,則 Lake 資料庫中也可能發生此錯誤。

作為緩和措施,請避免使用之類的 CHAR(N) 固定大小類型,並以可變大小 VARCHAR(N) 類型取代它們,或減少 中的 CHAR(N)大小。 請參閱 SQL Server 中的 8KB 數據列群組限制。

在執行這項作業之前,請先在資料庫中建立主要密鑰,或在會話中開啟主要密鑰

如果您的查詢失敗並出現錯誤訊息 Please create a master key in the database or open the master key in the session before performing this operation.,表示您的用戶資料庫目前無法存取主要密鑰。

您很可能已建立新的用戶資料庫,但尚未建立主要密鑰。

若要解決此問題,請使用下列查詢建立主要密鑰:

CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='strongpasswordhere' ];

注意

將取代 'strongpasswordhere' 為此處的不同秘密。

master 資料庫中不支援 CREATE 語句

如果您的查詢失敗並出現錯誤訊息 Failed to execute query. Error: CREATE EXTERNAL TABLE/DATA SOURCE/DATABASE SCOPED CREDENTIAL/FILE FORMAT is not supported in master database.,表示 master 無伺服器 SQL 集區中的資料庫不支援建立:

  • 外部數據表。
  • 外部數據源。
  • 資料庫範圍認證。
  • 外部檔案格式。

以下是解決方案:

  1. 建立使用者資料庫:

    CREATE DATABASE <DATABASE_NAME>
    
  2. 在先前針對master資料庫失敗的 <DATABASE_NAME> 內容中執行 CREATE 語句。

    以下是建立外部檔案格式的範例:

    USE <DATABASE_NAME>
    CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat]  
    WITH ( FORMAT_TYPE = PARQUET)
    

無法建立 Microsoft Entra 登入或使用者

如果您在嘗試在資料庫中建立新的 Microsoft Entra 登入或使用者時收到錯誤,請檢查您用來連線到資料庫的登入。 嘗試建立新 Microsoft Entra 使用者的登入必須具有存取 Microsoft Entra 網域的許可權,並檢查使用者是否存在。 請注意:

  • SQL 登入沒有此許可權,因此如果您使用 SQL 驗證,您一律會收到此錯誤。
  • 如果您使用 Microsoft Entra 登入來建立新的登入,請檢查您是否有權存取 Microsoft Entra 網域。

Azure Cosmos DB

無伺服器 SQL 集區可讓您使用 OPENROWSET 函式來查詢 Azure Cosmos DB 分析記憶體。 請確定您的 Azure Cosmos DB 容器具有分析記憶體。 請確定您已正確指定帳戶、資料庫和容器名稱。 此外,請確定您的 Azure Cosmos DB 帳戶密鑰有效。 如需詳細資訊,請參閱必要條件

無法使用 OPENROWSET 函式查詢 Azure Cosmos DB

如果您無法連線到 Azure Cosmos DB 帳戶,請查看 必要條件。 下表列出可能的錯誤和疑難解答動作。

錯誤 根本原因
語法錯誤:
- 附近的 OPENROWSET語法不正確。
- ... 不是可辨識的 BULK OPENROWSET 提供者選項。
- 附近的 ...語法不正確。
可能的根本原因:
- 不使用 Azure Cosmos DB 作為第一個參數。
- 使用字串常值,而不是第三個參數中的標識碼。
- 未指定第三個參數 (容器名稱)。
Azure Cosmos DB 連接字串 發生錯誤。 - 未指定帳戶、資料庫或金鑰。
- 無法辨識 連接字串 中的選項。
- 分號 (;) 放在 連接字串 的結尾。
解決 Azure Cosmos DB 路徑失敗,錯誤為「不正確的帳戶名稱」或「不正確的資料庫名稱」。 找不到指定的帳戶名稱、資料庫名稱或容器,或尚未對指定的集合啟用分析記憶體。
解決 Azure Cosmos DB 路徑失敗,錯誤為「不正確的秘密值」或「秘密為 Null 或空白」。 帳戶金鑰無效或遺失。

讀取 Azure Cosmos DB 字串類型時,會傳回 UTF-8 定序警告

如果數據行定序沒有UTF-8編碼, OPENROWSET 無伺服器SQL集區會傳回編譯時期警告。 您可以使用 T-SQL 語句,輕鬆變更目前資料庫中執行之所有 OPENROWSET 函式的預設順序:

ALTER DATABASE CURRENT COLLATE Latin1_General_100_CI_AS_SC_UTF8;

使用字串述詞篩選您的資料時,Latin1_General_100_BIN2_UTF8 定序可提供最佳效能。

Azure Cosmos DB 分析存放區中遺漏的數據列

函式可能不會傳 OPENROWSET 回來自 Azure Cosmos DB 的某些專案。 請注意:

  • 交易和分析存放區之間有同步處理延遲。 您在 Azure Cosmos DB 交易存放區中輸入的檔案可能會在兩到三分鐘之後出現在分析存放區中。
  • 檔可能會違反某些 架構條件約束

查詢會傳回某些 Azure Cosmos DB 專案中的 NULL 值

Azure Synapse SQL 會傳回 NULL,而不是您在交易存放區中看到的值,在下列案例中:

  • 交易和分析存放區之間有同步處理延遲。 您在 Azure Cosmos DB 交易存放區中輸入的值可能會在兩到三分鐘之後出現在分析存放區中。
  • WITH 子句中可能有錯誤的數據行名稱或路徑表達式。 WITH 子句中的數據行名稱(或數據行類型之後的路徑表達式)必須符合 Azure Cosmos DB 集合中的屬性名稱。 比較會區分大小寫。 例如, productCodeProductCode 是不同的屬性。 請確定您的資料行名稱完全符合 Azure Cosmos DB 屬性名稱。
  • 屬性可能不會移至分析記憶體,因為它違反某些 架構條件約束,例如超過1,000個屬性或超過127個巢狀層級。
  • 如果您使用定義 完善的架構表示法,交易存放區中的值可能會有錯誤的類型。 定義完善的架構會藉由取樣文件來鎖定每個屬性的類型。 交易式存放區中任何與類型不相符的值都會被視為錯誤值,而不會移轉至分析存放區。
  • 如果您使用完整逼真度 架構表示法,請確定您要在屬性名稱之後新增類型後綴,例如 $.price.int64。 如果您沒有看到參考路徑的值,可能是儲存在不同的類型路徑下,例如 $.price.float64 如需詳細資訊,請參閱 在完整逼真度架構中查詢 Azure Cosmos DB 集合。

數據行與外部數據類型不相容

如果WITH子句中的指定資料行類型不符合 Azure Cosmos DB 容器中的類型,則會傳回錯誤 Column 'column name' of the type 'type name' is not compatible with the external data type 'type name'. 。 請嘗試將 Azure Cosmos DB 一節 所述的數據行類型變更為 SQL 類型對應 或使用 VARCHAR 類型。

解決:Azure Cosmos DB 路徑失敗,發生錯誤

如果您收到錯誤 Resolving Azure Cosmos DB path has failed with error 'This request is not authorized to perform this operation'. 檢查,以查看您是否在 Azure Cosmos DB 中使用私人端點。 若要允許無伺服器 SQL 集區存取具有私人端點的分析存放區,您必須 為 Azure Cosmos DB 分析存放區設定私人端點。

Azure Cosmos DB 效能問題

如果您遇到一些非預期的效能問題,請確定您已套用最佳做法,例如:

Delta Lake

您可以在無伺服器 SQL 集區中的 Delta Lake 支援中看到一些限制:

  • 請確定您是在 OPENROWSET 函式或外部資料表位置中參考根 Delta Lake 資料夾。
    • 根資料夾必須有名為 _delta_log的子資料夾。 如果沒有資料夾,查詢就會 _delta_log 失敗。 如果您沒有看到該資料夾,您會參考必須使用 Apache Spark 集區轉換成 Delta Lake 的純 Parquet 檔案。
    • 請勿指定通配符來描述數據分割架構。 Delta Lake 查詢會自動識別 Delta Lake 數據分割。
  • 在 Apache Spark 集區中建立的 Delta Lake 數據表會自動在無伺服器 SQL 集區中使用,但架構不會更新(公開預覽限制)。 如果您使用 Spark 集區在 Delta 資料表中新增資料行,則不會在無伺服器 SQL 集區資料庫中顯示變更。
  • 外部數據表不支持數據分割。 使用 Delta Lake 資料夾中的分割檢視 來使用分割區刪除。 請參閱本文稍後的已知問題和因應措施。
  • 無伺服器 SQL 集區不支援時間移動查詢。 使用 Synapse Analytics 中的 Apache Spark 集區來 讀取歷程記錄數據
  • 無伺服器 SQL 集區不支援更新 Delta Lake 檔案。 您可以使用無伺服器 SQL 集區來查詢最新版的 Delta Lake。 使用 Synapse Analytics 中的 Apache Spark 集區來 更新 Delta Lake
  • Synapse Analytics 中的無伺服器 SQL 集區與差異讀取器第 1 版相容。 無伺服器 SQL 集區不支援需要第 2 版或更新版本之 Delta 讀取器(例如 數據行對應)的 Delta 功能。
  • Synapse Analytics 中的無伺服器 SQL 集區不支援使用 BLOOM 篩選器數據集。 無伺服器 SQL 集區會忽略 BLOOM 篩選器。
  • 在專用 SQL 集區中無法使用 Delta Lake 支援。 請確定您使用無伺服器 SQL 集區來查詢 Delta Lake 檔案。
  • 如需無伺服器 SQL 集區已知問題的詳細資訊,請參閱 Azure Synapse Analytics 已知問題

不支援 Delta 資料表中的數據行重新命名

無伺服器 SQL 集區不支援使用 重新命名的數據行查詢 Delta Lake 數據表。 無伺服器 SQL 集區無法從重新命名的數據行讀取數據。

Delta 數據表中的數據行值為 NULL

如果您使用需要差異讀取器第 2 版或更高版本的 Delta 數據集,並使用第 1 版不支援的功能(例如-重新命名數據行、卸除數據行或數據行對應),則可能不會顯示參考數據行中的值。

JSON 文字格式不正確

此錯誤表示無伺服器 SQL 集區無法讀取 Delta Lake 事務歷史記錄。 您可能會看到下列錯誤:

Msg 13609, Level 16, State 4, Line 1
JSON text is not properly formatted. Unexpected character '' is found at position 263934.
Msg 16513, Level 16, State 0, Line 1
Error reading external metadata.

請確定您的 Delta Lake 數據集未損毀。 使用 Azure Synapse 中的 Apache Spark 集區,確認您可以讀取 Delta Lake 資料夾的內容。 如此一來,您將確保 _delta_log 檔案未損毀。

因應措施

嘗試使用 Apache Spark 集區在 Delta Lake 數據集上建立檢查點,然後重新執行查詢。 檢查點會匯總事務 JSON 記錄檔,並可能解決此問題。

如果數據集有效, 請建立支援票證 並提供詳細資訊:

  • 請勿進行任何變更,例如新增或移除數據行或優化數據表,因為這項作業可能會變更 Delta Lake 事務歷史記錄檔的狀態。
  • 將資料夾的內容 _delta_log 複製到新的空白資料夾。 請勿 複製 .parquet data 檔案。
  • 嘗試讀取您在新資料夾中複製的內容,並確認您收到相同的錯誤。
  • 將複製_delta_log檔案的內容傳送至 Azure 支援。

現在您可以繼續使用 Delta Lake 資料夾搭配 Spark 集區。 如果您允許共用這項資訊,您將會提供複製的數據給 Microsoft 支援。 Azure 小組會調查檔案的內容 delta_log ,並提供可能錯誤和因應措施的詳細資訊。

解決差異記錄失敗

下列錯誤指出無伺服器 SQL 集區無法解析差異記錄:Resolving Delta logs on path '%ls' failed with error: Cannot parse json object from log folder.最常見的原因是last_checkpoint_file,由於 checkpointSchema Spark 3.3 中新增的欄位,資料夾中_delta_log的位元組大於 200 個字節。

有兩個選項可用來規避此錯誤:

  • 在Spark筆記本中修改適當的設定並產生新的檢查點,以便 last_checkpoint_file 重新建立。 如果您使用 Azure Databricks,組態修改如下: spark.conf.set("spark.databricks.delta.checkpointSchema.writeThresholdLength", 0);
  • 降級至Spark 3.2.1。

我們的工程小組目前正在為Spark 3.3提供完整支援。

在Spark中建立的差異數據表不會顯示在無伺服器集區中

注意

在 Spark 中建立的差異數據表複寫仍處於公開預覽狀態。

如果您在 Spark 中建立 Delta 數據表,而且未顯示在無伺服器 SQL 集區中,請檢查下列專案:

  • 等候一段時間 (通常是 30 秒),因為 Spark 數據表會與延遲同步處理。
  • 如果數據表在一段時間后未出現在無伺服器 SQL 集區中,請檢查 Spark Delta 資料表的架構。 無法使用具有複雜類型的 Spark 資料表或無伺服器中不支援的類型。 嘗試在 Lake 資料庫中建立具有相同架構的 Spark Parquet 數據表,並檢查該數據表是否會出現在無伺服器 SQL 集區中。
  • 檢查數據表所參考的工作區受控識別存取 Delta Lake 資料夾。 無伺服器 SQL 集區會使用工作區受控識別從記憶體取得數據表數據行資訊,以建立數據表。

Lake 資料庫

使用 Spark 或 Synapse 設計工具建立的 Lake 資料庫數據表會自動在無伺服器 SQL 集區中提供查詢。 您可以使用無伺服器 SQL 集區來查詢使用 Spark 集區建立的 Parquet、CSV 和 Delta Lake 數據表,並將其他架構、檢視、程式、數據表值函式,以及角色中的 db_datareader Microsoft Entra 使用者新增至您的 Lake 資料庫。 可能的問題列於本節中。

在 Spark 中建立的數據表無法在無伺服器集區中使用

建立的數據表可能無法立即在無伺服器 SQL 集區中使用。

  • 數據表將會在無伺服器集區中使用,但會有一些延遲。 在Spark中建立資料表之後,您可能需要等候5-10分鐘,才能在無伺服器 SQL 集區中看到資料表。
  • 只有參考 Parquet、CSV 和 Delta 格式的數據表可在無伺服器 SQL 集區中使用。 其他數據表類型無法使用。
  • 數據表,包含某些 不支持的數據行類型 將無法在無伺服器 SQL 集區中使用。
  • 存取 Lake 資料庫中的 Delta Lake 數據表處於 公開預覽狀態。 檢查本節或 Delta Lake 區段中所列的其他問題。

在Spark中建立的外部資料表在無伺服器集區中顯示非預期的結果

可能發生來源 Spark 外部資料表與無伺服器集區上複寫的外部資料表不符的情況。 如果用來建立Spark外部數據表的檔案沒有延伸模組,就可能發生此情況。 若要取得適當的結果,請確定所有檔案都有擴展名,例如 .parquet。

複寫的資料庫不允許作業

如果您嘗試修改 Lake 資料庫、建立外部數據表、外部數據源、資料庫範圍認證或 Lake 資料庫中的其他物件,就會傳回此錯誤。 這些物件只能在 SQL 資料庫上建立。

Lake 資料庫會從 Apache Spark 集區複寫,並由 Apache Spark 管理。 因此,您無法使用 T-SQL 語言,在 SQL 資料庫 中建立物件。

Lake 資料庫中只允許下列作業:

  • 在以外的dbo架構中建立、卸除或改變檢視、程式和內嵌數據表值函式 (iTVF)。
  • 從 Microsoft Entra 識別碼建立和卸除資料庫使用者。
  • db_datareader 架構新增或移除資料庫使用者。

Lake 資料庫中不允許其他作業。

注意

如果您要在架構中 dbo 建立檢視、程式或函式(或省略架構,並使用通常 dbo的默認架構),您會收到錯誤訊息。

無伺服器 SQL 集區中無法使用 Lake 資料庫中的差異資料表

請確定工作區受控識別在包含 Delta 資料夾的 ADLS 記憶體上具有讀取許可權。 無伺服器 SQL 集區會從放置在 ADLS 中的 Delta 記錄讀取 Delta Lake 數據表架構,並使用工作區受控識別來存取 Delta 事務歷史記錄。

嘗試在參考 Azure Data Lake 記憶體的一些 SQL 資料庫 中使用受控識別認證來設定數據源,並嘗試使用受控識別在數據源上建立外部數據表,以確認具有受控識別的數據表可以存取您的記憶體。

Lake 資料庫中的差異數據表在 Spark 和無伺服器集區中沒有相同的架構

無伺服器 SQL 集區可讓您存取使用 Spark 或 Synapse 設計工具在 Lake 資料庫中建立的 Parquet、CSV 和 Delta 數據表。 存取 Delta 數據表仍處於公開預覽狀態,目前無伺服器會在建立時同步處理 Delta 數據表與 Spark,但如果稍後在 Spark 中使用 ALTER TABLE 語句新增數據行,就不會更新架構。

這是公開預覽限制。 卸除並重新建立 Spark 中的 Delta 資料表(如果可能的話),而不是改變數據表來解決此問題。

效能

無伺服器 SQL 集區會根據資料集的大小和查詢複雜度,將資源指派給查詢。 您無法變更或限制提供給查詢的資源。 在某些情況下,您可能會遇到非預期的查詢效能降低,而且您可能必須識別根本原因。

查詢持續時間很長

如果您有查詢持續時間超過 30 分鐘的查詢,則查詢會緩慢地將結果傳回給用戶端。 無伺服器 SQL 集區有 30 分鐘的執行限制。 任何時間都花在結果串流上。 請嘗試下列因應措施:

  • 如果您使用 Synapse Studio,請嘗試重現一些其他應用程式的問題,例如 SQL Server Management Studio 或 Azure Data Studio。
  • 如果使用 SQL Server Management Studio、Azure Data Studio、Power BI 或其他應用程式來執行查詢速度緩慢,請檢查網路問題和最佳做法。
  • 將查詢放在 CETAS 命令中,並測量查詢持續時間。 CETAS 命令會將結果儲存至 Azure Data Lake 儲存體,且不相依於用戶端連線。 如果 CETAS 命令完成的速度比原始查詢快,請檢查用戶端與無伺服器 SQL 集區之間的網路頻寬。

使用 Synapse Studio 執行查詢的速度很慢

如果您使用 Synapse Studio,請嘗試使用桌面用戶端,例如 SQL Server Management Studio 或 Azure Data Studio。 Synapse Studio 是使用 HTTP 通訊協定連線到無伺服器 SQL 集區的 Web 用戶端,通常比 SQL Server Management Studio 或 Azure Data Studio 中使用的原生 SQL 連線慢。

使用應用程式執行查詢時速度很慢

如果您遇到查詢執行緩慢的問題,請檢查下列問題:

  • 請確定用戶端應用程式與無伺服器 SQL 集區端點共置。 跨區域執行查詢可能會導致額外的延遲和結果集的串流速度變慢。
  • 請確定您沒有可能導致結果集串流緩慢的網路問題
  • 請確定用戶端應用程式有足夠的資源(例如,不使用 100% CPU)。
  • 請確定記憶體帳戶或 Azure Cosmos DB 分析記憶體位於與無伺服器 SQL 端點相同的區域中。

請參閱共置資源的最佳做法

查詢持續時間的高變化

如果您要在查詢持續時間中執行相同的查詢和觀察變化,有幾個原因可能會導致此行為:

  • 檢查這是第一次執行查詢。 查詢的第一次執行會收集建立計劃所需的統計數據。 系統會藉由掃描基礎檔案來收集統計數據,並可能會增加查詢持續時間。 在 Synapse Studio 中,您會在 SQL 要求清單中看到在查詢之前執行的「全域統計數據建立」查詢。
  • 統計數據可能會在一段時間後過期。 您可能會定期觀察對效能的影響,因為無伺服器集區必須掃描和重建統計數據。 您可能會注意到 SQL 要求清單中在查詢之前執行的另一個「全域統計數據建立」查詢。
  • 檢查當您以較長的持續時間執行查詢時,是否有一些工作負載在相同的端點上執行。 無伺服器 SQL 端點會將資源平均配置給平行執行的所有查詢,而且查詢可能會延遲。

連線

無伺服器 SQL 集區可讓您使用 TDS 通訊協定,以及使用 T-SQL 語言來查詢數據來連線。 大部分可以連線到 SQL Server 或 Azure SQL 資料庫 的工具也可以連線到無伺服器 SQL 集區。

SQL 集區正在升溫

在較長的無活動期間之後,將會停用無伺服器 SQL 集區。 第一個活動會自動啟用,例如第一次連線嘗試。 啟用程序所需的時間可能會比單一連線嘗試間隔長,因此會顯示錯誤訊息。 重試連線嘗試應該已足夠。

最佳做法是,針對支援的用戶端,請使用 連線 ionRetryCount 和 連線 RetryInterval 連接字串 關鍵詞來控制重新連線行為。

如果錯誤訊息持續發生,請透過 Azure 入口網站 提出支援票證。

無法從 Synapse Studio 連線

請參閱 Synapse Studio 一節

無法從工具連線到 Azure Synapse 集區

某些工具可能沒有明確的選項,可用來連線到 Azure Synapse 無伺服器 SQL 集區。 使用可用來連線到 SQL Server 或 SQL 資料庫 的選項。 線上對話框不需要標記為 「Synapse」,因為無伺服器 SQL 集區會使用與 SQL Server 或 SQL 資料庫 相同的通訊協定。

即使工具可讓您只輸入邏輯伺服器名稱並預先定義 database.windows.net 網域,請將 Azure Synapse 工作區名稱 -ondemand 放在後綴和網域後面 database.windows.net

安全性

請確定使用者有權存取資料庫、 執行命令的許可權,以及存取 Azure Data LakeAzure Cosmos DB 記憶體的許可權。

無法存取 Azure Cosmos DB 帳戶

您必須使用只讀的 Azure Cosmos DB 金鑰來存取分析記憶體,因此請確定它未過期或未重新產生。

如果您收到「解決 Azure Cosmos DB 路徑失敗併發生錯誤」錯誤,請確定您已設定防火牆。

無法存取 Lakehouse 或 Spark 資料庫

如果使用者無法存取 Lakehouse 或 Spark 資料庫,則使用者可能無權存取和讀取資料庫。 具有 CONTROL SERVER 許可權的用戶應該具有所有資料庫的完整存取權。 作為受限制的許可權,您可能會嘗試使用 CONNECT ANY DATABASE 和 SELECT ALL USER SECURABLES

SQL 使用者無法存取 Dataverse 數據表

Dataverse 數據表會使用呼叫端的 Microsoft Entra 身分識別來存取記憶體。 具有高許可權的 SQL 使用者可能會嘗試從數據表中選取數據,但數據表將無法存取 Dataverse 數據。 不支援此案例。

SPI 建立角色指派時,Microsoft Entra 服務主體登入失敗

如果您想要使用另一個 SPI 建立服務主體識別碼 (SPI) 或 Microsoft Entra 應用程式的角色指派,或您已建立一個,且無法登入,您可能會收到下列錯誤: Login error: Login failed for user '<token-identified principal>'.

針對服務主體,您應該使用應用程式識別碼作為安全性識別碼 (SID) 來建立登入,而不是使用物件識別碼。 服務主體具有已知的限制,該限制會導致 Azure Synapse 在另一個 SPI 或應用程式建立角色指派時,無法從 Microsoft Graph 擷取應用程式識別碼。

解決方案 1

移至 Azure 入口網站> Synapse Studio>管理>訪問控制,並手動為所需的服務主體新增 Synapse 管理員 istratorSynapse SQL 管理員 istrator。

解決方案 2

您必須使用 SQL 程式代碼手動建立適當的登入:

use master
go
CREATE LOGIN [<service_principal_name>] FROM EXTERNAL PROVIDER;
go
ALTER SERVER ROLE sysadmin ADD MEMBER [<service_principal_name>];
go

解決方案3

您也可以使用 PowerShell 設定服務主體 Azure Synapse 系統管理員。 您必須安裝 Az.Synapse 模組

解決方案是搭配 使用 CmdletNew-AzSynapseRoleAssignment-ObjectId "parameter" 在該參數位段中,使用工作區管理員 Azure 服務主體認證來提供應用程式識別碼,而不是物件識別碼。

PowerShell 腳本:

$spAppId = "<app_id_which_is_already_an_admin_on_the_workspace>"
$SPPassword = "<application_secret>"
$tenantId = "<tenant_id>"
$secpasswd = ConvertTo-SecureString -String $SPPassword -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $spAppId, $secpasswd

Connect-AzAccount -ServicePrincipal -Credential $cred -Tenant $tenantId

New-AzSynapseRoleAssignment -WorkspaceName "<workspaceName>" -RoleDefinitionName "Synapse Administrator" -ObjectId "<app_id_to_add_as_admin>" [-Debug]

驗證

連線 至無伺服器 SQL 端點,並確認已建立具有 SID 的外部登入 (app_id_to_add_as_admin在先前範例中) :

SELECT name, convert(uniqueidentifier, sid) AS sid, create_date
FROM sys.server_principals 
WHERE type in ('E', 'X');

或者,嘗試使用設定管理員應用程式,在無伺服器 SQL 端點上登入。

限制

某些一般系統條件約束可能會影響您的工作負載:

屬性 限制
每個訂用帳戶的 Azure Synapse 工作區數目上限 請參閱限制
每個無伺服器集區的資料庫數目上限 100 (不包括從 Apache Spark 集區同步處理的資料庫)。
從 Apache Spark 集區同步處理的資料庫數目上限 不受限制。
每個資料庫的資料庫物件數目上限 資料庫中所有物件數的總和不得超過 2,147,483,647。 請參閱 SQL Server 資料庫引擎中的限制。
字元的標識碼長度上限 128.請參閱 SQL Server 資料庫引擎的限制。
查詢持續時間上限 30 分鐘
結果集的大小上限 並行查詢之間最多共用 400 GB。
並行存取上限 不受限制,且取決於所掃描數據的查詢複雜度和數量。 一個無伺服器 SQL 集區可以同時處理執行輕量型查詢的 1,000 個作用中工作階段。 如果查詢更複雜或掃描大量資料,則數字會下降,因此在這種情況下,請考慮減少並行,並在可能的情況下在更長的時間內執行查詢。
外部數據表名稱的大小上限 100 個字元。

無法在無伺服器 SQL 集區中建立資料庫

無伺服器 SQL 集區有限制,而且您無法為每個工作區建立超過 100 個資料庫。 如果您需要分隔物件並加以隔離,請使用架構。

如果您收到錯誤 CREATE DATABASE failed. User database limit has been already reached ,則您已建立一個工作區中支援的資料庫數目上限。

您不需要使用不同的資料庫來隔離不同租用戶的數據。 所有數據都會儲存在 Data Lake 和 Azure Cosmos DB 外部。 數據表、檢視表和函式定義等元數據可以使用架構成功隔離。 架構型隔離也會用於 Spark 中,其中資料庫和架構是相同的概念。

下一步