我有標準層中的Azure SQL數據庫,10個DTU。查詢在Azure中執行緩慢的瓶頸
我該如何「預測」CPU密集查詢的性能(因爲這似乎是緩慢的原因)?
爲了說明問題,將使用perf_test表,可以填充像這樣(腳本可以被提高了很多,但在這裏不是一個點):
CREATE TABLE dbo.perf_Test
(
PolicyDescriptionID INT IDENTITY PRIMARY KEY,
col1 NVARCHAR(100),
col2 NVARCHAR(100),
col3 NVARCHAR(100),
col4 NVARCHAR(100),
col5 NVARCHAR(100),
)
GO
SET NOCOUNT ON;
DECLARE @i INT = 0
WHILE @i < 100000
BEGIN
DECLARE @NumberI int = CAST(RAND() * 100000 AS INT);
DECLARE @NumberC VARCHAR(6);
SET @NumberC =
CASE
WHEN @NumberI < 10 THEN '00000' + CAST(@NumberI AS VARCHAR(6))
WHEN @NumberI < 100 THEN '0000' + CAST(@NumberI AS VARCHAR(6))
WHEN @NumberI < 1000 THEN '000' + CAST(@NumberI AS VARCHAR(6))
WHEN @NumberI < 10000 THEN '00' + CAST(@NumberI AS VARCHAR(6))
WHEN @NumberI < 100000 THEN '0' + CAST(@NumberI AS VARCHAR(6))
ELSE CAST(@NumberI AS VARCHAR(6))
END;
INSERT INTO dbo.perf_Test(col1, col2, col3, col4, col5)
VALUES(
@NumberC, -- char
@NumberC + RIGHT(@NumberC, 3) + @NumberC, -- casts as nvarchar
@NumberC + 'adslk3ājdsfšadjfads',
@NumberC,
@NumberC
);
SET @i = @i + 1;
END
對於許多查詢天青將執行相同作爲本地機器。但對於醜陋查詢它執行更糟糕:
SELECT *
FROM dbo.perf_Test
WHERE
col1 LIKE '%263a%'
OR col2 LIKE '%263a%'
OR col3 LIKE '%263a%'
OR col4 LIKE '%263a%'
OR col5 LIKE '%263a%'
天青: 掃描計數1,邏輯讀取1932年(休息0) SQL Server的執行時間:CPU時間= 16毫秒,經過時間= 6718毫秒
OnPrem: 掃描計數1,邏輯讀取1932年 SQL Server的執行時間:CPU時間= 563毫秒,經過時間= 482毫秒。
邏輯讀是一樣的「壞」的例子,但這個查詢執行在蔚藍的大致相同:
SELECT *
FROM dbo.perf_Test
WHERE col2 = '038743743038743'
天青: 掃描計數1,邏輯讀取1932年 SQL Server的執行時間: CPU時間= 32毫秒,經過時間= 22毫秒。
OnPrem: 掃描計數1,邏輯讀取1932 SQL Server執行時間:CPU時間= 16毫秒,經過時間= 7毫秒。
返回行是〜100 rows-相同 '壞' 的例子,但此查詢執行在天青
SELECT *
FROM dbo.perf_Test
WHERE col1 like N'0975%'
天青大致相同: 掃描計數1,邏輯讀取1932 SQL服務器執行時間:CPU時間= 16毫秒,經過時間= 26毫秒。
OnPrem: 掃描計數1,邏輯讀取1932 SQL Server執行時間:CPU時間= 15毫秒,耗用時間= 35毫秒。
如果我把一些CPU密集型查詢,差別又是巨大的(2和35秒天藍):
SELECT SUM(CAST(t1.col1 AS BIGINT) + CAST(t2.col1 AS BIGINT)), COUNT(t2.col1)
FROM dbo.perf_Test t1
CROSS JOIN dbo.perf_Test t2
WHERE t1.col3 LIKE '%263a%'
OPTION (MAXDOP 1)
我試圖找到,如果查詢節流關鍵表,但是從我的理解是不。 DTU的用法也沒有太多消耗 - 查詢中的DTUpcnt顯示使用了5.9%(基本上沒有其他數據庫正在發生)。所有顯示的內容都是所有查詢的邏輯讀取。數據量非常小(實際情況下爲50000行),因此較高層級的成本合理化很困難(彈性池目前尚未使用)。 –
如果您的讀取/寫入或超出限制,它們將被限制,您可以在查詢的運行時間期間收集等待統計信息 – TheGameiswar
執行大約34秒的查詢之前/之後的檢查增量在SOS_SCHEDULER_YIELD = 31847(wait_time_ms)中。我從sys.dm_db_wait_stats視圖中取出它,並且在執行之間沒有其他等待值增加。我能從中得出一些結論嗎? –