目前我正面临查询和存储过程的性能问题。以下是场景:
我们在一个数据库中有 3-4 个表 ( SQL Server 2000 SP4
),它们有大量的记录。其中一张表有超过 2500 万条记录。这些表维护着销售记录,并且每天都有数千条记录添加到其中。每当执行存储过程时,都需要 15-30 分钟才能完成。表上有 3-4 个连接。用户经常抱怨它。索引是正确的。为了提高性能,我们实现了分区视图。该解决方案是通过参考MSDN上的以下文章实现的
我们已按年拆分销售记录,性能有所提高,查询/存储过程现在需要 3-5 分钟才能运行。为了进一步提高性能,我们按月拆分销售记录。我们维护了 4 年的数据,现在我们接近拥有 48 个销售数据表(按月拆分销售数据后)。我期待这可以提高性能。但这并没有发生。该查询的执行速度比前一个(按年拆分数据)慢得多,这让我感到惊讶。同样在查看查询计划后,我发现它正在对所有 48 个销售表进行索引扫描,而不是仅扫描相关表。例如,当查询存储期间19-NOV-2012
和的过程时20-DEC-2012
,它应该只考虑 2 个表NOV-2012
和DEC-2012
. 但它正在考虑所有 48 张桌子。所以我的问题是:
为什么要考虑所有表而不是只考虑相关表。例如在上面的例子中
NOV-2012
和DEC-2012
为什么按年逻辑(按年拆分销售记录)比按月逻辑(按月拆分销售记录)表现更好
以下是分区视图的代码。
例如年 其他年份被省略。
SELECT * FROM tbl_Sales_Jan2010
UNION ALL
SELECT * FROM tbl_Sales_Feb2010
UNION ALL
SELECT * FROM tbl_Sales_Mar2010
UNION ALL
SELECT * FROM tbl_Sales_Apr2010
UNION ALL
SELECT * FROM tbl_Sales_May2010
UNION ALL
SELECT * FROM tbl_Sales_Jun2010
UNION ALL
SELECT * FROM tbl_Sales_Jul2010
UNION ALL
SELECT * FROM tbl_Sales_Aug2010
UNION ALL
SELECT * FROM tbl_Sales_Sep2010
UNION ALL
SELECT * FROM tbl_Sales_Oct2010
UNION ALL
SELECT * FROM tbl_Sales_Nov2010
UNION ALL
SELECT * FROM tbl_Sales_Dec2010
以下是表结构。
CREATE TABLE [dbo].[tbl_Sales_Jan2010](
[SalesID] [numeric](10, 0) NOT NULL,
[StoreNumber] [char](3) NOT NULL,
[SomeColumn1] [varchar](15) NOT NULL,
[Quantity] [int] NOT NULL,
[SalePrice] [numeric](18, 2) NOT NULL,
[SaleDate] [datetime] NOT NULL,
[DeptID] [int] NOT NULL,
[CatCode] [char](3) NOT NULL,
[AuditDate] [datetime] NOT NULL CONSTRAINT [DF_tbl_Sales_Jan2010_EditDate] DEFAULT (getdate()),
[SomeColumn2] [varchar](15) NULL,
[SaleMonthYear] [int] NULL CONSTRAINT [DF__tbl_Sales__SaleY__Jan2010] DEFAULT (12010),
[SaleDateInIntFormat] [int] NULL,
CONSTRAINT [PK_tbl_Sales_Jan2010] PRIMARY KEY CLUSTERED
(
[SalesID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tbl_Sales_Jan2010] WITH CHECK ADD CHECK (([SaleMonthYear] = 12010))
以下是查询
SELECT SUM(C.Quantity) as total
FROM Productdatabase.dbo.tbl_Product A , Productdatabase.dbo.tbl_Product_Category B, XDatabase.dbo.vw_Sales_Test C, tbl_Store D
WHERE A.ProductID = B.ProductID AND B.CategoryID = @CateID
AND C.SomeColumn = A.PRoductCode
AND D.StoreCode = C.StoreNumber
AND D.country = @country
AND D.status = 0
And C.SaleMonthYear between @BeginMonthYear and @EndMonthYear
AND C.SalDate between @FromSaleDate and @ToSaleDate