2013-01-07 21 views
0

請問我有一個數據庫包含2表:第一個與超過200萬記錄 第二個歷史表的第一個。 當我們試圖做一個選擇或更新並且ID(主鍵)超過30 000時,查詢花費1分多鐘才能執行。 如果我做一個截斷並導入數據,並從1開始查詢需要1秒。 請問爲什麼延時當ID> 30 000和其他解決方案?索引:1爲PK另一個在日期和另一個字段優先整數 如果我做了一個簡單的選擇前10 *從表1我有2分鐘的延遲
PS:大量的交易是在同一時間完成在第一個表(選擇,插入,更新&刪除) 謝謝當更新和從巨大的表中選擇從ID開始從30000時間超過2分鐘

+0

您需要爲您的問題添加更多詳細信息。表結構包括現有索引,執行的查詢和查詢計劃。 –

+0

因此,對於查詢ID> 30000 **和**查詢沒有order by子句的select top 10 ..'查詢,性能很差。我是否正確理解您的問題?服務器是否非常繁忙?你是否有很長時間從其他客戶運行交易?查詢計劃怎麼樣?他們告訴你什麼? –

+0

'設置事務隔離級別讀取未提交','帶(nolock)'等。 – Ben

回答

0

如果您是從鎖爭的痛苦,你有兩個基本的選擇:

  1. 停止所有其他活動,而你做的查詢。這將保證對數據的一致看法。 (從技術上講,需要其他步驟來保證與其他表格的一致性)。您可以通過指定with (TABLOCKX)查詢提示來執行此操作。 (你也可以使用「序列化」事務隔離級別,當你閱讀它時,它會逐漸地鎖定表格,你可以用索引來做一些聰明的事情,這樣可以減少痛苦,但是那符合「高級」)。

  2. 允許其他活動繼續,但接受您得到的答案可能與查詢進行過程中發生的活動不一致。也就是說,在查詢過程中添加的行可能會或可能不會被包含,並且在查詢過程中被刪除的行可能會或可能不會被包含,並且正在更新的行可能會或可能不會,具有之前或之後的值。另外,你可能會發現一些較晚的值被包含在內,而一些較早的值沒有被包含,所以它不會在時間上一致。你可以用with (NOLOCK)提示來做到這一點。 (您也可以使用「讀未提交」事務隔離級別。通常,只需在需要時指定NOLOCK即可)。

根據你在做什麼,兩個選項可能是最好的。如果您想要提供粗略的數字或用於報告/監控目的的滾動「前10名」,請使用選項2.如果您必須提供類似會計號碼,銀行餘額等的信息,那麼您必須擁有一個檢查點,知道確切的正確數字,使用選項1.這是罕見的 - 如果有疑問,你可能想要選項2.

「之間」選項,讀取提交,讀取快照等,很少真正需要儘管是默認設置,並且只有在您瞭解情況時才能使用,以確定是否需要它們。

+0

問題是我有不同的應用程序做選擇從同一個表,但從應用程序到應用程序的不同之處,例如第一個應用程序做一個選擇*從table1其中x = 1應用程序2做一個select * from table1其中x = 2,然後選擇應用程序處理每個記錄並對其進行更新。一切工作正常,直到ID字段變得更多30000,我們開始得到延遲,如果我重置ID從1開始延遲消失。爲什麼當ID很大時我有這種延遲 – user1199175

+0

@ user1199175,你沒有道理。具有200萬行的表如何具有ID <30000?當然ID會> = 2000000? – Ben

+0

對不起,您在哪裏閱讀過我的ID <30000? – user1199175

相關問題