我在数据库中有两个表:tb_CampaignLead
和tb_Feed
。两个表都有数千行,主键上各有一个索引。 tb_CampaignLead
的数据比tb_Feed
多20%。对于tb_Feed
,tb_CampaignLead
仍然比SELECT *
慢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
答案 0 :(得分:2)
使用评论中的这些信息:
campaignlead表的数据空间为734,832,供稿表的数据空间为2,595,792
如您所见,尽管行数较少,但tb_Feed的总数据量是tb_CampaignLead的3.5倍。当您在SSMS中执行SELECT * From ...
时,它实际上必须检索那么多数据,格式化它,推送它通过网络连接(如果您从客户端运行),然后将其呈现到输出网格中。 / p>
对于小型数据集,这是如此之快,以至于它不是查询执行时间的重要部分。此外,它可以缓冲,使其看起来更快。但是,对于大型数据集,这可能需要相当长的时间,并且输出缓冲区/管道将开始备份。这不仅可以减慢查询执行时间,还可以成为其主导因素。
因此,对于SSMS中此大小的查询,我们实际上希望tb_Feed
比tb_CampaignLead
长约3.5倍。所以,虽然不完全一样,但你的结果肯定是在正确的球场。
这些表中还有其他一些因素可能导致额外的差异,包括每个表中“列外”存储了多少NVARCHAR(MAX)
个数据。这是另一个对此有一些答案的问题:Should I use an inline varchar(max) column or store it in a separate table?