如何提高子查询的性能或 sql 中子查询的替代方案

Posted

技术标签:

【中文标题】如何提高子查询的性能或 sql 中子查询的替代方案【英文标题】:How to improve the performance of subquery or an alternative to subquery in tsql 【发布时间】:2012-11-28 09:04:38 【问题描述】:

我正在使用以下查询在我的一个 java swing 应用程序中显示记录。此查询执行速度非常慢。有什么办法可以通过提高性能来获得结果

有什么办法可以在更小的时间间隔内完成任务。

select d.orderid,d.ordername,d.design,isnull(e.OrderQty,0) OrderQty
from 
(
select a.orderid,ordername,design
from filerorn a,ordersNew.dbo.orders b where a.orderid=b.orderid and sub_stage = 'G'
And a.id =@Id
)d
LEFT JOIN
(
select a.OrderId,a.Design,( case when b.ItemId is null 
then a.Qty else 1 end) -isnull(c.Qty,0) OrderQty from 
OrdersNew..ordersDesign a
left join
OrdersNew..OrdersBGTPDesign b
on a.OrderId=b.OrderId and  a.Design
COLLATE DATABASE_DEFAULT
=b.Design COLLATE DATABASE_DEFAULT and a.Sno=b.SNo
left join 
( select a.OrderId,Design,Qty from ExcludeDesign a
left join
dbo.ExcludeDesign_d b
on a.ID=b.ID

)c
on a.OrderId=c.OrderId and a.Design
COLLATE DATABASE_DEFAULT
=c.Design COLLATE DATABASE_DEFAULT and a.Sno=c.Sno

)e
ON d.OrderId=e.OrderId and d.Design COLLATE DATABASE_DEFAULT
=e.Design  COLLATE DATABASE_DEFAULT
and d.sno=e.Sno
and d.ItemId=e.ItemId 
order by d.ordername,d.design,d.sno,d.Itemid 
select d.orderid,d.ordername,d.design,isnull(e.OrderQty,0) OrderQty
from 
(
select a.orderid,ordername,design
from filerorn a,ordersNew.dbo.orders b where a.orderid=b.orderid and sub_stage = 'G'
And a.id =@Id
)d
LEFT JOIN
(
select a.OrderId,a.Design,( case when b.ItemId is null 
then a.Qty else 1 end) -isnull(c.Qty,0) OrderQty from 
OrdersNew..ordersDesign a
left join
OrdersNew..OrdersBGTPDesign b
on a.OrderId=b.OrderId and  a.Design
COLLATE DATABASE_DEFAULT
=b.Design COLLATE DATABASE_DEFAULT and a.Sno=b.SNo
left join 
( select a.OrderId,Design,Qty from ExcludeDesign a
left join
dbo.ExcludeDesign_d b
on a.ID=b.ID

)c
on a.OrderId=c.OrderId and a.Design
COLLATE DATABASE_DEFAULT
=c.Design COLLATE DATABASE_DEFAULT and a.Sno=c.Sno

)e
ON d.OrderId=e.OrderId and d.Design COLLATE DATABASE_DEFAULT
=e.Design  COLLATE DATABASE_DEFAULT
and d.sno=e.Sno
and d.ItemId=e.ItemId 
order by d.ordername,d.design,d.sno,d.Itemid 

orderdesign 和 orders 有数百万条记录

Edit

15%

select a.orderid,ordername,design
from filerorn a,ordersNew.dbo.orders b where a.orderid=b.orderid and sub_stage = 'G'
And a.id =@Id

46%

select a.OrderId,a.Design,( case when b.ItemId is null 
then a.Qty else 1 end) -isnull(c.Qty,0) OrderQty from 
OrdersNew..ordersDesign a
left join
OrdersNew..OrdersBGTPDesign b
on a.OrderId=b.OrderId and  a.Design

【问题讨论】:

您是否使用查询分析器确定查询中最慢的部分在哪里? 为什么要在这里指定排序规则? a.Design COLLATE DATABASE_DEFAULT = b.Design COLLATE DATABASE_DEFAULT 请您包括表的架构和数据库的默认排序规则吗?了解字段是否具有不同的排序规则和/或数据库默认值是否与这些字段不同是很重要的。如果您在查询中强制更改排序规则顺序,这将是非常昂贵的。 是的,我这样做是因为两个表的排序方式不同,因为它会产生错误 @down voter 必须解释你反对这个问题的观点。 【参考方案1】:

如何创建一个视图并弹出一些索引以加快搜索速度。如果您不喜欢查看视图,或者在您的表上创建索引以加快搜索速度。

【讨论】:

删除你的答案我想删除这个问题@user1811846

以上是关于如何提高子查询的性能或 sql 中子查询的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

如何提高包含部分公共子查询的 SQL 查询性能

优化 SQL:如何重写此查询以提高性能? (使用子查询,摆脱 GROUP BY?)

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

JPA 性能优化或替代方案

以另一种方式提高动态 SQL 查询性能或过滤记录

sql 查询的正确语法和 WHERE EXISTS 替代方案