2010-01-28 76 views

回答

1

服務器端可能存在一些漸進式處理,數據的網絡傳輸和客戶端呈現的混合。

如果一個查詢快速返回10,000行,另一個查詢返回緩慢 - 並且它們具有相似的行大小,數據類型等,並且都以結果爲網格或結果爲文本 - 我們很少除非您向我們展示每個執行計劃和/或客戶端統計信息,否則可以分析差異。這些是您在運行查詢時可以在SSMS中設置的選項。另外,將結果切換爲網格並將結果切換爲文本,您可能會注意到運行時略有不同。這是因爲在一種情況下,Management Studio必須更加努力地對齊列等。

0

你不能做一個通用的假設,查詢的計劃是由許多不同類型的操作或迭代器組成的。其中一些是基於導航的,並且像流水線一樣工作,而另一些則是基於集合的操作,比如排序。

如果任何查詢包含基於集合的操作,則它會在輸出結果之前需要所有記錄(即語句中的order by子句)。但是,如果您沒有基於集合的迭代器,則可以預期行是當它們變得可用時流式傳輸給你。

+0

你能向我解釋「基於集合的迭代器」是什麼?你是在談論使用連接而不是使用遊標或循環?讓我們假設我所說的查詢只使用連接。 – 2010-01-28 19:01:53

+0

設置基於需要的所有數據可以處理,排序是一個明顯的例子,導航可以一次在一行上工作,例如嵌套循環/索引搜索。這些僅影響您是否會在SSMS窗口中看到流式傳輸給您的結果,或者它們全部到達enmass。 – Andrew 2010-01-28 19:06:07

0

對您的每個問題的答案都是「它取決於」。

例如,考慮您是否包含order by子句,並且沒有您要排序的列的索引。在這種情況下,服務器必須查找所有滿足查詢的記錄,然後對其進行排序,然後才能返回第一條記錄。這會在您獲得第一張唱片之前導致長時間的停頓,但是一旦開始播放,您(通常應該)很快就會獲得它們。

如果沒有order by子句,服務器通常會發送每個記錄作爲找到的記錄,因此第一條記錄通常會更快顯示,但是您可能會在一條記錄和下一條記錄之間看到很長的停頓。至於「爲什麼一個查詢比另一個查詢更快」,很大程度上取決於哪些索引可用,以及它們是否可用於特定查詢。例如,像some_column like '%something'這樣的東西幾乎總是很慢。最前面的'%'表示這將不能使用索引,即使some_column有一個索引。搜索something%而不是%something%可能會快100或1000倍。如果你真的需要前者,你真的想使用全文不是搜索(創建全文索引,並使用代替like

當然,有很多也可以簡單地依賴於數據庫是否具有特定列(或列組)的索引。使用合適的索引,查詢通常會快很多。