簡體   English   中英

告訴我不需要SQL Server索引的情況

[英]Tell me a situation in which SQL Server indexing is not required

您能告訴我不需要在SQL Server表上建立索引的情況嗎?

我認為這是一張表,您需要在其中快速並可能以高頻率轉儲數據(例如在數據采集應用程序中,從傳感器中轉儲原始數據),以便稍后進行處理。 這是因為由於重新安排索引的開銷,索引趨於稍微降低數據插入的速度。

從技術上講,它從來不是“必需的”,但它總是一個好主意。 如果沒有聚集索引(非聚集索引需要聚集索引才能工作),那么每次訪問該表中的數據時,都必須進行表掃描以檢索信息。 如果表中的行數非常少,則索引從技術上講幾乎沒有好處。

想不出一個真正的好例子。 也許如果您有一個由於某種原因僅持有一個值的表。 無需索引該表。

如果表低於一定的行數,則執行表掃描比查找索引要快。

我不確定一個比另一個更快的確切數字。

對於諸如日志表之類的東西而言,可能不需要的地方是您在其中保存一些事件,但永遠不會引用該表中的主鍵。 如果您曾經訪問過該表,則可能是針對文本搜索的,通常無論如何都需要對表進行掃描。 盡管很容易辯稱,沒有日期/時間列的日志表什么也沒有,應該對其進行索引。

我以前的DBA告訴我,根據我們的經驗,行數少於50K的窄表不需要為從該一張表中檢索數據而建立索引,因為索引查找的開銷抵消了表掃描的開銷。

我能想到的地方,可能不需要索引的幾個例子,但我不能真的認為任何例子,你會不會想索引你的表呢。

至少您應該索引主鍵 -沒有理由不這樣做。

對於非登台表,當該表具有零(或可能只有一)行並且沒有外鍵時。 但是,如何防止有人再次添加相同的值?

否則,將臨時表清空並在一個調用中進行批量處理可能會有好處

簡而言之,您幾乎不會在任何地方都不使用索引的情況下...

我從事過ETL解決方案(Integration Serices編寫為SQL Server 2005)的工作,由於插入(而且只有插入)要花費數小時(盡管后來將數據導入到Analysis中),因此我不得不放棄很多索引。在定義了其他關系的服務多維數據集中,您可能會認為索引並沒有被放棄)。 對於某些表,折衷方案是在寫入過程之前刪除索引,然后在之后重新創建它們。 娛樂花費了很長時間,但仍然比插入同時建立索引的勢頭要快。

暫無
暫無

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

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