C# SQL Server CE-性能不好
我正在开发一个使用SQLServerCE数据库的应用程序,查询的性能有问题。例如,获取客户上一次订单的简单查询:C# SQL Server CE-性能不好,c#,sql,sql-server-ce,C#,Sql,Sql Server Ce,我正在开发一个使用SQLServerCE数据库的应用程序,查询的性能有问题。例如,获取客户上一次订单的简单查询: SELECT Customer.Name, Orders.Amount AS LastOrderAmount FROM Customers LEFT JOIN Orders ON Orders.OrderId IN (SELECT TOP(1) OrderId FROM Orders
SELECT
Customer.Name, Orders.Amount AS LastOrderAmount
FROM
Customers
LEFT JOIN
Orders ON Orders.OrderId IN (SELECT TOP(1) OrderId
FROM Orders
WHERE CustomerId = Customer.CustomerId
ORDER BY OrderNum DESC)
这个查询速度非常慢。只有30名顾客和大约300份订单,几乎需要10秒才能完成
我正在使用SqlCEDataAdapter
进行查询。我还尝试使用了SqlCeResultSet
,但差别可以忽略不计。另外,我在Orders.CustomerId上有一个索引(尽管创建它没有多大区别)
现在,我并不期待SQLServerCE出现奇迹,但这太可怕了。那么,我能做些什么来提高性能呢,还是速度太慢了?试试这个:
SELECT cus.Name
, outerOrd.Amount AS LastOrderAmount
FROM Customers cus
LEFT JOIN Orders outerOrd on outerOrd.CustomerId = cus.CustomerId
WHERE not exists (SELECT *
FROM Orders innerOrd
WHERE innerOrd.CustomerId = cus.CustomerId
and innerOrd.OrderId > outerOrd.OrderId
)
编辑,可能这更好:
SELECT cus.Name
, ord.Amount AS LastOrderAmount
FROM Customers cus
LEFT JOIN Orders ord on ord.CustomerId = cus.CustomerId
WHERE ord.OrderId = (SELECT max(OrderId)
FROM Orders
WHERE CustomerId = cus.CustomerId
)
你有索引吗?Customer.CustomerId和Order.OrderId是主键,Order.CustomerId是索引。你的查询看起来很奇怪(什么是
Ciklus.CiklusId
?)。我想你的结果可以通过MAX和GROUP-BY-syntax得到。也许发布表结构,有人会为此编写一个高效的查询。同意10秒对于这个任务来说是可笑的。Ciklus
表在哪里?2.你不应该使用TOP 1
和ORDER BY
,那样的话,你应该使用max(OrderNum)
哦,对不起,我在编辑查询时打错了。我不能使用MAX,因为我需要整个订单行。我对查询进行了编辑以使其更清晰。哇,这要快得多。谢谢尽管如此,另一个查询执行得如此之慢还是很糟糕。@kolufild检查一下我刚才添加的第二个查询。第二个查询不起作用,因为SqlCE不支持返回单个值的子查询。因此,order.OrderId=(SELECT
会引发错误。我认为左侧联接是多余的。我的意思是,既然您的目的是获取每个客户的最后订单金额,为什么您希望所有客户都没有订单?那么简单的联接就足够了。我想您应该尝试使用子查询联接客户,以获取每个客户的最后订单。无需Join有订单的客户。