|
Программирование >> Полное сканирование таблицы
движется по направлению к верхушке экстента, по достижении которой выделяется новый экстент. Выше отметки заполнения находится пространство, зарезервированное для записи будущих данных, причем база данных никогда не обращается к этому пространству при считывании данных. Отметка заполнения не перемещается вниз, если только вы не перестраиваете или не усекаете таблицу. Рисунок 2.2 иллюстрирует схемы роста таблицы, описанные в следующих разделах. Обозначения: Экстент Самые новые строки Недавние, но не новые строки Самые старые строки Отметка заполнения таблицы Последовательное Удаление Удаление Полное удаление, увеличение самых старых данных рост с нуля данных вне зависимости от возраста Рис. 2.2. Увеличение и старение физической таблицы Последовательный рост Последовательный рост, показанный на экстенте Т1 (рис. 2.2), - это наиболее распространенная схема среди таблиц транзакций, когда постоянно добавляются новые строки, но практически никогда не удаляются старые. Ситуация, когда старые строки остаются в таблице, давно уже не принося никакой пользы, очень часто причиняет неудобства в работе. Однако приходится решать, какой вариант безопаснее. Удалять данные - это тяжелая (и небезопасная) работа, даже если не учитывать усилия, потраченные на написание выполняющих это задание процедур. Так или иначе, рассмотрение этого вопроса обычно оказывается в самом конце списка приоритетов для возможностей продукта (да и кому это нужно в первом выпуске продукта?), к большому удовольствию производителей жестких дисков. В последовательно растущих таблицах полезность строк уменьшается по мере их старения, поэтому более новые, удобно расположенные наверху таблицы строки, к которым чаще производятся обращения, легко кэшируются. Когда самые новые строки являются самыми горячими, естественная кластеризация новых строк позволяет оптимально использовать кэш, и даже в очень большой таблице коэф- Это описание наиболее точно подходт для Oracle, однако различия в этой области между продуктами разных поставщиков несущественны для настройки SQL. фициент попадания в кэш (доля операций логического ввода-вывода, для которых не требуется физический ввод-вывод) может быть очень хорошим, если вы используете индексный доступ, отсеивающий старые строки. Запрос, который считывает все строки последовательно растущей таблицы (до отметки уровня заполнения, конечно же), а затем удаляет практически все, за исключением нескольких самых новых строк, будет хорошо работать на новой маленькой таблице. Однако время обращения ко всей таблице растет линейно, если предположить постоянный коэффициент роста таблицы, и вскоре становится вовсе недопустимым. Путь доступа, включающий только новые строки, характеризуется практически постоянной эффективностью, если таблица растет равномерно, так как количество строк, созданных, например, в последнюю неделю, всегда практически постоянно. Удаление самых старых данных Схему удаления самых старых данных, показанную на рис. 2.2 для экстента Т2, я называю схемой Уробороса в честь мифической змеи, поедающей собственный хвост. В этой таблице самые старые строки периодически удаляются (все старые строки, а не какой-то их поднабор), полностью освобождая ранее занимаемые блоки для вставки новых строк. Отметка заполнения не двигается после достижения таблицей максимального размера, так как предполагается, что вы удаляете строки (однажды начав удаление) с той же скоростью, с которой вставляете новые. Голова змеи (где находятся новые строки) постоянно преследует хвост (где содержатся старые строки), который убегает при каждом удалении. С точки зрения хранения новых строк физически рядом эта схема имеет те же преимущества, что и схема постоянного роста. Причем, поскольку рост таблицы останавливается, как только начинается удаление, вероятность того, что вся таблица будет хорошо кэширова-на, увеличивается. Помните, что это идеальный случай, который редко встречается в реальных ситуациях, так как сохранение нескольких старых строк или скорость роста таблицы, превышающая скорость удаления строк, будет приводить к основательному смешиванию старых и новых строк. Удаление данных вне зависимости от возраста Удаление данных независимо от их возраста, показанное для экстента ТЗ на рис. 2.2, отражает схему удаления строк, которая не зависит от их возраста. Добавление новых данных в блоки разрешается сразу же, как только свободное пространство в них превышает определенный порог (обычно 60 % в Oracle); они остаются доступными для записи, пока свободное пространство в них не уменьшится до значения другого порога (обычно 10 % свободного пространства в Oracle). Это происходит с блоками, которые случайно разбросаны по таблице, поэтому новые строки вставляются неравномерно, а кэширование со временем усложняется как из-за того, что в среднем в блоках много свободного места, так и из-за того, что интересующие нас строки могут находиться в любой части таблицы. Однако такая схема удаления предполагает, что заинтересованность приложения в строках не зависит от их возраста, поэтому кэширование такой таблицы затруднено и без того, что удаление бессистемно разбрасывает новые строки. Полное удаление и рост с нуля Схема полного удаления и роста с нуля, показанная для экстента Т4 на рис. 2.2., отражает метод удаления всех данных для того, чтобы заполнение таблицы могло начаться заново. На рис. 2.2 все содержимое таблицы бьшо недавно удалено, и показанные самые старые строки на самом деле не слишком устарели. Таблица будет расти еще долго до того момента, как достигнет отметки заполнения. Эта схема похожа на схему последовательного роста, показанную на Т1, но, так как таблица уже достигала своего максимального значения и с тех пор не перестраивалась, отметка заполнения не опускалась. Поэтому при полном сканировании таблицы выполняется столько же физических операций ввода-вывода, сколько и до удаления. ПРИМЕЧАНИЕ - Команда Oracle TRUNCATE, в противоположность DELETE, может опускать отметку заполнения. В любой базе данных можно опустить отметку заполнения, удалив данные и перестроив таблицу. Индексы с функциональной точки зрения индексы не так фундаментальны, как таблицы. Это всего лишь способ быстрого обращения к строкам таблицы. Индексы чрезвычайно важны для получения высотсой производительности, но фактически не являются необходимыми. Индексы в В-деревьях Наиболее распространенный и важный тип индекса - это индекс в В-дереве, который отражает структуру дерева, сбалансированную (Б означает balanced) до определенной глубины от корня до листовых блоков по каждой ветви. На рис. 2.3 показано трехуровневое В-дерево, в виде которого можно представить индекс, указывающий на 90 000-27 ООО ООО строк в таблице (это обычный диапазон размеров для трехуровневых В-деревьев). Ветвь 1 Ветвь 2 Корень Ветвь 299 Ветвь 300
Листовыв блоки: (значение, идентификатор строки)... Рис 2.3. Индекс в трехуровневом В-дереве
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |