2013-06-12 5 views
-2

У меня есть две таблицы в базе: tb_CampaignLead и tb_Feed. Обе таблицы имеют тысячи строк и имеют по одному индексу на первичном ключе. tb_CampaignLead имеет на 20% больше данных, чем tb_Feed. Тем не менее tb_Feed в 6 раз медленнее, чем tb_CampaignLead для SELECT *. Может кто-нибудь рассказать мне, почему tb_Feed так медленно. В таблицах структуры приведены ниже:Таблица базы данных Slow

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 
+2

Вам нужно будет предоставить нам дополнительную информацию. Во-первых, что RDBMS (похоже, SQL Server)? Какова конфигурация вашего хранилища? – squillman

+0

Во-первых, как вы выполняете и измеряете 'SELECT *' на обеих этих таблицах. Опишите явно, что вы делаете, чтобы определить это. Во-вторых, что такое rowcount и dataspace (не включая индексы) этих двух таблиц? Вы можете получить информацию о таблице в Management Studio (SSMS), щелкнув правой кнопкой мыши на базе данных в области «Проводник», затем выберите «Отчеты ... Использование диска по таблице». Посмотрите в колонку «Данные (KB)» и сообщите нам, что это такое для обеих таблиц. – RBarryYoung

+0

@squillman Да, я использую SQL Server 2008 R2. Не могли бы вы объяснить, что вы подразумеваете под конфигурацией хранилища. – user2478704

ответ

2

Используя эту информацию из ваших комментариев:

DataSpace для campaignlead таблицы 734832 DataSpace для стола подачи составляет 2.595.792

Как вы можете видеть, несмотря на меньшее количество строк, общий объем данных для tb_Feed более чем в 3,5 раза больше, чем для tb_CampaignLead. Когда вы выполняете команду SELECT * From ... в SSMS, ей необходимо получить столько данных, форматировать их, протащить через сетевое соединение (если вы работаете с клиентом), а затем визуализировать его в выходной сетке.

Для небольших наборов данных это настолько быстро, что это не является значительной частью времени выполнения запроса. Кроме того, он может быть буферизирован, чтобы сделать его еще быстрее. Однако для больших наборов данных это может занять значительное количество времени, и выходные буферы/трубы начнут резервное копирование. Это может не только замедлить время выполнения запроса, но и стать его доминирующим фактором.

Так что для запросов такого размера в SSMS мы ожидаем, что tb_Feed займет около 3,5 раз дольше, чем tb_CampaignLead. Таким образом, хотя не совсем то же самое, ваши результаты, безусловно, находятся в правильном шаре.

В этих таблицах есть другие вещи, которые могут вызвать дополнительную разницу, в том числе, сколько данных NVARCHAR(MAX) хранится «вне столбца» для каждой таблицы. Вот еще один вопрос, который имеет некоторые ответы на это: Should I use an inline varchar(max) column or store it in a separate table?

+0

Возможно, база данных должна быть нормализована? Просто взглянув на таблицу «tb_CampaignLead», я могу увидеть по крайней мере 2 или 3 таблицы, которые можно было бы сделать с ней. И индексы (в меру) - тоже хорошо. –

+1

@ DaniellePaquette-Harvey Возможно. Но если они действительно хотят каждую строку каждого столбца в этой таблице, то нормализация не будет делать ее быстрее.Тем не менее, ИМХО, кажется маловероятным, что они действительно захотят этого нормально. – RBarryYoung

Смежные вопросы