2010-11-01 53 views
7

我很擅長數據庫(sql)編程部分,但我想進入數據庫優化部分,如:何時何地索引,如何決定哪個查詢比其他更好,如何優化數據庫。你能指導我一些很好的資源或書籍,可以引導我這麼做嗎?好資源學習數據庫優化部分

+1

您使用的是什麼RDBMS?由於查詢分析器/優化器是不同的,因此很多這將是特定於RDBMS的。 – JNK 2010-11-01 15:51:52

+0

我正在使用SQL SERVER。 – 2010-11-01 15:54:09

回答

0

我最近一直專注於我的公司,並且我學到了一些有關具體查詢優化的有趣事情。

我一次運行SQL Profiler達半小時,並且記錄了需要1000次或更多次的查詢(之後需要50次CPU或更多)。

我最初專注於具有最高讀取和CPU的個別查詢。但是,在將日誌寫入數據庫後,我能夠查詢聚合結果以查看哪些查詢需要最多的聚合讀取和CPU。針對這些實際上幫助的不僅僅是針對最昂貴的查詢。

最昂貴的查詢可能每天運行一次,所以優化它是很好的。但是,如果第10個最昂貴的查詢每小時運行100次,那麼首先對其進行優化會更有幫助。

這裏是我到目前爲止已經學到了總結,它可以幫助你在確定優化查詢開始:

A Beginner's Guide to Database Query Optimization

Highly Inefficient Linq Queries that Break Database Indexing

An Obscure Performance Pitfall for Test Accounts and Improperly Indexed Database Tables

0

請找數據庫/查詢優化的一些技巧。

應用功能參數,而不是列

一個看數據庫查詢時所看到的最常見的錯誤,就是使用不當的對數據庫表的功​​能。無論何時我們需要將一個函數應用於某個列並根據某個值驗證結果,都需要檢查我們是否具有可以應用於給定列的反向函數。通過這種方式,數據庫引擎可以對該列使用索引,並且不需要定義基於功能的索引。

針對60行表沒有索引任何,以下查詢

SELECT ticker.SYMBOL, 
ticker.TSTAMP, 
ticker.PRICE 
FROM ticker 
WHERE TO_CHAR(ticker.TSTAMP, 'YYYY-MM-DD') = '2011-04-01' 

執行0.006s,反之, 「反向」 查詢

SELECT ticker.SYMBOL, 
ticker.TSTAMP, 
ticker.PRICE 
FROM ticker 
WHERE 
ticker.TSTAMP = TO_DATE('2011-04-01', 'YYYY-MM-DD') 

- 在0執行。004S

EXISTS子句,而不是IN(子查詢)

數據庫開發的另一種觀察模式,是人們選擇容易的,最方便的解決方案,併爲這篇文章中,我們將看看在發現一個元素在一個列表中。最簡單和最方便的解決方案是使用IN運算符。

SELECT symbol, tstamp, price 
FROM ticker 
WHERE price IN (3,4,5); 

--or SELECT符號,TSTAMP,價格 FROM股票 WHERE價格IN(SELECT價格從閾WHERE行動= '好');

當我們有一個小的可管理列表時,這種方法是可以的。當列表變得非常龐大並且列表是動態的時候(它將根據我們只有在運行時纔會生成的參數來生成),這種方法對於數據庫而言往往變得非常昂貴。另一種選擇方案是在下面的代碼片段所示使用EXISTS操作的:

SELECT symbol, tstamp, price 
FROM ticker t 
WHERE EXISTS (SELECT 1 FROM threshold m WHERE t.price = m.price AND m.action = 'Buy'); 

這種方法會更快,因爲一旦發動機已經找到了打擊,這將退出看上去條件已經證明是正確的。使用IN,它將在進一步處理之前收集子查詢中的所有結果。