【问题标题】:Database Table Slow [closed]数据库表慢[关闭]
【发布时间】:2013-06-08 16:53:17
【问题描述】:

我在数据库中有两个表:tb_CampaignLeadtb_Feed。这两个表都有数千行,并且在主键上各有一个索引。 tb_CampaignLead 的数据比 tb_Feed 多 20%。对于SELECT *tb_Feed 仍然比 tb_CampaignLead 慢 6 倍。谁能告诉我为什么tb_Feed 这么慢。表结构如下:

CREATE TABLE [dbo].[tb_Feed](
    [FeedID] [uniqueidentifier] NOT NULL,
    [DateCreated] [smalldatetime] NULL,
    [LeadSourceID] [int] NULL,
    [RawLeadURL] [nvarchar](max) NULL,
    [CostPerEnquiry] [money] NULL,
    [ResultText] [nvarchar](max) NULL,
    [SrcResultText] [nvarchar](max) NULL,
    [SrcResult] [bit] NULL,
    [Encrypted] [bit] NULL,
    [ProductID] [int] NULL,
 CONSTRAINT [PK_tb_Feed] PRIMARY KEY CLUSTERED 


CREATE TABLE [dbo].[tb_CampaignLead](
    [LeadID] [uniqueidentifier] NOT NULL,
    [FeedID] [uniqueidentifier] NOT NULL,
    [CampaignID] [int] NOT NULL,
    [ProductID] [int] NOT NULL,
    [CompanyID] [int] NOT NULL,
    [LeadSourceID] [int] NOT NULL,
    [DateCreated] [smalldatetime] NULL,
    [LeadTextEmail] [nvarchar](max) NULL,
    [LeadTextOther] [nvarchar](max) NULL,
    [DateSent] [smalldatetime] NULL,
    [EmailResponse] [nvarchar](max) NULL,
    [OtherResponse] [nvarchar](max) NULL,
    [EmailOK] [bit] NULL,
    [OtherOK] [bit] NULL,
    [ResultPass] [bit] NULL,
    [L_Title] [nvarchar](50) NULL,
    [L_Email] [nvarchar](100) NULL,
    [L_Firstname] [nvarchar](max) NULL,
    [L_Surname] [nvarchar](max) NULL,
    [L_Address1] [nvarchar](max) NULL,
    [L_Address2] [nvarchar](max) NULL,
    [L_Address3] [nvarchar](max) NULL,
    [L_TownCity] [nvarchar](max) NULL,
    [L_AreaRegion] [nvarchar](max) NULL,
    [L_Country] [nvarchar](max) NULL,
    [L_PostCode] [nvarchar](50) NULL,
    [L_Telephone1] [nvarchar](50) NULL,
    [L_Telephone2] [nvarchar](50) NULL,
    [L_DOB] [smalldatetime] NULL,
    [L_Extra1] [nvarchar](max) NULL,
    [L_Extra2] [nvarchar](max) NULL,
    [L_Extra3] [nvarchar](max) NULL,
    [L_Extra4] [nvarchar](max) NULL,
    [L_Extra5] [nvarchar](max) NULL,
    [L_Extra6] [nvarchar](max) NULL,
    [L_Extra7] [nvarchar](max) NULL,
    [L_Extra8] [nvarchar](max) NULL,
    [L_Extra9] [nvarchar](max) NULL,
    [L_Extra10] [nvarchar](max) NULL,
    [L_Extra11] [nvarchar](max) NULL,
    [L_Extra12] [nvarchar](max) NULL,
    [L_Extra13] [nvarchar](max) NULL,
    [L_Extra14] [nvarchar](max) NULL,
    [L_Extra15] [nvarchar](max) NULL,
    [L_Extra16] [nvarchar](max) NULL,
    [L_Extra17] [nvarchar](max) NULL,
    [L_Extra18] [nvarchar](max) NULL,
    [L_Extra19] [nvarchar](max) NULL,
    [L_Extra20] [nvarchar](max) NULL,
    [SourceCost] [money] NULL,
    [CampaignCost] [money] NULL,
    [DeliveredPass] [bit] NULL,
    [FieldReqBWAND] [int] NULL,
    [FieldSuppliedBWAND] [int] NULL,
    [FilterBWAND] [int] NULL,
    [FilterPassBWAND] [int] NULL,
    [OPFilterBWAND] [int] NULL,
    [OPFilterPassBWAND] [int] NULL,
    [ProcessBWAND] [int] NULL,
    [ProcessPassBWAND] [int] NULL,
    [L_MobileNetwork] [nvarchar](max) NULL,
    [SrcResultPass] [bit] NULL,
 CONSTRAINT [PK_tb_CampaignLead] PRIMARY KEY CLUSTERED 

【问题讨论】:

  • 您需要向我们提供更多信息。对于初学者,什么 RDBMS(看起来像 SQL Server)?您的存储配置是什么?
  • 首先,您如何在这两个表上执行和测量SELECT *。明确描述您为确定这一点所做的工作。其次,这两个表的行数和数据空间(不包括索引)是多少?您可以通过右键单击资源管理器窗格中的数据库,然后选择 Reports..Disk Usage by Table 来获取 Management Studio (SSMS) 中的表信息。查看Data(KB) 列并告诉我们这两个表的含义。
  • @squillman 是的,我使用的是 SQL Server 2008 R2。你能解释一下存储配置是什么意思吗?
  • @RBarryYoung 我正在从 SQL Server 管理工作室执行查询。我打开实际执行计划和客户端统计 SELECT * from tb_CampaignLead 总行数:463352 总执行时间:63118 Select * from tb_feed 总行数:363387 总执行时间:418337 所有查询都在清除缓存后运行,campaignlead 表的数据空间为 734832 feed 表的数据空间是 2595792

标签: sql-server database performance sql-server-2008-r2


【解决方案1】:

使用来自您的 cmets 的信息:

campaignlead 表的数据空间是 734,83​​2,feed 表的数据空间是 2,595,792

如您所见,尽管行数较少,但 tb_Feed 的数据总量是 tb_CampaignLead 的 3.5 倍多。当您在 SSMS 中执行SELECT * From ... 时,它实际上必须检索那么多数据、对其进行格式化、通过网络连接将其推送(如果您从客户端运行),然后将其渲染到输出网格中。

对于小型数据集,这非常快,以至于它不是查询执行时间的重要部分。另外,它可以被缓冲以使其看起来更快。但是,对于大型数据集,这可能需要相当长的时间,并且输出缓冲区/管道将开始备份。这不仅会减慢查询执行时间,实际上还会成为其主导因素。

因此,对于 SSMS 中这种大小的查询,我们实际上预计 tb_Feed 所花费的时间大约是 tb_CampaignLead 的 3.5 倍。因此,虽然不完全相同,但您的结果肯定是正确的。

这些表中还有其他可能导致额外差异的因素,包括每个表“列外”存储的NVARCHAR(MAX) 数据量。这是另一个对此有一些答案的问题:Should I use an inline varchar(max) column or store it in a separate table?

【讨论】:

  • 也许数据库需要规范化?只需查看“tb_CampaignLead”表,我就可以看到至少 2 或 3 个可以用它制作的表。索引(适度)也是一件好事。
  • @DaniellePaquette-Harvey 可能。但是如果他们真的想要这个表中每一列的每一行,那么规范化不会让它变得更快。但是,恕我直言,他们似乎不太可能真的想要正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多