2015-01-22 5 views
0

У меня проблема с моими индексами на две таблицы.Фрагментация индекса SQL Server

Вот код для создания таблиц:

CREATE TABLE [dbo].[Table] 
(
    [ID] [uniqueidentifier] NOT NULL, 
    [IP] [nvarchar](15) NULL, 
    [Referrer] [nvarchar](1000) NULL, 
    [Domain] [nvarchar](100) NULL, 
    [RegID] [int] NULL, 
    [Agent] [nvarchar](500) NULL, 

    CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
    ([ID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[Table] 
    ADD CONSTRAINT [DF_Table_ID] DEFAULT (newsequentialid()) FOR [ID] 
GO 

и указательным

CREATE NONCLUSTERED INDEX [Reg_ID] ON [dbo].[Table] 
(
    [RegID] ASC 
) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
     SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

И еще одну таблицу с индексом

CREATE TABLE [dbo].[Table2] 
(
    [Table2_ID] [int] IDENTITY(1,1) NOT NULL, 
    [TracID] [uniqueidentifier] NOT NULL, 
    [F_URL] [nvarchar](1500) NULL, 
    [S_URL] [nvarchar](100) NULL, 
    [Time] [datetime] NULL, 

    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([Table2_ID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[Table2] WITH CHECK 
    ADD CONSTRAINT [FK_Table2_Table] 
    FOREIGN KEY([TracID]) REFERENCES [dbo].[Table] ([Web_Visitor_ID]) 
GO 

ALTER TABLE [dbo].[Table2] CHECK CONSTRAINT [FK_Table2_Table] 
GO 

Index

CREATE NONCLUSTERED INDEX [IX_TracID] ON [dbo].[Table2] 
(
    [TracID] ASC 
) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

В первой таблице у меня около 6M строк и во вторых 8-м рядах (по несколько тысяч каждый день).

У меня проблема, потому что индексы фрагментированы до 99% за 4 часа.

бегает запрос (sys.columns), чтобы получить размер в байтах, и есть результаты

Table 1     Table 2 
name  bytes   name  bytes 
ID   16    ID   4 
IP   30    TracID  16 
Referrer 2000   F_URL  3000 
Domain  200   S_URL  200 
RegID  4    Time   8 
Agent  1000 

Кто-нибудь есть идея ведьма может помочь мне исправить эту фрагментацию?

+0

Плановое обслуживание для восстановления индексов .... –

ответ

0

Вы уверены, что вам нужно дефрагментировать? При правильном оборудовании фрагментация редко имеет значение. Многие люди из старой школы SQL по-прежнему рекомендуют это, но на самом деле в большинстве случаев это реликвия прошлого.

Есть две причины, по которым это стало неуместным. Во-первых, все чтения должны быть кэшированы в ОЗУ (если нет, вам нужно больше оперативной памяти - это дешево и даст вам больше возможностей для доллара, чем потраченная дефрагментация). Во-вторых, SSD устраняют времена поиска в любом случае, поэтому фрагментация не имеет значения. В результате этих двух изменений время, затрачиваемое на дефрагментацию, обычно теряется.

+0

С 99% фрагментированными индексами. Моя процедура хранения работает от 0,5 до 5 часов (зависит от периода времени), но с 0% фрагментированными индексами она заканчивается от минуты до 20 минут. Я сначала использую, чтобы исправить индексы, и после этого я продолжу работу, чтобы оптимизировать процедуры хранения. –

+0

Аппаратное обеспечение - 8 ГБ оперативной памяти, виртуальные диски sas и процессор 4core. –

+0

. Каков ваш коэффициент попаданий в кеш и насколько велика ваша база данных? – James

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