Индекс SQL для нескольких таблиц, это можно сделать? - PullRequest
7 голосов
/ 26 сентября 2011

Уже некоторое время ищем решение,

перейдите к (1) или (2), чтобы пропустить описание, сначала я объясню ситуацию.

Моя фирма обновила нашуэ.и.м..Система, моя основная работа заключается в создании списков, используемых другими в фирме, я беру все свои данные из этой системной базы данных во время обновления, мы преобразовали некоторые данные в соответствии с новой версией, некоторые из них остались, некоторые не былиподделаны и просто напрямую экспортированы в новую базу данных, на отдельном сервере, в основном это успех, новый ERP.система работает, как и предполагалось, однако многие мои списки были разбиты, данные, которые используются в моих списках, отсутствуют / partly_missing / all_there

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

так 2. версия моего решения

мне не хватает первичных ключей "база данных iseries", поэтому я пошел на конкатенацию комбинации полей, создающих уникальный ключ, "слишком много времени, чтобы объяснить, как я это сделал"однако в конечном итоге я делаю представление с объединением двух баз данных, проверяя, что никаких записей не существует два раза,

(1), так что это то, что я получил сейчас, представление о комбинации старого и новоговсе данные таблицы построены с проверками на «уникальном» ключе .... каждый раз, когда мне нужны данные, которые были произведены при обновлении, я должен выполнять дорогой запрос для каждой таблицынапример, «некоторые используют эти представления более 40 раз» (Вопрос 1), как я могу «экономически эффективно» взять данные из двух разных схем / баз данных и связать их вместе?

(2) единственное, о чем я могу думатьдать мне такую ​​производительность - это создать индексы вместо созданных мною представлений, однако до сих пор я не смог найти никакой информации о том, как: (Вопрос2) Могу ли я создать индекс по двум таблицам,

моя база данных имеет вид / 400 - iseries, однако меня интересует решение для любого типа базы данных, я очень гибок с ресурсами

: EDIT: код, который используется для создания представления с небольшими изменениями,

SELECT

CTCONO,
CTDIVI,
CTSTCO,
CTSTKY,
CTLNCD,
CTTX40,
CTTX15,
CTPARM,
CTTXID,
CTRGDT,
CTRGTM,
CTLMDT,
CTCHNO,
CTCHID

FROM NEWDB.CSYTAB
UNION
SELECT * FROM OLDDB.CSYTAB

WHERE ( CTCONO,CTDIVI,CTSTCO,CTSTKY,CTLNCD ) NOT IN
(
SELECT A.CTCONO,A.CTDIVI,A.CTSTCO,A.CTSTKY,A.CTLNCD FROM NEWDB.CSYTAB A, OLDDB.CSYTAB B
WHERE A.CTCONO = B.CTCONO
AND A.CTDIVI = B.CTDIVI
AND A.CTSTCO = B.CTSTCO
AND A.CTSTKY = B.CTSTKY
AND A.CTLNCD = B.CTLNCD

)

Ответы [ 2 ]

6 голосов
/ 28 сентября 2011

Ответ - нет.

Я не могу создать индекс для нескольких таблиц.

Мое решение было бы сделать вместо этого таблицу, а в моем случае и представление, или я мог бы просто оптимизировать код SQL.

EDIT

Я только что узнал, что в MS (по крайней мере, версия 2012 года) вы можете создавать индексированные представления. Поэтому в моем случае я бы превратил свои представления в индексированные представления и получил бы огромное повышение производительности.

5 голосов
/ 26 сентября 2011

Создайте новую таблицу, в которой будет храниться значение вашего дорогостоящего запроса, а затем, если вы собираетесь всегда игнорировать более старые данные в целом, если для них есть запись в новой БД. Затем просто добавьте несколько триггеров для обновления этой новой таблицы, когда обновятся другие таблицы.

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

Редактировать: теперь, когда вы разместили свою таблицу, я вижу одну вещь, которую вы можете улучшить, сделайте вторую часть вашего запроса такой:

...
UNION
SELECT * FROM OLDDB.CSYTAB B
WHERE NOT EXISTS(
    SELECT TOP 1 1 
    FROM NEWDB.CSYTAB A
    WHERE A.CTCONO = B.CTCONO
        AND A.CTDIVI = B.CTDIVI
        AND A.CTSTCO = B.CTSTCO
        AND A.CTSTKY = B.CTSTKY
        AND A.CTLNCD = B.CTLNCD
    )

Тогда, если у вас есть один индекс, который охватывает {CTCONO, CTDIVI, CTSTCO, CTSTKY, CTLNCD} в NEWDB.CSYTAB, тогда он должен быть намного лучше, чем тот, который вы получаете в настоящее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...