慢我有這個簡單的定義表:SQL查詢單表值參數上大的輸入
CREATE TABLE Related
(
RelatedUser NVARCHAR(100) NOT NULL FOREIGN KEY REFERENCES User(Id),
RelatedStory BIGINT NOT NULL FOREIGN KEY REFERENCES Story(Id),
CreationTime DateTime NOT NULL,
PRIMARY KEY(RelatedUser, RelatedStory)
);
這些指數:
CREATE INDEX i_relateduserid
ON Related (RelatedUserId) INCLUDE (RelatedStory, CreationTime)
CREATE INDEX i_relatedstory
ON Related(RelatedStory) INCLUDE (RelatedUser, CreationTime)
,我需要查詢表所有與一系列UserIds相關的故事,按創建時間排序,然後僅提取X並跳過Y.
我有這個存儲過程:
CREATE PROCEDURE GetStories
@offset INT,
@limit INT,
@input UserIdInput READONLY
AS
BEGIN
SELECT RelatedStory
FROM Related
WHERE EXISTS (SELECT 1 FROM @input WHERE UID = RelatedUser)
GROUP BY RelatedStory, CreationTime
ORDER BY CreationTime DESC
OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY;
END;
使用此用戶自定義表類型:
CREATE TYPE UserIdInput AS TABLE
(
UID nvarchar(100) PRIMARY KEY CLUSTERED
)
表有13萬行,並使用一些用戶ID作爲輸入時得到我的好成績,但很糟糕(30秒以上)產生時提供數百或數千個用戶ID作爲輸入。主要問題似乎是它使用了63%的排序工作。
我錯過了什麼索引?這似乎是在單個表上的一個非常簡單的查詢。
你有沒有考慮改變你的WHERE EXISTS爲連接。聯賽往往表現更好,尤其是對於大型聯賽。 –
據我已經能夠給谷歌,EXISTS如果你檢查存在,就像這裏的答案是首選表明: http://stackoverflow.com/questions/7082449/exists-vs-join-and-使用存在條款 這不是這種情況嗎? – bech
是的,但正如你所提到的,當你的集合擴展時,性能會受到影響。如果JOIN鍵沒有被索引,那麼使用EXISTS可能會得到更好的結果。我的想法是這樣的......「就像雞湯感冒一樣......不會傷到試試。」 –