Межсистемный кэш в MSSQL - PullRequest
       21

Межсистемный кэш в MSSQL

0 голосов
/ 30 октября 2018

Я некоторое время пытался вытянуть данные через связанный сервер в SSMS из базы данных InterSystem Cache, чтобы мы могли объединить данные с другими исходными системами в нашем хранилище данных.

Я установил соединение ODBC и связанный сервер с базой данных и могу выполнять запросы через OPENQUERY в Management studio, но объем данных велик (> 100 миллионов строк). Поэтому, когда я выполняю SQL-запрос с предложением WHERE, запрос просто вращается. Как будто нет индексов или PK, и запрос завершает масштабное сканирование таблиц.

Если я ВЫБИРАЮ ТОП-100 без условия where, запрос возвращает данные, поэтому я знаю, что все соединения правильные. Любое руководство будет с благодарностью!

Я также пытался использовать SSIS, используя поток данных от соединения ODBC к месту назначения OLE DB, но я отменил пакет через семь часов.

Пример запроса ниже:

SELECT * 

FROM OPENQUERY (InterSystem_Cache ,
    'SELECT     pt.Column1,
                pt.Column2,
                pt.Column3,
                pt.Column4,
                pt.Column5,
                pt.Column6,
                pt.Column7,
                pt.Column8,
                pt.Column9,
                pt.Column10,
                pt.Column11,
                tr.Column12,
                tr.Column13,
                tr.Column14,
                te.Column15,
                te.Column16,
                te.Column17,
                te.Column18,
                te.Column19,
                te.Column20,
                rs.Column21,
                rs.Column22,
                rs.Column23,
                re.Column24,
                re.Column25,
                re.Column26,
                tr.Column27,
                tr.Column28,
                re.Column29
        FROM Database1.Table1 tr
            LEFT JOIN Database1.Table2 te on te.Column16 = tr.Column13
            LEFT JOIN Database1.Table3 rs on rs.Column23 = tr.Column28
            LEFT JOIN Database1.Table4 re on re.Column25 = rs.Column22
            LEFT JOIN Database1.Table5 pt on pt.Column6 = re.Column26
        WHERE tr.Column12 = ''2018-10-30'' ')

1 Ответ

0 голосов
/ 31 октября 2018

Ну, это похоже на проблему с индексированием, и если у вас нет доступа к системе Cache, вы не сможете ее решить. Если вы знаете, что данные поступают в кэш в хронологическом порядке для tr.Column12, или если вы довольны результатами запроса только один раз в строке, вы можете сохранить максимальное tr.%ID значение последнего запуска и добавить tr.%ID>yourLastImported%ID в предложение WHERE, поскольку %ID обычно является инкрементным (однако конкретное приложение может переопределить его). Еще одна попытка - выполнить один и тот же запрос без всех JOIN только на tr и посмотреть, улучшит ли он время запроса. Можно выполнить некоторые оптимизации, если проблема действительно в доступе к дочерним таблицам.

...