C# SQL Server CE-性能不好

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

我正在开发一个使用SQLServerCE数据库的应用程序,查询的性能有问题。例如,获取客户上一次订单的简单查询:

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有订单的客户。