【发布时间】:2018-12-09 21:46:54
【问题描述】:
我想知道是否有更好的方法来编写这个 SQL。
CREATE TABLE #OrderTotals( [OrderID] uniqueIdentifier NULL, OrderTotal money
NULL)
CREATE NONCLUSTERED INDEX IDX_OrderTotals ON #OrderTotals(OrderID)
Insert #OrderTotals (OrderID, OrderTotal)
SELECT o.Id,
(CASE when o.OrderStatusId in (5,6,7) then
SUM(ISNULL(oi.[Price],0)*
ISNULL(oi.[InvoicedQty] ,0)+ ISNULL(oi.[TotalTax] ,0))
When o.OrderStatusId not in (5,6,7) then
SUM(ISNULL(oi.[Price],0)*(ISNULL(oi.[Quantity] ,0)
- ISNULL(oi.[DeniedQuantity] ,0)) + ISNULL(oi.
[TotalTax] ,0)) end) as OrderTotal
FROM orderItem oi
inner join [Order] o on o.Id = oi.orderId
WHERE (o.Code = 'abc')
group by o.id, o.OrderStatusId
我认为 CASE 对我的性能造成了影响,它使查询变慢。我在这里需要这个逻辑只是想知道是否有更好更有效的方法来编写它。
【问题讨论】:
-
样本数据和期望的结果真的很有帮助。
-
所以有很多数据,比如大约 100K+。有些字段有 NULL,所以这就是为什么要检查 ISNULL。
-
您需要一个聚集索引。我记得,如果在 SQL 2008 中没有它,您的表将非常低效。没有它,我相信服务器没有很好的方法来对磁盘上的数据进行排序,即使是暂时的。但这只是我的回忆。
标签: sql sql-server performance sql-server-2008