Coldfusion получение данных из второго источника данных

#sql #sql-server #coldfusion

#sql #sql-сервер #coldfusion

Вопрос:

У меня есть запрос, который получает данные из второго источника данных. Это очень МЕДЛЕННО. Есть ли более эффективный способ сделать это?

Я думаю, что медленная часть — это ListQualify . В результате получается список, содержащий 40 000 значений. Однако я не уверен в другом способе сделать это.

 <cfif GetExtractionData.recordcount gt 0 >

            <cfquery name="queryVPOCar" datasource="Web_Applications">
                Select [strStockNumber] as "STOCK",
                        field1 as "field_1",
                        field2 as "field_2",
                        field3 as "field_3",
                        field4 as "field_4",
                        field5 as "field_5",
                        field6 as "field_6"
                From ExtractionAggregates
                WHERE [strStockNumber] IN (#ListQualify(StockList,"'",",","ALL")# )
            </cfquery>

        <!--- Select an empty Row --->
        <cfquery name="joinQuery" dbtype="query" >
            SELECT *
            FROM queryVPOCar
            WHERE queryVPOCar.STOCK = ''
        </cfquery>

        <!--- Add empty row to table, so we have column names  ---> 
        <cfset QueryAddRow(joinQuery) />

        <!--- if results exist, add them to the query --->
        <cfif queryVPOCar.recordcount gt 1 >
            <cfquery name="GetExtractionData" dbtype="query">

                SELECT * FROM 
                GetExtractionData, queryVPOCar
                WHERE GetExtractionData.STOCK = queryVPOCar.STOCK

                UNION 

                SELECT GetExtractionData.*, joinQuery.*
                FROM GetExtractionData, joinQuery
                WHERE GetExtractionData.STOCK  NOT IN (#ListQualify(ValueList(queryVPOCar.STOCK),"'",",","ALL")# ) 

                ORDER BY STOCK 
            </cfquery>
        </cfif>

    </cfif>
 

Комментарии:

1. Какие движки базы данных задействованы?

2. Первый запрос поступает от oracle. Вторые данные поступают из Microsoft sql (2010, я думаю)

3. Сколько записей может быть в queryVPOCar? Потому что, если ваши подключения к БД не настроены на объединение в пул, и у вас много результатов, вы можете часто подключаться и отключаться от БД. Это, как правило, самая дорогая (по времени) часть запроса, если предположить, что он написан наполовину прилично. 🙂

4. Я просматриваю около 40 000 записей из исходного запроса, их может быть столько или меньше.

5. Исходный запрос занимает всего пару секунд. Я почти уверен, что моя проблема здесь в ТОМ, что АКЦИИ ОТСУТСТВУЮТ В ListQualify

Ответ №1:

Лучший способ сделать это — использовать sql server для максимально возможной работы с базой данных. Шагом 1 будет установка связанного сервера с вашей oracle db на вашем sql server. Шаг 2 — написать хранимую процедуру, которая:

  • Использует openquery для получения данных от oracle и помещает эти данные во временную таблицу вашей базы данных sql Server.
  • Получает данные из таблиц базы данных вашего sql Server, присоединяющихся к временной таблице

Шаг 3 — вызвать хранимую процедуру из ColdFusion и отобразить результаты.

Комментарии:

1. Связанный сервер? Я никогда даже не слышал об этом, но это звучит многообещающе. Окажет ли это какое-либо влияние на сервер oracle? Мы используем стороннюю программу, которая выполняется на этом сервере и использует oracle db.

2. Единственным воздействием, которое это окажет на сервер oracle, будут выполняемые вами запросы. Однако вы все равно их запускаете.

3. Очень хорошая мысль 1 @PatrickSchomburg (Дэн, конечно, инновационный)