Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
26.03.2001, 10:44
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
Прилинковал к SQL пару Informix Server'ов... Из DTS и VB запросы к ним выполняются прекрасно в считанные секунды. А вот Query Analyzer задумывается минут на 8 и выскакивает по timeout... При этом в Task Manager дико растет память, используемая Enterprice Manager и висит весь компьютер... Буду весьма благодарен за любую помощь... Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.03.2001, 11:13
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
Маленькая справка... Попробовал с OpenQuery... Результаты: комп не висел, память не росла, простой селект выполнил! за 7'42'' (538000 records)... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.03.2001, 15:30
|
|||
---|---|---|---|
Query Analyzer висит... |
|||
#18+
При выполнении запроса к линкед серверу, сначала происходит перекачка данных на комп, где стоит SQL Server а только потом операции объединения и ограничения. Т.е. если есть запрос вида Select * from servname.dbname.owner.tablename where field1='zzzzzz', причем даже если это field1 не содержитни ни одной строки с 'zzzzzz', то сначала произойдет перекачка всей таблицы, а уже потом ограничение. И врезультате будет дан пустой рекордсет. Если же запрос напрямую к информиксу, то он сам быренько проведет ограничение и даст тот же пустой рекордсет. Разница во времени выполнения очевидна. Размер памяти, который ему понадобится для закачки = кол-во_строк*размер_одной_строки Замечание: Единственный случай, когда перекачка данных происходить не будет - когда условие очевидно и заранее вычислимо, например 1=2 Хотя, возращаясь к давней дискуссии, отмечу, что если в этом случае в плане запроса даже нет Remote Query, то если в предикате sin(1)=sin(2), то он будет, хотя выполняется тоже быстро ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.03.2001, 16:05
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
To ComeRun: Решение правильное. Известно, что Openquery выполняется эффективнее, чем прямой запрос к четырехзначному объекту. Более того, возникают ситуации, когда только Openquery и работает. Напр., когда в кач-ве linked server выступает MSOLAP.2 (как ни странно). To Dmitry: Сказанное Вами справедливо, если в кач-ве linked server выступает совсем тупой источник данных, к-й не умеет своими силами производить фильтрацию. Напр., plain text. Я не работал с Informix, но мне кажется, что он должен вести себя более интеллектуально. Напр., OLE DB провайдеры к Oracle и DB2 ведут себя очень пристойно, передавая where и join (если он не выходит на внешние данные) на linked server. Да Вы даже обычный XML прилинкуйте и посмотрите план: он where прячет в remote query, а SQL Serverу гонит уже не весь stream, а сухой остаток. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.03.2001, 19:10
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
Огромное всем спасибо... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.03.2001, 19:46
|
|||
---|---|---|---|
Query Analyzer висит... |
|||
#18+
2 Дед Маздай: К сожалению, у меня нет возможности проверить на многих различных источниках, но то что я писал я проверял на прилинкованном MS SQL сервере Уж не знаю, насколько он туп или интеллектуален, по идее в связке со свои родным сервером должен давать максимум производительности. Ан нет... Фильтрацию проводит после Remote Query (это видно в плане выполнения), да и чувствуется при выпонении запроса: условие фильтрации заранее делаю такое, чтобы отсеялось все; прилинкованный сервер связывается посредством модема. Так вот при относительно большом размере таблицы можно сходить поспать раньше чем получишь в ответ пустой рекордсет . Если же прилинкованный сервер соединяется через локалку, или же запрос дается при коннекте к самому этому серверу через модем(без использования linked server), то ответ получается очень быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.04.2001, 17:41
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
А как-таки удалось прилинковать INFORMIX ? У меня линки выполняются но при попытке просмотреть таблицы вылазит ошибка 7399 ? Я попробовал прилинковать ODBC источник для базы из SYBASE SQL Anywhere - результат такой же. Прошу помощи!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.04.2001, 21:02
|
|||
---|---|---|---|
|
|||
Query Analyzer висит... |
|||
#18+
2 Dmitry Оценки типа "чувствуется", "сходить поспать" и прочие нематериальные вещи оставим женской логике. Я по-прежнему продолжаю утверждать, что SQL Server по максимуму перекладывает на прилинкованный сервер все, что касается подзапроса, насколько это допускает OLE DB-провайдер прилинкованного сервера. Описанная Вами ситуация, когда SQL Server всасывает всю внешнюю таблицу целиком, чтобы обработать ее у себя, обуславливается либо тупостью внешнего провайдера, либо наличием в запросе каких-либо вещей, специфичных сугубо для MS SQL Server, которые не поддерживаются общим знаменателем OLE DB, даже если это SQLOLEDB. Выполните, напр., select CustomerID, EmployeeID, OrderDate, Freight from MyLinkedSrv.Northwind.dbo.Orders where OrderDate >= '1998/01/01', и Вы увидите в плане запроса Remote Query = SELECT Tbl1001."CustomerID" Col1004,Tbl1001."EmployeeID" Col1005,Tbl1001."OrderDate" Col1006,Tbl1001."Freight" Col1009 FROM "Northwind"."dbo"."Orders" Tbl1001 WHERE Tbl1001."OrderDate">='1998-01-01 00:00:00.000'), что фильтрация выполняется на прилинкованном сервере. А теперь сделайте select CustomerID, EmployeeID, OrderDate, Freight from MyLinkedSrv.Northwind.dbo.Orders where datepart(yyyy, OrderDate) = 1998, и Вы увидите, что теперь условие where уходит из Remote Query на локальный сервер: Filter(WHEREdatepart(year, [MyLinkedSrv].[Northwind].[dbo].[Orders].[OrderDate])=199) |--Remote Query(SOURCEMyLinkedSrv), QUERYSELECT Tbl1001."Freight" Col1009,Tbl1001."OrderDate" Col1006,Tbl1001."EmployeeID" Col1005,Tbl1001."CustomerID" Col1004 FROM "Northwind"."dbo"."Orders" Tbl1001)) SQL Server не передает where прилинкованному серверу, поскольку в общем случае тот не обязан знать, что такое datepart. Сказанное относится и к стратегиям построения связей. Если MyLinkedSrv - SQL Server, то мы можем легко посмотреть, какая часть запроса в д-ти к нему приходит, натравив на него SQL Profiler. Включим Performance\Execution Plan в список отлавливаемых событий, установим фильтр на Application Name like Microsoft SQL Server%. На локальном сервере сделаем select c.CompanyName, e.LastName, o.OrderDate, o.Freight from Customers c inner join MyLinkedSrv.Northwind.dbo.Orders o on c.CustomerID = o.CustomerID inner join MyLinkedSrv.Northwind.dbo.Employees e on o.EmployeeID = e.EmployeeID. Вот как выглядит план на локальном сервере: Merge Join(Inner Join, MERGE[c].[CustomerID])=([MyLinkedSrv].[Northwind].[dbo].[Orders].[CustomerID]), RESIDUAL[c].[CustomerID]=[MyLinkedSrv].[Northwind].[dbo].[Orders].[CustomerID])) |--Clustered Index Scan(OBJECT[Northwind].[dbo].[Customers].[PK_Customers] AS [c]), ORDERED FORWARD) |--Remote Query(SOURCEMyLinkedSrv), QUERYSELECT o."CustomerID" Col1070,o."OrderDate" Col1072,o."Freight" Col1075,e."LastName" Col1079 FROM "Northwind"."dbo"."Orders" o,"Northwind"."dbo"."Employees" e WHERE o."EmployeeID"=e."EmployeeID" ORDER BY o."CustomerID" ASC)) И действительно, в профайлере на MyLinkedSrv читаем: Sort(ORDER BY[o].[CustomerID] ASC)) |--Hash Match(Inner Join, HASH[e].[EmployeeID])=([o].[EmployeeID]), RESIDUAL[e].[EmployeeID]=[o].[EmployeeID])) |--Index Scan(OBJECT[Northwind].[dbo].[Employees].[LastName] AS [e])) |--Clustered Index Scan(OBJECT[Northwind].[dbo].[Orders].[PK_Orders] AS [o])). Это есть конкретная реализация того, что локальный сервер прислал ему в виде заявки в Remote Query. Кстати, обратите внимание, на ORDER BY Customer.ID, что затем на локальном сервере позволяет применить merge join, поск. Customers априори упорядочена по CustomerID. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=46&mobile=1&tid=1827043]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 139ms |
0 / 0 |