使用具有中等数据的表提高 SQL Server 查询性能
Posted
技术标签:
【中文标题】使用具有中等数据的表提高 SQL Server 查询性能【英文标题】:Improve SQL Server query performance with table having medium data 【发布时间】:2014-01-27 11:37:04 【问题描述】:我有一个包含 6000 条记录的表,但将来可能会更大。我附上了当前 SQL 查询的屏幕转储,加载 6000 行数据需要 12 到 14 秒。
查询频率最高的列上已经有索引了
如何提高查询性能或修改查询?
CREATE TABLE [dbo].[Item]
(
[Srno] [BIGINT] IDENTITY(1, 1) NOT NULL,
[ITEMCode] [BIGINT] NOT NULL,
[BranchId] [BIGINT] NOT NULL,
[ITEM_No] [VARCHAR](50) NULL,
[ITEM_Desc] [VARCHAR](200) NULL,
[DeptId] [BIGINT] NULL,
[CatId] [BIGINT] NULL,
[SizeId] [BIGINT] NULL,
[CostPrice] [DECIMAL](18, 3) NULL,
[SalesPrice] [DECIMAL](18, 2) NULL,
[ITEM_InStock] [BIGINT] NULL,
[UserId] [BIGINT] NULL,
[Active] [BIT] NOT NULL,
[IsDeleted] [BIT] NOT NULL,
[Quantity] [INT] NULL,
[IsFavourite] [BIT] NULL,
[IsProductLink] [BIT] NULL,
CONSTRAINT [PK_Item_1] PRIMARY KEY CLUSTERED ( [ITEMCode] ASC, [BranchId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
ON [PRIMARY]
ALTER TABLE [dbo].[Item]
WITH CHECK ADD CONSTRAINT [FK_Item_Item] FOREIGN KEY([ITEMCode], [BranchId]) REFERENCES [dbo].[Item] ([ITEMCode], [BranchId])
GO
ALTER TABLE [dbo].[Item]
CHECK CONSTRAINT [FK_Item_Item]
GO
ALTER TABLE [dbo].[Item]
ADD CONSTRAINT [DF_Item_ITEM_UnitPrice] DEFAULT ((0)) FOR [CostPrice]
GO
ALTER TABLE [dbo].[Item]
ADD CONSTRAINT [DF_Item_ITEM_RETAILPRICE] DEFAULT ((0)) FOR [SalesPrice]
GO
ALTER TABLE [dbo].[Item]
ADD CONSTRAINT [DF_Item_ITEM_InStock] DEFAULT ((0)) FOR [ITEM_InStock]
GO
ALTER TABLE [dbo].[Item]
ADD CONSTRAINT [DF_Item_Active] DEFAULT ((0)) FOR [Active]
GO
ALTER TABLE [dbo].[Item]
ADD CONSTRAINT [DF_Item_DelFlag] DEFAULT ((0)) FOR [IsDeleted]
GO
我已更新查询并删除了 Department 表的联接,但仍需要 10 秒
SELECT Item.ITEMCode AS ItemId,
ISNULL(Item.ITEM_No, '0') AS ItemNo,
isnull(Item.Barcode, '') AS Barcode,
Item.ITEM_Desc AS ItemName,
isnull(item_Imagepath, '') AS ItemImage,
0 AS availableQty,
Item.SalesPrice AS Price,
isnull(Item.TaxApply, 0) AS isTax,
Item.TaxType,
ISNULL(Item.ITM_Type, '0') AS ITMType,
Item.Profit_Type AS ProfitType,
Item.Profit_Amt AS ProfitAmt,
Item.CostPrice,
ISNULL(Item.ITEM_Remarks, '') AS Remark
FROM Item
【问题讨论】:
请将您的查询添加为 SQL 文本(而不是屏幕截图)!还请发布您的表结构和确切的索引定义,以便我们知道我们在这里看到什么......Department
中有多少行? Item
有多少行?来自Department
的估计行数和实际行数是多少?除非桌子很大,否则该计划的 12 到 14 秒看起来很慢。查询得到什么等待类型?
我讨厌distinct
:) 它的成本很高,而且大多数时候它的使用条件都不够好。也许您可以进行一些重构并删除distinct
?
提示:使用WHERE 1=1
,这样您就可以随时添加以AND ...
开头的新条件;)
项目总行数 - 6016,部门总行数 - 15
【参考方案1】:
如果读取 6000 条(小)记录需要 10 秒,那么我只能假设/希望您的连接在这里引入了很多延迟!?!
您可以尝试以下方法,看看需要多长时间吗?
SET STATISTICS TIME ON
SELECT * INTO #test FROM [Item]
如果它运行得很快,那么我会寻找加快计算机与 Azure 服务器之间连接的方法。 (网络数据包大小?)
【讨论】:
大声笑,只注意到这个 Q 可以追溯到 14 年 1 月 =)以上是关于使用具有中等数据的表提高 SQL Server 查询性能的主要内容,如果未能解决你的问题,请参考以下文章