2014-10-07 183 views
0

我有以下查詢。它是否可以用其他方式編寫以最小化執行時間並優化性能?優化SQL查詢性能

declare @addPrefix as Varchar(10) 
set @addPrefix = 'ADD02' 
select * from dbo.Products where Products.ProdId='P01' order by 
case @addPrefix 
    when 'ADD01' then 'Address01' 
    when 'ADD02' then 'Address01' 
    when 'ADD03' then 'Address03' 
    when 'ADD04' then 'Address04' 
    when 'ADD05' then 'Address05' 
end, Products.ProdName desc 

回答

2

不要使用*(全部)只使用你需要像

select `col1`,`col2` from `table` 

另外,我建議你不要排序的查詢,如果速度是優先級列的名稱。您可以使用下面的代碼: -

select `cols` from `dbo`.`Products` where `Products`.`ProId`='P01' 

,然後在您的編程語言,使用if-else-ifswitch-case得到查詢和排序的數據。不過,我建議使用sql對數千行數據進行排序和排列。

0

這是一個非常簡單的select語句,所以我不認爲你可以做很多事情。除了在Products表的ProdId列上創建索引,我不能想到其他任何東西。

注意:我是Oracle的傢伙

1

我不明白你爲什麼要在select中選擇case語句。這將在select語句中的每一行進行驗證。因爲它是一個變量,並不依賴於select中的任何內容。我會這樣做:

DECLARE @order VARCHAR(10) 
declare @addPrefix as Varchar(10) 

set @addPrefix = 'ADD02' 
SET @order= 
( 
    case @addPrefix 
    when 'ADD01' then 'Address01' 
    when 'ADD02' then 'Address01' 
    when 'ADD03' then 'Address03' 
    when 'ADD04' then 'Address04' 
    when 'ADD05' then 'Address05' 
    END 
) 

然後對變量進行查詢。像這樣:

select * from dbo.Products 
where Products.ProdId='P01' 
order by 
@order, Products.ProdName desc 
0

使用解釋計劃。這總是第一個獲得優化信息的地方。但是請注意,在您的情況下,請使用Address01/03/04/05中的每一種排序。

如果我不得不猜測,我會說這是你的ORDER BY,這是放緩這個簡單的查詢。