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 我在管理部分有一个页面用于管理订单,现在我想按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) 关于性能,你只需要测试它就可以找到答案. 索引是一件好事,您应该确保在外键列上有索引. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 无法创建XYZ.ashx类型
- 记一次ASP.NET MVC性能优化(实际项目中)
- asp.net-mvc – 是否可以手动更新ModelState.IsValid?
- asp.net – 使用jetBrains dotTrace检测W3WP CPU问题
- .net – SignalR – connection.hubName未定义
- asp.net – 如何让网站支持Windows Live Writer?
- 为什么ASP.NET抛出这么多异常?
- 【.Net码农】认识ASP.NET MVC的5种AuthorizationFilter
- 在asp.net中将大量数据导出到客户端
- asp.net – AppHarbor:不允许使用目录’/ App_GlobalResou