簡體   English   中英

如何優化 SQL 查詢?

[英]How to optimize SQL query?

我有 2 個表(“keys”由大約 6 個字段組成,“stats”由大約 65 個字段組成)。

我想在兩個表中插入行而不復制短語文本。 我使用這樣的東西:

UPDATE Keys SET CommandType = 'ADDED', CommandCode = @CommandCode WHERE 
KeyText = @KeyText AND Tab_ID = @TabID AND CommandType = 'DELETED';

INSERT INTO Keys (IsChecked, KeyText, AddDateTime, Tab_ID, KeySource_ID, CommandCode, CommandType)
SELECT 0, @KeyText, datetime(), @TabID, @KeySourceID, @CommandCode, 'ADDED'
WHERE NOT EXISTS (SELECT 1 FROM Keys WHERE Tab_ID = @TabID AND KeyText = @KeyText);

INSERT INTO Statistics (Key_ID)
SELECT ID FROM Keys WHERE KeyText = @KeyText AND Tab_ID = @TabID AND (CommandType IS NULL OR CommandType <> 'DELETED') AND 
NOT EXISTS (SELECT 1 FROM Statistics WHERE Key_ID = (SELECT ID FROM Keys WHERE KeyText = @KeyText AND Tab_ID = @TabID AND (CommandType IS NULL OR CommandType <> 'DELETED') LIMIT 1));

我該如何優化它? 我為此查詢字段中使用的所有內容創建索引。 也許您可以向我推薦一些解決方案?

感謝您的幫助,並為我的英語不好感到抱歉。

您可以使用 MERGE 語句將插入/更新語句組合成單個語句。 如果要將鍵的修改復制到統計信息中,可以使用 OUTPUT 語句。

您必須將索引添加到問題中才能評論它們的有效性,但基本上您希望每個表上都有一個索引,其中包含 where 子句中的所有列。 您想將包含列用於 select 中不在 where 子句中的任何內容。

優化的最佳方法是獲取估計/實際的查詢計划,並查看查詢的哪些部分較慢。 在 SQL 服務器中,這是從“查詢”菜單完成的。 基本上,請注意任何說“掃描”的內容,這意味着您缺少索引。 “尋求”是好的。

但是,查詢計划最有助於微調。 在這種情況下,使用不同的算法(如合並/輸出)將產生更大的差異。

在 SQL 服務器中,結果看起來有點像這樣:

INSERT INTO [Statistics] (ID)
SELECT ID FROM
(
    MERGE [Keys] AS TARGET
    USING (
        SELECT @KeyText AS KeyText, @TabID AS TabId, @CommandCode AS CommandCode, @KeySourceID AS KeySourceID, 'Added' AS CommandType
    ) AS SOURCE
    ON (target.KeyText = source.KeyText AND target.Tab_Id = @TabID)
    WHEN MATCHED AND CommandType = 'DELETED' THEN
        UPDATE SET Target.CommandType = Source.CommandType, Target.CommandCode = Source.CommandCode
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (IsChecked, KeyText, AddDateTime, Tab_Id, KeySource_ID, CommandCode, CommandType) VALUES (0, KeyText, getdate(), TabId, KeySourceId, CommandCode, CommandType)
    OUTPUT $Action, INSERTED.ID
) AS Changes (Action, ID)
WHERE Changes.Action = 'INSERT'
AND NOT EXISTS (SELECT 1 FROM Statistics b WHERE b.ID = Changes.ID)

創建索引會減慢插入和更新查詢的速度,因為索引必須與數據一起更新。 要優化您的特定插入語句,請去掉典型 select 語句不需要的任何索引。 然后努力簡化那些“不存在”的條款。 這些是您將獲得的任何性能提升的唯一來源。 簡化后,嘗試創建索引以加快該子查詢的速度。

問題在於我的表的索引錯誤。 我重建它並用 static 內容替換了一些查詢參數,效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM