使用具有中等数据的表提高 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 查询性能的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL Server:分区表分区索引 详解

如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?

sqlserver中分表和分库有啥区别

Sql server not in优化

JDBC如何连接SQL Server数据库实现增删改查

NewRelic 在具有适当索引的表之一上报告的 SQL Server 2008 查询缓慢