所以問題是“從 Synapse Serverless 池上托管的大型外部表中獲取最后一條記錄的最佳方法是什么?。該表有一個用作主鍵的列鍵,還有另一個時間戳列,例如:
col_key | col_a | col_b | col_date
a1 val1 val2 2018-03-05T18:24:40.228 00:00
a1 val10 val2 2018-03-06T18:24:40.228 00:00
a1 val12 val29 2018-03-07T18:24:40.228 00:00
a2 val1 val2 2018-03-04T18:24:40.228 00:00
a2 val1 val2 2018-03-05T18:24:40.228 00:00
a2 val1 val42 2018-03-09T18:24:40.228 00:00
a3 val1 val2 2018-03-05T18:24:40.228 00:00
a3 val1 val9 2018-03-07T18:24:40.228 00:00
a3 val1 val32 2018-03-08T18:24:40.228 00:00
所以查詢將回傳一個壓縮表:
col_key | col_a | col_b | col_date
a1 val12 val29 2018-03-07T18:24:40.228 00:00
a2 val1 val42 2018-03-09T18:24:40.228 00:00
a3 val1 val32 2018-03-08T18:24:40.228 00:00
它不能使用火花;?什么樣的優化查詢可以使用性能良好的?
uj5u.com熱心網友回復:
最好的方法取決于您擁有的資料量和資料的組織方式。在這種情況下,最好的起點可能是通過按函式 row_number() 排序并按 col_date 對磁區進行排序來進行查詢。你可以用這樣的查詢來做到這一點:
SELECT col_key, col_a, col_b, col_date
FROM (
SELECT
col_key, col_a, col_b, col_date,
ROW_NUMBER() OVER (PARTITION BY col_key ORDER BY col_date DESC) as rn
FROM
????OPENROWSET(...your pointer to data here...
)?AS?sortedresult
) finalresult where finalresult.rn=1
當然,實際性能和成本細節取決于您存盤查詢資料的實際方式,以及您對“良好性能”的定義。借助 Azure Synapse Analytics,您擁有無限的可擴展性,如果您不針對查詢成本進行優化,那么借助它和即用即付定價,您將需要一個無限的錢包。因此,請使用您的真實資料檢查查詢的執行方式及其成本。沒有真實資料,優化這一點是沒有意義的。
可以在此處找到與此相關的更多資訊:
- ROW_NUMBER(): https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql
- 無服務器池最佳實踐:https : //docs.microsoft.com/en-us/azure/synapse-analytics/sql/best-practices-serverless-sql-pool
uj5u.com熱心網友回復:
如果您的日期列實際上是DATETIMEOFFSET格式,那么我認為 Azure Synapse 無服務器 SQL 池和外部表不支持將其作為資料型別,因此您可能會收到此錯誤:
訊息 15815,級別 16,狀態 1,第 80 行 當前不支持外部資料型別“DATETIMEOFFSET”。檔案:“https://someStorage.dfs.core.windows.net/somelake/raw/serverlessTable.psv”。
它將讓您創建表,查詢時會發生錯誤。當前也不支持日期格式選項(它們用于專用 SQL 池),因此我認為您必須匯入日期列 asVARCHAR然后將其轉換為DATETIMEOFFSET,如下所示:
;WITH cte AS (
SELECT
col_key,
col_a,
col_b,
TRY_CAST( col_date AS DATETIMEOFFSET ) col_date
FROM dbo.yourExternalTable
), cte2 AS (
SELECT *, ROW_NUMBER() OVER( PARTITION BY col_key ORDER BY col_date DESC ) rn
FROM cte
)
SELECT col_key, col_a, col_b, col_date
FROM cte2
WHERE rn = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/325203.html
上一篇:SqlAzure-跨資料庫查詢
