我有以下查询。是否可以用其他方式编写,以最大限度地缩短执行时间并优化性能?
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
答案 0 :(得分:2)
不要使用*
(全部)仅使用您需要的列名称
select `col1`,`col2` from `table`
此外,如果速度是优先级,我建议您不要对查询进行排序。您可以使用以下代码: -
select `cols` from `dbo`.`Products` where `Products`.`ProId`='P01'
然后在您的编程语言中,使用if-else-if
或switch-case
来获取查询并对数据进行排序。但是,我建议使用sql对几千行的数据进行排序和排列。
答案 1 :(得分: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
答案 2 :(得分:0)
这是一个非常简单的选择声明,所以我不认为你可以做很多事情。除了在Products表的ProdId列上创建索引之外,我想不出别的。
注意:我是甲骨文家伙
答案 3 :(得分:0)
使用解释计划。这始终是优化信息的第一步。但请注意,在您的情况下,为每个Address01 / 03/04/05分类使用一个。
如果我不得不猜测我会说你的ORDER BY
会减慢这个简单的查询速度。
答案 4 :(得分:0)
尝试一下:
declare @addPrefix as Varchar(10)
set @addPrefix = 'ADD02'
select case @addPrefix
when 'ADD01' then 'Address01'
when 'ADD02' then 'Address01'
when 'ADD03' then 'Address03'
when 'ADD04' then 'Address04'
when 'ADD05' then 'Address05'
end as orderbycolumn, *
from dbo.Products where Products.ProdId='P01'
order by orderbycolumn, Products.ProdName desc