#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 (Дэн, конечно, инновационный)