加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如何优化T-SQL查询

发布时间:2020-12-16 07:44:38 所属栏目:asp.Net 来源:网络整理
导读:我正在编写一个T-SQL查询,我正在开发电子商务网站,因为我使用了4个主要表: ProductCategory 产品 OrderLineItem 订单 我在管理部分有一个页面用于管理订单,现在我想按ProductCategory过滤,即哪个订单包含与所选ProductCategory相关的Product(我的productId
我正在编写一个T-SQL查询,我正在开发电子商务网站,因为我使用了4个主要表:

> ProductCategory
>产品
> OrderLineItem
>订单

我在管理部分有一个页面用于管理订单,现在我想按ProductCategory过滤,即哪个订单包含与所选ProductCategory相关的Product(我的productId在OrderLineItem表中),我这样做是通过以下查询:

SELECT  
    O.OrderID,O.[OrderDate],O.[StatusID]                          
FROM [Order] O                              
INNER JOIN [Dyve_User] U ON U.[UserID] = O.[UserID]                               
INNER JOIN (SELECT OD.OrderID 
            FROM OrderLineItem OD
            LEFT OUTER JOIN [Product] P ON OD.ProductID = P.ProductID
            LEFT OUTER JOIN [ProductCategory] PC ON PC.CategoryID = P.CategoryID
            WHERE 
               (P.CategoryID = COALESCE(@CategoryID,P.CategoryID)                              
                OR P.CategoryID IN (SELECT CategoryID 
                                    FROM ProductCategory                              
                                    WHERE ParentID = COALESCE(@CategoryID,ParentID)
                                   )
               )                              
           ) AS T  ON O.OrderID = T.OrderID

我的这个查询返回正确的结果,但查询每次都超时,任何人都可以告诉我如何优化这个查询,这样就不会超时吗?

以下是表模式:

CREATE TABLE [dbo].[Order](
[OrderID] [int] IDENTITY(1,1) NOT NULL,[OrderDate] [datetime] NULL,[OrderTax] [money] NULL,[OrderTotal] [money] NULL,[ShippingCharge] [money] NULL,[TrackingNumber] [varchar](50) NULL,[TransactionStatusID] [int] NULL,[UserID] [int] NULL,[PromotionCode] [varchar](50) NULL
[ExpiryDate] [datetime] NULL,[PaymentType] [tinyint] NULL
  CONSTRAINT [Order_PK] PRIMARY KEY CLUSTERED 
  (
[OrderID] ASC
 )WITH (PAD_INDEX  = OFF,STATISTICS_NORECOMPUTE  = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS  = ON,ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

产品表:

CREATE TABLE [dbo].[Product](
[ProductID] [int] IDENTITY(1,[CategoryID] [int] NULL,[ProductName] [nvarchar](600) NULL,[ManufacturerID] [int] NULL,[UnitPrice] [money] NULL,[RetailPrice] [money] NULL,[IsOnSale] [bit] NOT NULL,[ExpiryDate] [datetime] NULL,[IsElectrical] [bit] NULL,[IsActive] [bit] NULL,[ProductType] [int] NULL,[AllowBackOrder] [bit] NULL
   CONSTRAINT [Product_PK] PRIMARY KEY CLUSTERED 
   (
[ProductID] ASC
    )WITH (PAD_INDEX  = OFF,ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
   ) ON [PRIMARY]

ProductCategory表:

CREATE TABLE [dbo].[ProductCategory](
[CategoryID] [int] IDENTITY(1,[Name] [nvarchar](100) NOT NULL,[Description] [nvarchar](max) NULL,[ParentID] [int] NULL,[IsActive] [bit] NULL
    CONSTRAINT [ProductCategory_PK] PRIMARY KEY CLUSTERED 
   (
[CategoryID] ASC
   )WITH (PAD_INDEX  = OFF,ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  ) ON [PRIMARY]

OrderLineItem表:

CREATE TABLE [dbo].[OrderLineItem](
[OrderDetailID] [int] IDENTITY(1,[OrderID] [int] NOT NULL,[ProductID] [int] NOT NULL
[TotalPrice] [money] NULL,[Quantity] [int] NULL,[Discount] [money] NULL,CONSTRAINT [OrderLineItem_PK] PRIMARY KEY CLUSTERED 
      (
[OrderDetailID] ASC
   )WITH (PAD_INDEX  = OFF,ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
   ) ON [PRIMARY]

解决方法

这没有经过测试,因此我不确定它是否仍然符合您的查询要求.

它将获取具有OrderLineItem的Orders,其中ProductID的CategoryID等于@CategoryID或子类别为@CategoryID.

SELECT O.OrderID,O.[StatusID]
FROM   [Order] AS O
WHERE  O.OrderID IN (SELECT OD.OrderID
                     FROM   OrderLineItem AS OD
                            INNER JOIN Product AS P
                              ON OD.ProductID = P.ProductID
                            INNER JOIN (SELECT PC.CategoryID
                                        FROM   ProductCategory
                                        WHERE  ParentID = @CategoryID
                                        UNION ALL
                                        SELECT @CategoryID) AS C
                              ON P.CategoryID = C.CategoryID)

关于性能,你只需要测试它就可以找到答案.

索引是一件好事,您应该确保在外键列上有索引.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读