2014-10-07 227 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,这是放缓这个简单的查询。