Создание подключения с сервера Microsoft SQL к AS / 400 - PullRequest
3 голосов
/ 14 июня 2011

Я пытаюсь подключиться с сервера Microsoft SQL к AS / 400, чтобы я мог извлечь данные из AS / 400, а затем пометить данные как извлекаемые.

Я успешно создал и OLE DBСоединение "IBMDASQL", и я могу получить данные некоторые данные, но у меня возникает проблема, когда я пытаюсь получить данные из очень большой таблицы

Это работает нормально и возвращает счет 170 миллионов:

select count(*)
from transactions

Этот запрос выполнялся за 15 часов до того, как я отказался от него.(Он должен возвращать ноль, поскольку я еще ничего не помечал как «в процессе»)

select count(*) 
from transactions
where processed = 'In process'

Я парень из Microsoft, но мой парень из AS / 400 говорит, что на 'есть индекс'обработано "и что локально, этот запрос выполняется мгновенно.

Есть мысли о том, что я могу делать неправильно?Я нашел таблицу с 68 записями и смог выполнить этот запрос примерно за секунду:

select count(*)
from smallTable
where RandomColumn = 'randomValue'

Так что я знаю, что AS / 400, по крайней мере, способен понять запрос такого типа.

Ответы [ 6 ]

3 голосов
/ 14 июня 2011

Мне приходилось сражаться в этой битве много раз.

Существует два способа решения этой проблемы.

1) Переместите ваши данные из AS400 на сервер SQL, где вы можете оптимизировать свои индексы2) Попросите людей AS400 создать логические представления, которые ускоряют поиск данных, ваш программист AS400 прав, индекс поможет, но я забыл термин, который они используют для определения «представления», похожего на представление сервера SQL, я полагаю, что-то вроде"физический" v / s "логический".Логическое - это то, что вы хотите.

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

2 голосов
/ 14 июня 2011

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

Пусть AS400 выполнит выбор нативным способомпутем создания хранимой процедуры в AS400

  1. откройте сеанс AS400
  2. запустите STRSQL
  3. создайте хранимую процедуру AS400 таким образом, чтобы/ обновить набор записей

    CREATE PROCEDURE MYSELECT (IN PARAM CHAR(10))
    LANGUAGE SQL 
    DYNAMIC RESULT SETS 1 
    BEGIN 
    DECLARE C1 CURSOR FOR SELECT * FROM MYLIB.MYFILE WHERE MYFIELD=PARAM;
    OPEN C1;
    RETURN; 
    END
    
  4. создать хранимую процедуру AS400 для обновления набора записей

    CREATE PROCEDURE MYUPDATE (IN PARAM CHAR(10))
    LANGUAGE SQL 
    RESULT SETS 0 
    BEGIN 
    UPDATE MYLIB.MYFILE SET MYFIELD='newvalue' WHERE MYFIELD=PARAM;
    END
    

Вызвать эти AS400 SPиз SQL SERVER

declare @myParam char(10)
set @myParam = 'In process'
-- get the recordset
EXEC ('CALL NAME_AS400.MYLIB.MYSELECT(?) ', @myParam) AT AS400 -- < AS400 = name of linked server
-- update
EXEC ('CALL NAME_AS400.MYLIB.MYUPDATE(?) ', @myParam) AT AS400 

Надеюсь, это поможет

1 голос
/ 12 сентября 2012

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

1 голос
/ 15 июня 2011

Мы обнаружили, что при выполнении запроса, подобного этому, ожидалось:

SELECT *
FROM OpenQuery( LinkedServer,
    'select count(*) 
    from transactions
    where processed = ''In process''')
GO
1 голос
/ 14 июня 2011

Я рекомендую следовать указаниям из IBM Redbook Диагностика производительности SQL в IBM DB2 Universal Database для iSeries , чтобы определить, что происходит на самом деле.

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

Я видел, что соединения OLEDB съедают 100%процессор в течение нескольких часов, и когда тот же запрос выполняется через VisualExplain (анализатор запросов), он оценивает лишь несколько секунд для выполнения.

0 голосов
/ 14 июня 2011

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

...