2012-05-23 90 views
4

發起SQL Server Express的性能問題

我有一個SQL Server Express的2008 R2運行。有十個用戶使用存儲過程永久地讀/寫相同的表。他們這樣做日夜。

問題

存儲過程的表現越來越隨着數據庫容量低。 當數據庫大小大約爲200MB時,存儲過程調用需要平均10ms。 當數據庫大小約爲3GB時,相同的調用需要avg 200ms。 所以我們必須每月清理一次數據庫。

我們已經做了一些有積極作用的表的索引優化,但問題依然存在。

最後我不是SQL Server專家。你能給我一些提示,開始擺脫這個性能問題嗎?

+1

您可以粘貼其中一個存儲過程的示例嗎?然後我會看一看,看看我能不能幫忙。 –

+0

你唯一能做的就是要麼。看看存儲過程中查詢的性能,或者如果他們已經達到了實際的極限,可以考慮將設計更改爲側重於任何問題。可能值得聘請顧問dba提供一些專家協助。 –

+0

您的SQLServer版本在最大數據大小上有限制:10 GB。因此,如果您解決了性能問題,則必須在數月內清理數據庫或對其進行升級。 –

回答

7

在SQL Server Express Edition的限制(1GB內存緩衝池,只有一個使用的插槽CPU,10GB數據庫大小)不太可能成爲問題。應用程序設計,錯誤查詢,過度鎖定併發性和糟糕的索引更可能成爲問題。鏈接的文章(特別是第一篇)包括如何識別瓶頸的方法論。

-2

SQLExpress是爲測試目的而構建的,性能直接受到Microsoft的限制,如果您在生產環境中使用它,您可能希望獲得SQL Server的許可證。

看一看這裏SQL Express for production?

+2

-1 SQL Express可以(也可以)用於生產。我非常肯定,OP在Enterprise Edition上會遇到完全相同的問題,但沒有證明他看到的性能問題是由於Express限制造成的。應用程序問題(表掃描!)是一個更爲可能的問題。 –

+0

-1。你甚至不打擾 - 對於較小的設置(100用戶,10GB數據),使用SQL Express是完全正確的。許可證允許。在發佈前閱讀 - 在這種情況下是許可證文件。 – TomTom

+0

看起來他很快就會達到Express的極限(4GB DB,1G RAM和1個CPU)。個人偏好,我絕不會使用快遞應用程序,但那是我的電話。如果你的應用程序和數據很小,那麼使用快遞應該沒有問題。 – Limey

1

首先,SQL Server Express不是您要求的最佳版本。獲取開發人員版來測試它。它和企業一模一樣,但如果你不使用「生產」就免費。

關於性能,這裏涉及的東西太多了,您可以使用它來改進它,因爲索引直到分區。我們需要更多的信息來提供幫助

+0

-1。看,他的問題可能不會出現在開發中,而是在實際使用中。閱讀他的文字。其實你建議他打破開發者許可,或者你的帖子讓ZERO感覺不到,因爲他無法使用它) – TomTom

+0

我建議他在測試環境下測試它,看看SQL Express是否確實會出現問題。我並不是建議他簡單地將他的快速版改爲開發者。 – Diego

+0

從什麼時候開發者版「免費」?我一直不得不爲此花費大約49美元。 –

1

這是最有可能的簡單編程錯誤 - 聽起來像是你根本要麼有:

  • 一些表不正確的索引。這不是最優化的 - 糟糕的索引就像Web人員的HTML破碎,如果你沒有索引,那麼基本上你沒有使用SQL,因爲它應該被使用,你應該總是有適當的索引。
  • 硬件不足,如RAM。是的,它可以管理一個10GB的數據庫,但是如果你的熱點設置(總是訪問的最後一個)是2GB,而你只有1GB,那麼它會比它需要的更頻繁地播放光盤。
  • 慢光盤,特別是一個快速的問題,因爲大多數人不打擾得到正確的光盤佈局。他們在一個緩慢的200 IOPS終端用戶光盤上再次運行sQL數據庫 - 根據需要 - SQL數據庫需要MANY主軸或SSD(目前典型的SSD具有40.000 IOPS)。

這就是最後 - 加上可能真的很糟糕的SQL。典型的過濾錯誤:somefomula(field)LIKE值,意思是「請忘記您的索引,請在檢查前進行表掃描並計算一些公式(字段)」。

0

可能是糟糕的索引,數據庫設計不佳,可能不適用規範化,不需要的列索引,需要很長時間執行的差勁查詢。

0

在優化SQL查詢之前,您需要查找查詢的熱點。通常您可以使用SQL Profiler在SQL Server上執行此操作。對於Express版本,沒有這樣的工具。

返回所有renct查詢:

SELECT * 
FROM sys.dm_exec_query_stats order by total_worker_time DESC; 

僅返回頂部耗時查詢:但是你可以通過使用幾個查詢走動

SELECT total_worker_time, execution_count, last_worker_time, dest.TEXT 
FROM sys.dm_exec_query_stats AS deqs 
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest 
ORDER BY total_worker_time DESC; 

現在你應該知道哪些查詢需要進行優化。