sqlserver優化器
⑴ 如何對sqlserver進行簡單的優化
SQL Server資料庫查詢速度慢的原因有很多,常見的有以下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是資料庫設計的缺陷)
2、I/O吞吐量小,形成了瓶頸效應。
3、沒有創建計算列導致查詢不優化。
4、內存不足
5、網路速度慢
6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷)
8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優化
●可以通過以下方法來優化查詢 :
1、把數據、日誌、索引放到不同的I/O設備上,增加讀取速度,以前可以將Tempdb應放在RAID0上,SQL2000不在支持。數據量(尺寸)越大,提高I/O越重要。
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級硬體
4、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。注意填充因子要適當(最好是使用默認值0)。索引應該盡量小,使用位元組數小的列建索引好(參照索引的創建),不要對有限的幾個值的欄位建單一索引如性別欄位。
⑵ sqlserver 優化,具體怎麼優化 不要混分的.
1 條件列都建單鍵索引,isnull的列建函數索引
2 如果可能,不用or,in,盡量用union改寫
3 如果是日常操作,游標肯定得要,因為你更改狀態後,還要插入日誌
4 如果是一次性處理,可以再保證沒有別人用的情況下,
用 insert into history ... select ... 的寫法寫日誌
用update ... from 的方法 統一更新訂單狀態,
然後統一commit即可
⑶ sqlserver 查詢語句優化
你後面這些條件都錯誤:
( cc.business='INSPECTION' and bil.customer_name like '%' + cl.client_name + '%' or
cc.business='INSPECTION' and bil.header_dff_value12 like '%' + cl.client_name + '%' or
cc.business='INSPECTION' and bil.header_dff_value13 like '%' + cl.client_name + '%' or
cc.business='INSPECTION' and bil.ship_to_party_name like '%' + cl.client_name + '%' or
cc.business='INSPECTION' and bil.header_dff_value6 like '%' + cl.client_name + '%' or
cc.business='AUDIT' and bil.customer_name like '%' + cl.client_name + '%' or
cc.business='AUDIT' and bil.header_dff_value13 like '%' + cl.client_name + '%' or
cc.business='AUDIT' and bil.ship_to_party_name like '%' + cl.client_name + '%' or
cc.business='AUDIT' and bil.header_dff_value6 like '%' + cl.client_name + '%' or
cc.business='TESTING' and bil.customer_name like '%' + cl.client_name + '%' or
cc.business='TESTING' and bil.header_dff_value12 like '%' + cl.client_name + '%' or
cc.business='TESTING' and bil.ship_to_party_name like '%' + cl.client_name + '%' )
你這樣的條件查出來的結果應該是不對的
再這,我認為你那塊條件可以不需要,你再上面已經處理過,下面還有意義嗎?
⑷ Sqlserver 語法優化
這樣的語句在寫法上的優化應該沒有什麼了,就是檢查一下查詢條件、相關聯欄位及group by 分組欄位有沒有索引,沒有的話可以加上索引來優化。
⑸ SQLServer求優化
因為你的查詢使用的是 【or】,這樣雖然你的資料庫上建了索引但是實際上,資料庫並沒有用到這個索引建議,拆開寫。
如:
select * from sms_history
where servertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'
union
select * from sms_history
where usertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'
再在(servertel,sendtime)和(usertel,sendtime)分別建個索引,估計能快些。
---
以上,希望對你有所幫助。
⑹ 求優化sqlserver語句,使它查詢效率提高。(要求:分組查詢每組最新的一條數據,數據量非常大,幾十萬)
關於題主的SQL語句提高效率的問題,請留意一下幾點
1) 輸出的欄位列表裡只有來自表「dbo.tunnel_online_monitoring 」里的欄位信息,沒有任何來欄位取自表「dbo.Threshold_ElectronicPool」,而且語句也沒為這兩張表指定連接條件,因此將表「dbo.Threshold_ElectronicPool」引入語句中就沒有任何必要,加入該表只會大大增加系統開銷,而無得益,應予以剔除;
2)row_number()函數的系統開銷是比較大的,能不用盡量別用它。
如果dbo.tunnel_online_monitoring.Id是唯一的,可以不使用row_number()函數,建議語句修改如下:
selectId,CreationDate,LastUpdate,tunnel_name,
SDMC,DT,DZSC1,DZSC2,DZSC3from
tunnel_online_monitoringwhereidin(
selectmax(a.id)fromdbo.tunnel_online_monitoringa,
(selecttunnel_name,max(CreationDate)asCreationDatefrom
dbo.tunnel_online_monitoringgroupbytunnel_name)b
wherea.tunnel_name=b.tunnel_nameanda.CreationDate
=b.CreationDategroupbyb.tunnel_name);
如果dbo.tunnel_online_monitoring.Id是自增ID,那麼可以根據ID的大小來判定那條記錄是最新的,這樣就不需要比對時間欄位的先後了,語句可簡化如下:
selectId,CreationDate,LastUpdate,tunnel_name,
SDMC,DT,DZSC1,DZSC2,DZSC3from
tunnel_online_monitoringwhereidin(
selectmax(id)fromdbo.tunnel_online_monitoring
groupbytunnel_name);
如果dbo.tunnel_online_monitoring.Id不是唯一的,那就還是得利用回row_number()函數了。
⑺ 如何做SqlServer 數據查詢優化!
一、建立索引
二、建立存儲過程
三、只查詢您所需要的數據,不要把所有數據都查詢出來,防止數據冗餘。
四、對於大量及海量數據一般還要建立分區
⑻ sqlserver 查詢的優化
試著創建一個函數索引:
dbo.getYearmonth(recdate,recdt)
⑼ sqlserver的分析優化工具有哪些
sql server profiler功能
此工具比柯南還柯南,因為他能檢測到資料庫中的一舉一動,即便你不動他,他也在監視你,他很賤的。他不但監視,還監視的很詳細,有多詳細一會再說,還把監視的內容記錄到資料庫或者是文件中,給你媳婦告狀說你把資料庫哪裡的性能搞的多麼不好,不過他也會把好的給你記錄下來,好與不好這當然需要你來分析,其實他也是個很2的柯南。
資料庫引擎優化顧問功能
此武功,乃上乘武功。像張無忌的乾坤大挪移,先是接受sql server profiler檢測出來的sql,視圖,存儲過程,數據結構等等,然後他再自己分析,然後再在懷中轉兩圈,感覺自己轉的差不多啦,就給拋出來個威力更炫,更好的索引,統計,分區等等建議信息。讓你承受不住,happly致死。