Skip to content

SQL Search 完整度與進度 ​

本頁定義一輪搜尋怎麼說「搜完了沒有」、進度與停止、建索引的通知;provider 契約、索引與排名見 SQL Search。

沒有掃描預算 ​

一輪一律掃完每一個目標,延遲靠取消控制:多打一個字、按停止或收起視窗,這一輪就停。曾經每個 provider 限 100 筆、2 萬個候選與 400 ms,「全部資料庫 × 全部種類」時候選數花在名稱與資料行上, 本文命中一筆都收不到,而畫面只說「部分結果」;使用者據此判斷字串不存在而估錯工時。

唯一的上限是清單列幾筆(SearchAggregator.MaxHits),裁的是排名之後的尾巴,TotalHits 照實說, 頁尾寫「找到 N 項,列出前 M 項」。列不下不算不完整。

目標與結局 ​

provider 取資料前對每一個要搜的東西 ISearchSink.AddTarget:資料庫是 Database,伺服器層級的來源 (SQL Agent 作業)是 Source。結局只收第一次:Complete,或 Unavailable 帶種類與補充。本文讀不到的 物件(加密、沒有 VIEW DEFINITION)用 AddUnreadableText 數,只數這一輪分類留下的種類;伺服器端比對 失敗用 MarkTextIncomplete。沒說結局的目標收尾時記成已取消,預設不是完整。

範圍是「全部」時,進不去的資料庫(離線、還原中、HAS_DBACCESS 為 0)照樣宣告成目標並當場說讀不到, 不開連線;資料庫下拉只列進得去的。直接略過的話,畫面會說「已完整搜尋 38 個資料庫」而少了使用者以為 有搜的那幾個。分類把整個來源排除時不宣告目標。

SearchResults.IsComplete 要每一個目標都完整、沒有失敗也沒有取消。

完整度怎麼說 ​

完整與不完整兩種都要說:只在不完整時說一句的話,沒說與完整一模一樣。句子只由 SqlSearchCoverage 組,頁尾、空白畫面與通知共用。

情形頁尾一列都沒有時
完整「已完整搜尋 N 個資料庫、SQL Agent 作業」,成功圖示沒有相符項目+同一句
有缺口「搜尋不完整:」列最多三項,其餘用數字,警告圖示「沒有相符項目,但搜尋不完整」
一個目標都沒搜到—讀不到;每一個都是權限才說權限不足
停止「已停止;清單只含停止前找到的結果」「已停止搜尋」

狀態不只靠顏色:語氣是頁尾說明前的一顆圖示(SqlListFooterTone)。

進度與停止 ​

一輪跑超過 300 ms,清單上方出現 SqlProgressStrip:說明、停止鈕與一條細進度條;放上方是因為頁尾在 清單最後,列一多就捲不到。說明是「正在建立搜尋索引/正在搜尋 · 完成數/目標數」,還不知道目標數時說 正在列出資料庫,進度條改為掃描線。進度由畫面每 150 ms 問一次(SearchRun.Progress),不由 provider 推。

預估時間(SearchEta)寧可晚出現也不跳:跑滿 2 秒且過一成才算,指數平滑,進位到 5 秒;目標數變多使 進度倒退時重算。一分鐘以上寫分鐘。

命中照到達順序邊跑邊列,同一物件的第二種命中等整輪結束由聚合器併成一列;整輪結束照排序重排一次, 途中按排序只記下選擇。要先建索引的那一輪先清掉上一份清單,載入表面只在一列都沒有時出現。

停止取消這一輪與正在建的索引,已找到的留著。打字取消的那一輪整份不要,進度條與通知留給下一輪接手。

建索引的通知 ​

只有要建索引、而且跑滿 2 秒才開 BuildingSearchIndex(種類 Search),進度寫「完成數/目標數」;快的 那幾輪不在通知島閃一列。整輪結束才關:完整是成功,有缺口是降級並寫同一句完整度,停止與收起視窗是取消。 被打字取代時不關:建索引不跟著輪次取消,那一則說的仍然是真的。

以 Apache-2.0 授權條款發布 · 專為 SSMS 22 設計