2010-08-05 6 views
1

INFORMIX-SE:Является ли CLUSTER INDEX желательным при загрузке отсортированного загрузочного файла в новую таблицу?

Мои пользователи периодически запускать скрипт SQL [REORG.SQL], который выгружает все строки из таблицы в отсортированном порядке в двух отдельных файлах (Активны и Inactives), падает таблица, повторно создает table, загружает отсортированные файлы загрузки в него, создает индекс кластера в одном столбце. Я сортировал свои файлы разгрузки, создавал другие поддерживающие индексы и обновлял свою статистику.

(См REORG.SQL скрипт на: SE: 'bcheck -y' anomaly)

(Также см: customer.pk_name joining transactions.fk_name vs. customer.pk_id [serial] joining transactions.fk_id [integer] по причине, почему кластер индекс по имени и не pk_id [серийный номер] = fk_id [INT])

С моей REORG .SQL-скрипт, у меня были проблемы с постоянством индексного файла, поэтому я подозревал, что CLUSTER INDEX имеет к этому какое-то отношение и создал индекс без кластеризации, и проблемы исчезли!

Теперь мой вопрос: если мне удастся загрузить все данные о транзакциях, отсортированные по полному имени клиента во вновь созданной таблице, мне действительно необходимо создать индекс CLUSTER, если на самом деле строки уже отсортированы в том же порядке, что и кластеризация? .. Я знаю, что кластеризованный индекс начинает терять свою кластеризацию при добавлении новых строк, так что в чем преимущество создания индекса кластера? .. оптимизатор запросов использует преимущества кластеризации против. некластеризованный индекс, когда строки по существу находятся в одном кластерном порядке? .. Кто-нибудь сталкивался с проблемами IDX/DAT-файла при кластеризации таблицы? .. Возможно, у моего SQL-скрипта что-то не так? (ПОЖАЛУЙСТА, ОБРАТИТЕ МОЙ СЦЕНАРИЙ КОДА МЕНЯ, ЧТОБЫ УВИДЕТЬ, ЕСЛИ Я ЧТО-ТО ЧТОБЫ НЕПРАВИЛЬНО?)

ответ

2

Сценарий выгружает активные и неактивные транзакции в два разных файла с каждым файлом, отсортированным по имени клиента. Затем он загружает их обратно в таблицу, активные транзакции сначала, а затем неактивные транзакции. Затем создается кластерный индекс по имени клиента. Проблема заключается в том, что теперь база данных должна возвращаться и переназначать физические строки по имени клиента при построении кластерного индекса. Хотя каждый из файлов разгрузки отдельно заказывается по имени клиента, когда они объединены, результат не упорядочивается по имени клиента, что приводит к большей работе для базы данных. Если отдельные файлы для активных и неактивных транзакций не нужны в другом месте, вы можете попробовать просто сбросить все транзакции в один файл, упорядоченный по имени клиента, а затем повторно загрузить таблицу из этого единственного файла. В этот момент данные в таблице будут упорядочены по имени клиента, а кластерному индексу create не нужно будет переупорядочивать данные.

Что касается нужного кластеризованного индекса - кластерный индекс может иметь значение, если вы используете этот столбец для запроса, поскольку это должно помочь уменьшить количество операций ввода-вывода, необходимых для извлечения данных. Обычно кластерные индексы создаются в столбцах, которые монотонно возрастают, поэтому, возможно, TRX_NUM будет служить столбцом, который будет называться кластеризованным индексом.

Делитесь и наслаждайтесь.

+0

+1 - Кластеризованные индексы МОГУТ пострадать от удара по производительности, когда вы вставляете неупорядоченные строки в таблицу, но обычно вы восполняете его, если вы кластерируете в нужное поле. Столбцы идентичности являются классическим примером кластеризации. – JNK

+0

@Bob: Вы правильно относитесь к двум загружаемым файлам, физически не загружающим строки транзакций каждого клиента, поэтому я ранее создал кластерный индекс, но испытывал проблемы с IDX-файлом. Я выбрал кластер с полным именем клиентов, потому что я использую экраны выполнения I-SQL, и когда пользовательский запрос клерков по имени клиента в главном, все транзакции, принадлежащие каждому клиенту, автоматически запрашиваются и время отклика выполняется быстрее. объединение по имени, а не pk_id [serial] = fk_id [int], см. http://stackoverflow.com/questions/3066714 –

+0

@JNK: Какая производительность ударила? ..Поэтому, если мне удастся загрузить все строки транзакций, упорядоченные cust_fullname, это будет по сути то же самое, что и кластеризация, и этот порядок не будет поддерживаться после добавления новых транзакций, поэтому лучше просто создать некластеризованный индекс на имя, так как .DAT уже физически упорядочен по имени? –