『壹』 sql Server 2005 某個表中,其中一列存儲的值比較多, 第一次查詢很慢,怎麼解決
查詢語句可以優化一下
SELECT Tem_Detail
FROM Core_Flow_Approve_InstanceFlow
WHERE Tem_Detail != '' AND Instance_ID = ''
SQL語句過濾條件是從右到左的,
有兩個條件如果有一千條數據,第一條件要比較1000次(索引除外)。
第一條件濾過了900,第二條件比較就只比較100:總比較次數就是1100.
如果第一條件過濾100,第二條件比較900次,總次數就是1900了!
『貳』 (問題解決再追加100分)sql server存儲過程實現查詢數據條數過大,分頁查詢怎麼實現
按說5-8w這樣數量級的數據沒有問題,寫入Excel是布比較耗性能,主要還是要通過優化寫入Excel的代碼效率上去考慮。你可以考慮利用分批查詢寫入的方式來避免一次寫太多的數據到Excel:將你的查詢結果分段,比方你的語句中能不能用時間來認為分段,每次返回部分結果。
回到你的問題,對大數據量查詢的解決方案有以下兩種:
(1)、將全部數據先查詢到內存中,然後在內存中進行分頁,這種方式對內存佔用較大,必須限制一次查詢的數據量。
(2)、採用存儲過程在資料庫中進行分頁,這種方式對資料庫的依賴較大,不同的資料庫實現機制不通,並且查詢效率不夠理想。以上兩種方式對用戶來說都不夠友好。
2.解決思路
通過在待查詢的資料庫表上增加一個用於查詢的自增長欄位,然後採用該欄位進行分頁查詢,可以很好地解決這個問題。下面舉例說明這種分頁查詢方案。
(1)、在待查詢的表格上增加一個long型的自增長列,取名為「queryId」,mssql、sybase直接支持自增長欄位,oracle可以用sequence和trigger來實現。然後在該列上加上一個索引。
添加queryId列的語句如下:
Mssql: [QUERYID] [bigint] IDENTITY (1, 1)
Sybase: QUERYID numeric(19) identity
Oracle:
CREATE SEQUENCE queryId_S
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999 MINVALUE 1
CYCLE
CACHE 20
ORDER;
CREATE OR REPLACE TRIGGER queryId_T BEFORE INSERT
ON "test_table"
FOR EACH ROW
BEGIN
select queryId_S.nextval into :new.queryId from al;
END;
(2)、在查詢第一頁時,先按照大小順序的倒序查出所有的queryId,
語句如下:select queryId from test_table where + 查詢條件 +order by queryId desc 。
因為只是查詢queryId欄位,即使表格中的數據量很大,該查詢也會很快得到結果。然後將得到的queryId保存在應用伺服器的一個數組中。
(3)、用戶在客戶端進行翻頁操作時,客戶端將待查詢的頁號作為參數傳遞給應用伺服器,伺服器通過頁號和queyId數組算出待查詢的queyId最大和最小值,然後進行查詢。
算出queyId最大和最小值的演算法如下,其中page為待查詢的頁號,pageSize為每頁的大小,queryIds為第二步生成的queryId數組:
int startRow = (page - 1) * pageSize
int endRow = page * pageSize - 1;
if (endRow >=queryIds.length)
{
endRow = this.queryIds.length - 1;
}
long startId =queryIds[startRow];
long endId =queryIds[endRow];
查詢語句如下:
String sql = "select * from test_table" + 查詢條件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";
3.效果評價
該分頁查詢方法對所有資料庫都適用,對應用伺服器、資料庫伺服器、查詢客戶端的cpu和內存佔用都較低,查詢速度較快,是一個較為理想的分頁查詢實現方案。經過測試,查詢4百萬條數據,可以在3分鍾內顯示出首頁數據,以後每一次翻頁操作基本在2秒以內。內存和cpu佔用無明顯增長。
以上也僅僅是分頁查詢結果查看的問題,你需要寫入到Excel的話還需要考慮Excel寫入代碼的執行效率,這部分是很值得研究的。
『叄』 SQL SERVER一個資料庫中使用大量的存儲過程,會影響性能嗎
一、在SQL Server中存儲過程不會影響性能。x0dx0a1、只會大大的減輕伺服器的壓力,而不會增加,只有不合理的存儲過程才會槐辯納造成伺服器性能下降的惡果。一個大型的資料庫,一般存儲過程也不會超過幾千個,對當前的資料庫及它依附的硬體來說,這點兒負載是大象身上的老鼠,負載基本可以_略不計。x0dx0a2、但是,存儲過程是批量的SQL語句的合成,如果設計上混亂,引發死循環、死鎖、大范圍查詢、臨時表沒有及時清理釋放等問題的情況下,是會嚴重影響伺服器性能的,但這根子不在存儲過程上,而在於存儲過程的設計上。錯誤的SQL代碼指揮伺服器,無論它的形式是存儲過程,還是客戶端及時發向資料庫的請求,都會使伺服器出現問題。x0dx0ax0dx0a二、相關擴展x0dx0a1、在當前,針對資料庫的編程設計,沒有存儲過程是不可想像的,這就象某個公司的大型貨品倉庫中沒有倉庫保管員一樣,所有的貨品進出都得進貨員或銷售員去臨時取放,會嚴重降低工作效率。x0dx0a2、存儲過程在資料庫中無論是否編譯好,其效率都要比客戶端臨時向資料庫發送指令調數據來得要高,因為至少減少了發向伺服器的指令的量。況且很多的中間值、臨時值如果不通過存儲過程來實現的話,就只能先全取到客戶端鉛沒,這樣會大大增加網路負擔與伺服器的負鉭。x0dx0a3、正如微軟所說,存儲過程來實現,可以使得很多中間量不必傳入到客戶上,客戶端只能得到需要的結果,所以同灶歷時可以提高安全。