看你用什麼工具,如果是PL/sql,直接F5就好;
sqlplus的話,登陸成功後,先執行set autotrace on,然後在運行sql就可以看到了
② sql server怎麼查看執行計劃
方法/步驟
首先先建一個查詢的窗口中,選中資料庫,點擊新建查詢。
彈出了一個新建查詢的窗口的界面中,輸入需要執行的sql的語句。
sql輸入完成之後,選中需要的執行的sql的語句。
然後進行點擊菜單中的查詢的按鈕選項。
可以彈出下拉菜單中,進行選擇為顯示估計的執行計劃。
在執行窗口的界面中查看的執行計劃執行的內容了。
③ SQL的資料庫,一個表,120多萬條記錄,某個欄位上建了非聚集索引,然後查詢,查看計劃,還是表掃描呢
O(∩_∩)O哈哈哈~!老弟!不是這么玩的!
你那才區區120萬。
索引成不成功要看 IO消耗是否減少,
-----------------------------------------------------
第一,你要使用 SET SHOWPLAN_ALL ON
第二,如果是索引全掃描,那還不如不加呢。
-----------------------------------------------------
看我如下測試:
go
SET SHOWPLAN_ALL ON;
GO
SELECT *
FROM [Proct]
--where Proct_ID like 'P1014%' --這個就是索引跳躍了
where Proct_ID like '%P1014%'--這個就是全索引掃描
GO
SET SHOWPLAN_ALL OFF;
GO
---------------------------------------------------------------------
你比較IO消耗吧!
like %% 這種方式要Index Scan
like % 這種方式是 index seek 這說明索引就生效了
------------------------------------------------------------------------
然後看
EstimateIO
此運算符的預計 I/O 開銷*。僅限於 PLAN_ROWS 類型的行。
EstimateCPU
此運算符的預計 CPU 開銷*。僅限於 PLAN_ROWS 類型的行。
-----------------------------------------------
還有一些參數 你看官方網站吧!比我說的好!
-----------------------------------------------
還有掃描是否是全表,也要靠索引是否有效分類,原因特多呀。
比如沒有你的數據,還是要全表掃一下。
-------------------------------------------------
還是在說一遍吧!
是不是scan 不是看你得的那些數據,第一比較時間
------------------------------------------------------
go
SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT *
FROM [Proct]
--where Proct_ID like '%2%'
where Proct_Name like '蘋果%'
GO
SET STATISTICS PROFILE OFF
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
GO
-----------------------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:(dbo].[Proct].[PK_Proct]), WHERE:(dbo].[Proct].[Proct_Name] like N'蘋果%'))
如果有如上類似的條目就是 表 scan 了
如果有生效索引
必然有
index seek 之類的字眼
------------------------------------------------------------------------------------------
加索引 執行某些查詢時間短了,證明你就成功了
------------------------------------------------------------------------------------------
向你說的那個掃描計數--那個至少是1 根本沒有參考性。
----------------------------------------------------------------------------------------
時間變短了很容易比較吧?
還有你的是12萬數據,占表的10分之一,索引如果是樹形,你這也是大塊輸出。
估計效果也不明顯。
④ db2資料庫怎麼查看執行計劃
打開PL/SQL Developer軟體,請確保plsql能夠成功連接到一個oracle資料庫。
在PL/SQL Developer中寫好一段SQL代碼,按F5,或者點擊「執行執行計劃」圖標,PL/SQL Developer會自動打開執行計劃窗口,顯示該SQL的執行計劃。
可以看到窗口上方是sql語句,下方顯示執行計劃表格。表格的列主要包含描述、用戶、對象、成本花費、IO開銷等,表格,當然表格列還可以自定義。表格的行包含了查詢邏輯的執行順序和各個步驟信息。
執行計劃表格內容的執行順序是:按照從左至右,從上至下的步驟執行,具體是指執行計劃按照層次逐步縮進,從左至右看,縮進最多的那一步最先執行,如果縮進量相同,則按照從上而下的方法判斷執行順序。
通過查看執行計劃表格的cost列,即成本花費能夠知道哪個步驟花費的成本高,通過查看執行計劃表格的行中的objectname列,能夠知道是否使用到表中的索引
⑤ 如何查看資料庫執行計劃
一、通過PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在窗口中執行sql可以查看計劃結果。其中,Cost表示cpu的消耗,單位為n%,Cardinality表示執行的行數,等價Rows。
2、先執行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的執行計劃了,看到的結果和1中的一樣,所以使用工具的時候推薦使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。還有使用工具方法查看計劃看到的信息不全,有些時候我們需要sqlplus的支持。
二、通過sqlplus
⑥ 資料庫表數據量大怎麼優化查詢速度
下面以關系資料庫系統Informix為例,介紹改善用戶查詢計劃的方法。
1.合理使用索引
索引是資料庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用IBM最先提出的ISAM索引結構。索引的使用要恰到好處,其使用原則如下:
●在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的欄位則由優化器自動生成索引。
●在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。
●在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
●如果待排序的列有多個,可以在這些列上建立復合索引(compound index)。
●使用系統工具。如Informix資料庫有一個tbcheck工具,可以在可疑的索引上進行檢查。在一些資料庫伺服器上,索引可能失效或者因為頻繁操作而使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試著用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當資料庫表更新大量數據後,刪除並重建索引可以提高查詢速度。
2.避免或簡化排序
應當簡化或避免對大型表進行重復的排序。當能夠利用索引自動以適當的次序產生輸出時,優化器就避免了排序的步驟。以下是一些影響因素:
●索引中不包括一個或幾個待排序的列;
●group by或order by子句中列的次序與索引的次序不一樣;
●排序的列來自不同的表。
為了避免不必要的排序,就要正確地增建索引,合理地合並資料庫表(盡管有時可能影響表的規范化,但相對於效率的提高是值得的)。如果排序不可避免,那麼應當試圖簡化它,如縮小排序的列的范圍等。
3.消除對大型錶行數據的順序存取
在嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。比如採用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢10億行數據。避免這種情況的主要方法就是對連接的列進行索引。例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個表要做連接,就要在「學號」這個連接欄位上建立索引。
還可以使用並集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強迫優化器使用順序存取。下面的查詢將強迫對orders表執行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
4.避免相關子查詢
一個列的標簽同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。
5.避免困難的正規表達式
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE 「98_ _ _」
即使在zipcode欄位上建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >「98000」,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3]>「80」,在where子句中採用了非開始子串,因而這個語句也不會使用索引。
6.使用臨時表加速查詢
把表的一個子集進行排序並創建臨時表,有時能加速查詢。它有助於避免多重排序操作,而且在其他方面還能簡化優化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>「98000」
ORDER BY cust.name
如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個臨時文件中,並按客戶的名字進行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然後以下面的方式在臨時表中查詢:
SELECT * FROM cust_with_balance
WHERE postcode>「98000」
臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟I/O,所以查詢工作量可以得到大幅減少。
注意:臨時表創建後不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。
7.用排序來取代非順序存取
非順序磁碟存取是最慢的操作,表現在磁碟存取臂的來回移動。SQL語句隱藏了這一情況,使得我們在寫應用程序時很容易寫出要求存取大量非順序頁的查詢。
有些時候,用資料庫的排序能力來替代非順序的存取能改進查詢。
⑦ mysql 顯示查詢計劃 語法 怎麼寫
explain select * from Student
where 班級 in ('計算1311', '計算1312', '計算1313', '計算1314')
其實就是在你語句前面加explain即可
⑧ 如何查看sql2008資料庫備份計劃
打開SQL企業管理器,在SQLserver組中,選擇 『管理』 > 『資料庫維護計劃』 在右邊紅框位置的視圖,可以查看所有的數據備份計劃。雙擊計劃可以查看和修改具體的設置。
⑨ 淺談資料庫查詢優化的幾種思路
應盡量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引
可以幫助選擇更好的索引和優化查詢語句, 寫出更好的優化語句。 通常我們可以對比較復雜的尤其是涉及到多表的 SELECT 語句, 把關鍵字 EXPLAIN 加到前面, 查看執行計劃。例如: explain select * from news;
用具體的欄位列表代替「*」 , 不要返回用不到的任何欄位。
mysql innodb上的理解。
1,不需要的欄位會增加數據傳輸的時間,即使mysql伺服器和客戶端是在同一台機器上,使用的協議還是tcp,通信也是需要額外的時間。
2,要取的欄位、索引的類型,和這兩個也是有關系的。舉個例子,對於user表,有name和phone的聯合索引,select name from user where phone= 12345678912 和 select * from user where phone= 12345678912 ,前者要比後者的速度快,因為name可以在索引上直接拿到,不再需要讀取這條記錄了。
3,大欄位,例如很長的varchar,blob,text。准確來說,長度超過728位元組的時候,會把超出的數據放到另外一個地方,因此讀取這條記錄會增加一次io操作。
比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的欄位值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);
使用 procere analyse()函數對表進行分析, 該函數可以對表中列的數據類型提出優化建議。 能小就用小。 表數據類型第一個原則是: 使用能正確的表示和存儲數據的最短類型。 這樣可以減少對磁碟空間、 內存、 cpu 緩存的使用。
使用方法: select * from 表名 procere analyse();
通過拆分表可以提高表的訪問效率。 有 2 種拆分方法
1.垂直拆分
把主鍵和一些列放在一個表中, 然後把主鍵和另外的列放在另一個表中。 如果一個表中某些列常用, 而另外一些不常用, 則可以採用垂直拆分。
2.水平拆分
根據一列或者多列數據的值把數據行放到二個獨立的表中。
創建中間表, 表結構和源表結構完全相同, 轉移要統計的數據到中間表, 然後在中間表上進行統計, 得出想要的結果。
選擇多核和主頻高的 CPU。
使用更大的內存。 將盡量多的內存分配給 MYSQL 做緩存。
4.3.1 使用磁碟陣列
RAID 0 沒有數據冗餘, 沒有數據校驗的磁碟陳列。 實現 RAID 0至少需要兩塊以上的硬碟, 它將兩塊以上的硬碟合並成一塊, 數據連續地分割在每塊盤上。
RAID1 是將一個兩塊硬碟所構成 RAID 磁碟陣列, 其容量僅等於一塊硬碟的容量, 因為另一塊只是當作數據「鏡像」。使用 RAID-0+1 磁碟陣列。 RAID 0+1 是 RAID 0 和 RAID 1 的組合形式。 它在提供與 RAID 1 一樣的數據安全保障的同時, 也提供了與 RAID 0 近似的存儲性能。
4.3.2 調整磁碟調度演算法
選擇合適的磁碟調度演算法, 可以減少磁碟的尋道時間
對 MySQL 自身的優化主要是對其配置文件 my.cnf 中的各項參數進行優化調整。 如指定 MySQL 查詢緩沖區的大小, 指定 MySQL 允許的最大連接進程數等。
它的作用是存儲 select 查詢的文本及其相應結果。 如果隨後收到一個相同的查詢, 伺服器會從查詢緩存中直接得到查詢結果。 查詢緩存適用的對象是更新不頻繁的表, 當表中數據更改後, 查詢緩存中的相關條目就會被清空。
⑩ 如何看MS SQLSERVER資料庫的執行計劃
1.輸入一個查詢語句看看SQL Server是如何顯示查詢計劃的吧。
select v.OrderID, v.CustomerID, v.CustomerName, v.OrderDate, v.SumMoney, v.Finished
from OrdersView as v
where v.OrderDate >= '2010-12-1' and v.OrderDate < '2011-12-1';
其中,OrdersView是一個視圖,其定義如下:
SELECT dbo.Orders.OrderID, dbo.Orders.CustomerID, dbo.Orders.OrderDate,
dbo.Orders.SumMoney, dbo.Orders.Finished,
ISNULL(dbo.Customers.CustomerName, N'') AS CustomerName
FROM dbo.Orders LEFT OUTER JOIN
dbo.Customers ON dbo.Orders.CustomerID = dbo.Customers.CustomerID
對於前一句查詢,SQL Server給出的查詢計劃如下(點擊工具欄上的【顯示估計的執行計劃】按鈕):
從這個圖中,我們至少可以得到3個有用的信息:
1. 哪些執行步驟花費的成本比較高。顯然,最右邊的二個步驟的成本是比較高的。
2. 哪些執行步驟產生的數據量比較多。對於每個步驟所產生的數據量, SQL Server的執行計劃是用【線條粗細】來表示的,因此也很容易地從分辨出來。
3. 每一步執行了什麼樣的動作。
對於一個比較慢的查詢來說,我們通常要知道哪些步驟的成本比較高,進而,可以嘗試一些改進的方法。 一般來說,如果您不能通過:提高硬體性能或者調整OS,SQL Server的設置之類的方式來解決問題,那麼剩下的可選方法通常也只有以下這些了:
1. 為【scan】這類操作增加相應欄位的索引。
2. 有時重建索引或許也是有效的,具體情形請參考後文。
3. 調整語句結構,引導SQL Server採用其它的查詢方案去執行。
4. 調整表結構(分表或者分區)。