2013-08-07 7 views
1

У меня есть две таблицы в двух схемах - schema1 и schema2. Обе таблицы имеют одинаковую конструкцию, за исключением того, что Schema2 имеет кластерный индекс первичного ключа таблиц.Как индекс влияет на результат двух таблиц - один с индексом, а другой без индекса?

таблица SCHEMA1 не имеет первичный ключ (Это как старый дизайн был и Я, чтобы обновить его с новой конструкцией схемы, которая SCHEMA2)

В схеме 2, col_1 является первичным ключом table1 и (COL_4, COL_12) являются ключами для таблицы 2, которые индексируются.

Table1 (col_1, col_2, col_3, col_4 ... col_10) Table2 (col_1, col_4, col_12, .... col_20)

У меня есть запрос, который извлекает данные из table1, и как следует

SELECT t1.COL_1,t1.COL_2, t1.COL_3, t1.COL_4,t1.COL_5 
FROM table1 t1 
LEFT JOIN table2 t2 ON 
    t2.COL_1 = t1.COL_1, 
    AND t2.COL_4 = t1.COL_4 
WHERE 
    t1.col_10 = '/some string/' 

Когда я запускаю этот запрос в обеих схемах, я получаю количество строк, полученных таким же образом. Но порядок строк не совпадает, и я не знаю, как сравнивать данные в обоих.

Мои вопросы.

  1. Могу ли я предположить, что оба результата в двух схемах совпадают, только совпадающие с совпадением строк?
  2. Выполняются ли разные результаты, если есть индекс в таблицах в схеме2?

Я хотел бы иметь представление о вышеуказанном поведении.

Заранее спасибо.

+0

'Могу ли я предположить, что оба результата в двух схемах совпадают, просто 'coz rowcount match?' Я бы не стал. 'Отличаются ли результаты, если, так как есть индекс в таблицах в schema2?' Что касается порядка, вероятно. Проверьте план выполнения, чтобы подтвердить –

ответ

0

Таблица 1/Схема 1 представляет собой таблицу кучи, вы вставляете запись, которая добавляется в конец этой таблицы. Когда вы запрашиваете эту таблицу, записи (но не считаются) возвращаются в том же порядке, в который они вставляются.

Таблица 2/Схема 2 представляет собой кластерную таблицу индексов, то есть когда вы вставляете запись в эту таблицу, она вставляется между записями, если это необходимо (или добавляется, если первичный ключ новой записи больше, чем все остальные существующие). Когда вы запрашиваете эту таблицу, записи возвращаются (но не учитываются в ней) в порядке сортировки первичного ключа.

Если вы хотите сравнить эти две таблицы и убедитесь, что они точно такие же, вы можете это сделать (будьте готовы, это займет некоторое время, если это огромная таблица).

-- show all records in table1 that do not exist in table2 
select * from table1 
except 
select * from table2 

и наоборот

-- show all records in table2 that do not exist in table1 
select * from table2 
except 
select * from table1 

если записи не возвращаются из этих двух запросов, таблицы одинаковы. , если у вас есть «обновленные/созданные» столбцы или столбец идентичности, которые могут отличаться, то вы указываете столбцы, которые вы хотите сравнить во всех запросах.

+0

Имена таблиц совпадают, но схемы разные. Таким образом, это будет 'SELECT * FROM SCEHMA1.TABLE1 EXCEPT SELECT * FROM SCHEMA2.TABLE1' –

+0

@Tobbi, я попробовал то, что вы предложили, и смог увидеть разницу в извлечении записей. Похоже, что в первой схеме - schema1, которая не имеет индекса, записи были вставлены очень случайным образом, а в схеме2 записи были упорядоченными. И в этом причина разницы в извлечении записей. Ваше сообщение было очень полезно, и я делаю это как предпочтительный ответ. – Sherlocked

+0

рад помочь :) – Tobbi

1

Но порядок строк не то же самое, и я не знаю, как сравнивать данные в обоих

Конечно. Вы добавили кластеризованный индекс - это означает, что индексированная таблица хранится в соответствии с индексом. Но без предложения ORDER BY не определен порядок.

Я не знаю, как сравнивать данные в обоих

Используйте предложение ORDER BY чтобы упорядочить данные, как вы хотите. Это позволит проводить сравнения.

Запрос, который вы опубликовали, должен возвращать соответствующие строки в том же порядке, что и ваше условие соединения, на COL_1, поэтому не так уверен, почему проблема.

+0

Спасибо Oded. Я снова выполнил запрос с помощью предложения order by в другом столбце и обнаружил, что COL_1 был заказан, так как он был основным ключом. Как предположил @Tobbi, данные были вставлены по-разному в обе таблицы. После добавления заказа по статье, 1. В SCHEMA1, множество записи имело значение случайных col_1 (неупорядоченные моды) 2. в SCHEMA2, набор записи приказал значение col_1 (так как он был кластерным индекс) ответа был действительно полезен. – Sherlocked

0

Возвращенный заказ не является тем же, потому что у вас нет предложения ORDER BY. Без этого порядок возвращаемых строк определяется реализацией, и вы не должны делать никаких предположений.

Этот индекс, хотя и улучшает производительность запроса, не должен приводить к возврату различных результатов из-за его присутствия.

Что касается допущения эквивалентных результатов только потому, что количество строк соответствует, я думаю, что вы настраиваете себя на неприятности.

+0

1. Я попробовал то, что вы предложили. Я добавил предложение ORDER BY и смог увидеть разницу в извлечении записей. 2. Я попробовал то, что предложил Тобби, чтобы сравнить данные. Похоже, что обе таблицы имеют одинаковый набор записей, но порядок, в котором они были вставлены, различен (в таблице без индексирования была введена случайная запись для col_1) Ответ был очень полезным. Спасибо @Michael Goldshteyn – Sherlocked