none
Группы файлов в БД SQL Server 2000 RRS feed

  • Вопрос

  • BOL:

    Filegroups allow files to be grouped together for administrative and data allocation/placement purposes. For example, three files (Data1.ndf, Data2.ndf, and Data3.ndf) can be created on three disk drives, respectively, and assigned to the filegroup fgroup1. A table can then be created specifically on the filegroup fgroup1. Queries for data from the table will be spread across the three disks, thereby improving performance.

    Ситуация:

    База данных состоит из трех групп файлов: PRIMARY, GKTables, GKIndexes.

    Раньше в каждой группе было по одному файлу.

    Теперь сделали еще по одному файлу в каждой группе.

    В базе данных есть таблицы с данными, а есть пустые таблицы.

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

    Означает ли это, что параллельное распределение данных по файлам группы будет происходить только при добавлении данных в пустые таблицы? А при добавлении данных в непустые таблицы, существовавшие до создания второго файла, параллельного распределения не будет?

    26 декабря 2006 г. 11:32

Ответы

Все ответы

  • Заскриптуйте и приведите здесь скрипт создания базы и создания таблицы, в которой наблюдается проблема.
    26 декабря 2006 г. 11:52
  • When a table or index is created without specifying a filegroup, it is assumed all pages will be allocated from the default filegroup.

    USE MyDB;
    CREATE TABLE MyTable
      ( cola int PRIMARY KEY,
        colb char(8) )
    ON MyDB_FG1;
    GO

    фактически, уже созданные таблицы у вас принадлежат группе default.

    можно сменить

    alter table

    MOVE TO ( partition_scheme_name ( column_name [ 1, ... n] ) | filegroup | "default"}

    Specifies a location to move the data rows currently in the leaf level of the clustered index. The table is moved to the new location.

    Note   In this context, default is not a keyword. It is an identifier for the default filegroup and must be delimited, as in MOVE TO "default" or MOVE TO [default]. If "default" is specified, the QUOTED_IDENTIFIER option must be ON for the current session. This is the default setting. For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

    Кроме того, в BOL в разделе "filegroups-> fill stategy" сказано, что данные распределяться пропорционально свободному месту (и меряются в extent'ах)

    26 декабря 2006 г. 13:05
  • >фактически, уже созданные таблицы у вас принадлежат группе default.

    Совершенно верно. Это было описано в условии. Теперь в группу default я добавил второй файл данных и поместил его на отдельный RAID-массив.

    >можно сменить

    Менять ничего не нужно. Нужно, чтобы данные распределялись равномерно по двум файлам, принадлежащим к одной группе файлов.

    26 декабря 2006 г. 16:07
  • Вадим, пожалуйста, чтобы можно было разобраться в проблеме, а не гадать о настройках.
    Заскриптуйте и приведите здесь скрипт создания базы и создания таблицы, в которой наблюдается проблема.
    26 декабря 2006 г. 17:06
  • Завтра выложу скрипт - сейчас базы нет под рукой.

    Только в файле данных из группы, для которой создавался второй файл, находится не одна таблица. Гм... Скажем так - далеко не одна. И проблема не в одной-двух таблицах. Вы уверены, что нужно скриптовать создание ВСЕХ таблиц?

    26 декабря 2006 г. 17:38
  • 2 Данила Полевщиков
    > alter table MOVE TO ( partition_scheme_name ( column_name [ 1, ... n] ) | filegroup | "default"}

    Вообще-то я веду речь об SQL Server 2000.

    26 декабря 2006 г. 17:44
  •  Vadim Solnychko написано:

    Завтра выложу скрипт - сейчас базы нет под рукой.

    Только в файле данных из группы, для которой создавался второй файл, находится не одна таблица. Гм... Скажем так - далеко не одна. И проблема не в одной-двух таблицах. Вы уверены, что нужно скриптовать создание ВСЕХ таблиц?

    Для понимания проблемы достаточно заскриптовать одну любую проблемную таблицу.

    26 декабря 2006 г. 21:20
  • Совершенно не обязательно, что данные сразу начнуть заполнять добавленный к файловой группе файл. В имеющемся файле может быть достаточно места (фрагментация и т.п.) что бы разложить данные согласно ключей кластерных индексов. Вот когда в первом файле места для равномерного распределения ключей уже не останется, тогда данные наверняка польются в новые файлы.

    Можно попробовать пересоздать индексы для всей базы или избранных таблиц.

    Ещё один (варварский) метод равномерного распределения данных между файлами, это когда вместо одного файла, Вы создали бы два и перенесли в них данные скриптом, наподобии показанного в BOL:

    DBCC SHRINKFILE ('ИМЯФАЙЛА', EMPTYFILE)
    GO

    Потом очищенный файл можно просто удалить...

    27 декабря 2006 г. 6:48
  • 2 Alexander Gladchenko

    >Ещё один (варварский) метод равномерного распределения данных между файлами

    Хотелось бы действовать цивилизованными методами.

    > Вот когда в первом файле места для равномерного распределения ключей уже не останется, тогда данные наверняка польются в новые файлы.

    Вы описываете поведение сиквела при создании второго файла журнала транзакций.

    Может, я невнятно изложил проблему? Попробую еще раз.

    Есть два дисковых массива RAID10 - в каждом по 20 дисков. Общий объем каждого RAID-массива - 168 Гб.

    Из-за аппаратных ограничений нельзя собрать один RAID10 из 40 дисков.

    Поэтому впервые решили воспользоваться продекларированной возможностью сиквела параллельно читать/писать сразу в 2 файла одной файловой группы.

    Подытожив все материалы, прочитанные на эту тему, мы пришли к выводу, что запись данных должна идти параллельно сразу в 2 файла одной файловой группы.

    Мы отдавали себе отчет, что, возможно, данные, уже имеющиеся в базе, не будут записаны во второй файл, а останутся в первом.

    Однако мы считали, что при добавлении данных эти данные начнут писаться параллельно в два файла.

    Залили в базу около 300 Мб.

    Первый файл группы увеличился, второй остался пустым.

    Приращение файлов автоматическое. Вы советуете подождать, пока не заполнится 168 Гб дискового пространства. Только после этого будет идти запись во второй файл? Но такой вариант нас не устраивает. Если поведение сиквела действительно такое, то лучше уж тогда ручками перенести на второй RAID хотя бы индексы таблиц. И в документации надо бы тогда конкретно указать, что параллельной записи нет, ждите, пока заполнится первый файл данных.

     

    27 декабря 2006 г. 7:21
  • 2 PM - MCSE

     

    ***Создание базы

    IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'mosobl_rash1')
     DROP DATABASE [mosobl_rash1]
    GO

    CREATE DATABASE [mosobl_rash1]  ON (NAME = N'new2003_dat', FILENAME = N'd:\MSSQL\f1obl2006.mdf' , SIZE = 5087, FILEGROWTH = 10%), (NAME = N'data1', FILENAME = N'c:\MSSQL\data1_Data.NDF' , SIZE = 1, FILEGROWTH = 10%) LOG ON (NAME = N'new2003_log', FILENAME = N'd:\MSSQL\f1obl2006.LDF' , SIZE = 15, FILEGROWTH = 10%)
     COLLATE Cyrillic_General_CI_AS
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILEGROUP [GKTables]
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILE(NAME = N'fobl2006_gk_tables', FILENAME = N'd:\MSSQL\f1obl2006_gk_tables.ndf' , SIZE = 1, FILEGROWTH = 10%) TO FILEGROUP [GKTables]
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILE(NAME = N'data3', FILENAME = N'c:\MSSQL\data3_Data.NDF' , SIZE = 1, FILEGROWTH = 10%) TO FILEGROUP [GKTables]
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILEGROUP [GKIndexes]
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILE(NAME = N'fobl2006_gk_indexes', FILENAME = N'd:\MSSQL\f1obl2006_gk_indexes.ndf' , SIZE = 71, FILEGROWTH = 10%) TO FILEGROUP [GKIndexes]
    GO
    ALTER DATABASE [mosobl_rash1] ADD FILE(NAME = N'data2', FILENAME = N'c:\MSSQL\data2_Data.NDF' , SIZE = 1, FILEGROWTH = 10%) TO FILEGROUP [GKIndexes]
    GO

    exec sp_dboption N'mosobl_rash1', N'autoclose', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'bulkcopy', N'true'
    GO

    exec sp_dboption N'mosobl_rash1', N'trunc. log', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'torn page detection', N'true'
    GO

    exec sp_dboption N'mosobl_rash1', N'read only', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'dbo use', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'single', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'autoshrink', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'ANSI null default', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'recursive triggers', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'ANSI nulls', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'concat null yields null', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'cursor close on commit', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'default to local cursor', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'quoted identifier', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'ANSI warnings', N'false'
    GO

    exec sp_dboption N'mosobl_rash1', N'auto create statistics', N'true'
    GO

    exec sp_dboption N'mosobl_rash1', N'auto update statistics', N'true'
    GO

    if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
     exec sp_dboption N'mosobl_rash1', N'db chaining', N'false'
    GO

    *** Создание таблицы в группе файлов PRIMARY

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ACC_BACC]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ACC_BACC]
    GO

    CREATE TABLE [dbo].[ACC_BACC] (
     [ACCOUNT] [int] NULL ,
     [BACCOUNT] [int] NULL ,
     [ACT_PAS] [int] NULL ,
     [REG] [int] NULL ,
     [TYPE_ACC] [int] NULL ,
     [LINK] [int] IDENTITY (1, 1) NOT NULL ,
     [PARENT_ACC] [int] NULL
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[ACC_BACC] WITH NOCHECK ADD
     CONSTRAINT [PK_ACC_BACC_01] PRIMARY KEY  CLUSTERED
     (
      [LINK]
     ) WITH  FILLFACTOR = 80  ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[ACC_BACC] ADD
     CONSTRAINT [IX_ACC_BACC] UNIQUE  NONCLUSTERED
     (
      [ACCOUNT],
      [BACCOUNT]
     ) WITH  FILLFACTOR = 80  ON [PRIMARY]
    GO

    *** Содание таблицы и ее индексов в других группах файлов

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_gkKBK_gkContracts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    ALTER TABLE [dbo].[gkKBK] DROP CONSTRAINT FK_gkKBK_gkContracts
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_gkSubjects_gkContracts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    ALTER TABLE [dbo].[gkSubjects] DROP CONSTRAINT FK_gkSubjects_gkContracts
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_gkSuppliers_gkContracts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    ALTER TABLE [dbo].[gkSuppliers] DROP CONSTRAINT FK_gkSuppliers_gkContracts
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trgDelgkContracts]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[trgDelgkContracts]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trgInsgkContracts]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[trgInsgkContracts]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[trgUpdgkContracts]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[trgUpdgkContracts]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[itrgInsgkContracts]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[itrgInsgkContracts]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[itrgUpdgkContracts]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
    drop trigger [dbo].[itrgUpdgkContracts]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[gkContracts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[gkContracts]
    GO

    CREATE TABLE [dbo].[gkContracts] (
     [timestamp] [timestamp] NOT NULL ,
     [gkid] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
     [sprmethodid] [int] NOT NULL ,
     [gknumber] [char] (20) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [gkdate] [datetime] NOT NULL ,
     [jrnnumber] [char] (20) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [jrndate] [datetime] NULL ,
     [dateofdoc] [datetime] NOT NULL ,
     [customerid] [int] NOT NULL ,
     [acc01id] [int] NULL ,
     [acc02id] [int] NULL ,
     [ofkid] [int] NOT NULL ,
     [currencyid] [int] NOT NULL ,
     [dateofend] [datetime] NOT NULL ,
     [reason] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [dateofreason] [datetime] NOT NULL ,
     [dateofresult] [datetime] NOT NULL ,
     [price] [decimal](18, 2) NOT NULL ,
     [executed] [tinyint] NOT NULL ,
     [dateofexecuted] [datetime] NULL ,
     [status] [tinyint] NOT NULL ,
     [updins_reason] [varchar] (266) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [updins_date] [datetime] NOT NULL ,
     [login] [varchar] (254) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [dbuser] [varchar] (254) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [yearofstart] [smallint] NOT NULL ,
     [customerkppid] [int] NULL ,
     [pubpravid] [int] NOT NULL ,
     [vnbid] [int] NULL ,
     [numizv] [char] (17) COLLATE Cyrillic_General_CI_AS NOT NULL ,
     [numizm] [int] NULL ,
     [name_ruk] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
     [date_ruk] [datetime] NULL ,
     [dol_isp] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
     [name_isp] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
     [date_isp] [datetime] NULL ,
     [in_file] [char] (15) COLLATE Cyrillic_General_CI_AS NULL ,
     [out_file] [char] (15) COLLATE Cyrillic_General_CI_AS NULL ,
     [reference] [varchar] (254) COLLATE Cyrillic_General_CI_AS NULL ,
     [state] [char] (10) COLLATE Cyrillic_General_CI_AS NULL
    ) ON [GKTables]
    GO

     CREATE  CLUSTERED  INDEX [idxDateOfDoc_gkContracts] ON [dbo].[gkContracts]([dateofdoc]) ON [GKTables]
    GO

    ALTER TABLE [dbo].[gkContracts] ADD
     CONSTRAINT [DF_gkContracts_sprmethodid] DEFAULT (0) FOR [sprmethodid],
     CONSTRAINT [DF_gkContracts_gknumber] DEFAULT ('') FOR [gknumber],
     CONSTRAINT [DF_gkContracts_gkdate] DEFAULT (getdate()) FOR [gkdate],
     CONSTRAINT [DF_gkContracts_jrnnumber] DEFAULT ('') FOR [jrnnumber],
     CONSTRAINT [DF_gkContracts_jrndate] DEFAULT (getdate()) FOR [jrndate],
     CONSTRAINT [DF_gkDetails_dateofdoc] DEFAULT (getdate()) FOR [dateofdoc],
     CONSTRAINT [DF_gkContracts_customerid] DEFAULT (0) FOR [customerid],
     CONSTRAINT [DF_gkContracts_ofkid] DEFAULT (0) FOR [ofkid],
     CONSTRAINT [DF_gkContracts_dateofend] DEFAULT (getdate()) FOR [dateofend],
     CONSTRAINT [DF_gkContracts_reason] DEFAULT ('') FOR [reason],
     CONSTRAINT [DF_gkContracts_dateofreason] DEFAULT (getdate()) FOR [dateofreason],
     CONSTRAINT [DF_gkContracts_dateofresult] DEFAULT (getdate()) FOR [dateofresult],
     CONSTRAINT [DF_gkContracts_price] DEFAULT (0) FOR [price],
     CONSTRAINT [DF_gkContracts_executed] DEFAULT (0) FOR [executed],
     CONSTRAINT [DF_gkContracts_dateofexecuted] DEFAULT (getdate()) FOR [dateofexecuted],
     CONSTRAINT [DF_gkContracts_status] DEFAULT (1) FOR [status],
     CONSTRAINT [DF_gkDetails_staus_reason] DEFAULT ('Ввод нового документа') FOR [updins_reason],
     CONSTRAINT [DF_gkDetails_updins_date] DEFAULT (getdate()) FOR [updins_date],
     CONSTRAINT [DF_gkDetails_login] DEFAULT (suser_sname()) FOR [login],
     CONSTRAINT [DF_gkDetails_dbuser] DEFAULT (user_name()) FOR [dbuser],
     CONSTRAINT [DF_gkContracts_yearofstart] DEFAULT (0) FOR [yearofstart],
     CONSTRAINT [DF_gkContracts_pubpravid] DEFAULT (0) FOR [pubpravid],
     CONSTRAINT [DF_gkContracts_numizv] DEFAULT ('') FOR [numizv],
     CONSTRAINT [DF_gkContracts_numizm] DEFAULT (0) FOR [numizm],
     CONSTRAINT [DF_gkContracts_in_file] DEFAULT ('') FOR [in_file],
     CONSTRAINT [DF_gkContracts_out_file] DEFAULT ('') FOR [out_file],
     CONSTRAINT [DF_gkContracts_reference] DEFAULT ('') FOR [reference],
     CONSTRAINT [DF_gkContracts_state] DEFAULT ('') FOR [state],
     CONSTRAINT [PK_gkContracts] PRIMARY KEY  NONCLUSTERED
     (
      [gkid]
     )  ON [GKIndexes] ,
     CONSTRAINT [chkCustomerAcc_gkContracts] CHECK ([acc01id] is not null or [acc02id] is not null),
     CONSTRAINT [chkDateOfEnd_gkContracts] CHECK ([dateofend] >= [gkdate]),
     CONSTRAINT [chkDateOfExecuted_gkContracts] CHECK ([dateofexecuted] is null and ([executed] = 1 or [executed] = 0) or [dateofexecuted] is not null and [executed] > 1 and [dateofexecuted] >= [gkdate]),
     CONSTRAINT [chkExecuted_gkContracts] CHECK ([executed] = 3 or ([executed] = 2 or ([executed] = 1 or [executed] = 0))),
     CONSTRAINT [chkGKNumber_gkContracts] CHECK ([gknumber] <> ''),
     CONSTRAINT [chkJrnNumberDate_gkContracts] CHECK ([jrnnumber] = '' and [jrndate] is null or [jrnnumber] <> '' and [jrndate] is not null),
     CONSTRAINT [chkPrice_gkContracts] CHECK ([price] > 0),
     CONSTRAINT [chkReason_gkContracts] CHECK ([reason] <> ''),
     CONSTRAINT [chkStatus_gkContracts] CHECK ([status] = 4 or ([status] = 3 or ([status] = 2 or [status] = 1))),
     CONSTRAINT [chkStatusExecuted_gkContracts] CHECK ([status] = 1 and [executed] = 0 or [status] = 2 and [executed] = 1 or ([status] = 4 or [status] = 3) and ([executed] = 3 or [executed] = 2))
    GO

     CREATE  INDEX [idxSprMethodID_gkContracts] ON [dbo].[gkContracts]([sprmethodid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxGKDate_gkContracts] ON [dbo].[gkContracts]([gkdate]) ON [PRIMARY]
    GO

     CREATE  INDEX [idxJrnNumber_gkContracts] ON [dbo].[gkContracts]([jrnnumber]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxCustomerID_gkContracts] ON [dbo].[gkContracts]([customerid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxAcc01ID_gkContracts] ON [dbo].[gkContracts]([acc01id]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxAcc02ID_gkContracts] ON [dbo].[gkContracts]([acc02id]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxOfkID_gkContracts] ON [dbo].[gkContracts]([ofkid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxCustomerKppID_gkContracts] ON [dbo].[gkContracts]([customerkppid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxPubPravID_gkContracts] ON [dbo].[gkContracts]([pubpravid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxVnbID_gkContracts] ON [dbo].[gkContracts]([vnbid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxCurrencyID_gkContracts] ON [dbo].[gkContracts]([currencyid]) ON [GKIndexes]
    GO

     CREATE  INDEX [idxvGKPlat_gkContracts] ON [dbo].[gkContracts]([jrnnumber], [gknumber], [yearofstart], [dateofend], [gkid]) ON [GKIndexes]
    GO

    ALTER TABLE [dbo].[gkContracts] ADD
     CONSTRAINT [FK_gkContracts_gkSprMethod] FOREIGN KEY
     (
      [sprmethodid]
     ) REFERENCES [dbo].[gkSprMethod] (
      [sprmethodid]
     )
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    27 декабря 2006 г. 7:48
  • Всем спасибо, проблема решена.

    Файлы данных нужно делать одинакового размера и желательно с одинаковым приращением.

    27 декабря 2006 г. 8:24
  • Смотрю Вы и сами разобрались. Если подитожить, то проблема в том, что новые файлы, которые вы добавляли в базу имели маленький начальный размер, а уже существующий файл был намного большего размера.

    А алгоритм выделения места под новые записи основан на соотношении размеров свободного места в файлах.

    SQL Server allocates a new extent to an object only when it cannot quickly find a page in an existing extent with enough space to hold the row being inserted. SQL Server allocates extents from those available in the filegroup using a proportional allocation algorithm. If a filegroup has two files, one of which has twice the free space of the other, two pages will be allocated from the file with more empty space for every one page allocated from the other file. This means that every file in a filegroup should have a similar percentage of space used.

    http://msdn.microsoft.com/library/en-us/architec/8_ar_da2_1bar.asp

    27 декабря 2006 г. 22:44