|
|
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
Перевожу mdb 2000 в adp 2000. Такая штука: в mdb был запрос Balans, который в качестве источников данных использовал запросы, возвращающие таблицы в в виде (Customer_ID, Data_Oper, Sum_Tarif) В mdb Balans выглядел примерно так (учитывая, что входящих в него запросов 7 штук, то сокращенно, но суть одна к таблице Customers подвязаны Запросы по полю Customer_ID) SELECT Members.Filials, Customers.Number, Customers.Firms, IIf(IsNull([Saldo]),0,[Saldo]) AS Ost, IIf(IsNull([Sum-Amount]),0,[Sum-Amount]) AS Pay, IIf(IsNull([Tariff]),0,[Tariff]) AS RepTehPD FROM Members INNER JOIN ((Customers LEFT JOIN Balans_Pay ON Customers.Number = Balans_Pay.Customer_ID) LEFT JOIN Balans_Work_TehPD ON Customers.Number = Balans_Work_TehPD.Customer_ID) ON Members.Code = Customers.Member GROUP BY Members.Filials, Customers.Number, Customers.Firms, IIf(IsNull([Saldo]),0,[Saldo]), IIf(IsNull([Sum-Amount]),0,[Sum-Amount]), IIf(IsNull([Tariff]),0,[Tariff]) ORDER BY Members.Filials, Customers.Firms; и все работало, хотя медленно Собственно, проблема: в ADP исходные запросы сделал в виде View, которые сами по себе в отдельности работают быстро, в вот попытка сдклать View по типу запроса Balans привела к тому, что SQL выдает сообщение: "Время ожидания истекло" и , соответствнно, ничего не выводит. Что делать то ? Подкиньте идею, может не в лоб надо перекидывать запрос в ADP ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 16:44 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
А что же ты сам "Сложный запрос для SQL Server 2000" не привел? Заодно раскажи про наличии индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 16:52 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
Выполните его в SQL Query Analyzer сначала, посмотрите план выполнения запроса, посмотрите, сколько запрос выполняется. Время ожидания в Акссесе должно быть равно 0. Ну и индексы конечно же. А нельзя ли обойтись без такого количества Iff (соответственно Case в SQL)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 18:55 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
Сам запрос в ADP: SELECT dbo.Members.Filials, dbo.Customers.Number, dbo.Customers.Firms, dbo.Customers.FirmsReal, SUM(ISNULL(dbo.view_Balans_Pay.[Sum-Amount], 0)) AS Pay, SUM(ISNULL(dbo.view_Balans_Saldo.Saldo, 0)) AS Ost, SUM(ISNULL(dbo.view_Balans_Work.Tariff, 0)) AS SumWork, SUM(ISNULL(dbo.[view_Balans_Work_SNG-Demand].TariffDemands, 0)) AS SumWorkOnDemand FROM dbo.Customers INNER JOIN dbo.Members ON dbo.Customers.Member = dbo.Members.Code LEFT OUTER JOIN dbo.[view_Balans_Work_SNG-Demand] ON dbo.Customers.Number = dbo.[view_Balans_Work_SNG-Demand].CustomerID LEFT OUTER JOIN dbo.view_Balans_Work ON dbo.Customers.Number = dbo.view_Balans_Work.Number LEFT OUTER JOIN dbo.view_Balans_Saldo ON dbo.Customers.Number = dbo.view_Balans_Saldo.Number LEFT OUTER JOIN dbo.view_Balans_Pay ON dbo.Customers.Number = dbo.view_Balans_Pay.IDCust GROUP BY dbo.Customers.Number, dbo.Customers.Firms, dbo.Customers.FirmsReal, dbo.Members.Filials HAVING (SUM(ISNULL(dbo.view_Balans_Pay.[Sum-Amount], 0)) <> 0) OR (SUM(ISNULL(dbo.view_Balans_Saldo.Saldo, 0)) <> 0) OR (SUM(ISNULL(dbo.view_Balans_Work.Tariff, 0)) <> 0) OR (SUM(ISNULL(dbo.[view_Balans_Work_SNG-Demand].TariffDemands, 0)) <> 0) Индексы по полю dbo.Customers.Number есть, и во всех связанных с этим полем таблицам также есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 06:35 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
Время выполнения в Query Analyzer - 9.0 минут :(( В mdb было гораздо быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 07:36 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
>Индексы по полю dbo.Customers.Number есть, и во всех связанных с этим полем таблицам также есть. а по: dbo.Customers.Member, dbo.Members.Code, dbo.view_Balans_Pay.IDCust есть индексы? Поставь, обнови статистику. А тормоза скорее всего от HAVING, что приводит к сканированию таблиц. А вообще лучший тебе помощник - QA и Profiler ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 09:46 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
Может я чего-нибудь не понимаю ,но зачем тебе LEFT JOIN если ты все равно не выводишь группы с нулевыми суммами.А в остальном согласен с Senin Viktor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 11:25 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
я думаю если запрос правильно сделать и оптимизировать индексы - будет летать за доли секунды и не грузить сервак. 1. запрос лучше запихать во вьюху или процедуру - ускорение до 3 раз чем если запускаешь текстовый запрос. 2. в твоем случае я убрал бы группировку из главного запроса главный запрос должен выбирать набор записей для отображения - все нессумовые поля. суммовые поля вынести во вложенные селекты. способ не универсальный но иногда спасает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 11:32 |
|
||
|
Сложный запрос для SQL Server 2000 ?
|
|||
|---|---|---|---|
|
#18+
1. А это и так View, который включает в себя View_1, .... View_n 2. View_n - летают махом Может я чего перемудрил, но мне нужно следующее (на пальцах) 1. Есть таблица "Клиенты" (ID_Cust, Name) 2. Есть разные таблицы, по которым разложена наработка по клиентам (свести все в одну нет возможности), на основе каждой их n таблиц я строю View_1, ... View_n в виде (Date_Oper, ID_Cust, Summa) 3. В итоге мне нужно увидеть такую таблицу: Date_Oper ID_Cust Summa1 Summa2 ... причем должны выводиться только те ID_Cust, по которым хотя бы одна Summa<>0 Очень похожая вещь на оборотно-сальдовую ведомость по клиентам, проблема только, что наработка по разным таблицам разбросана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 13:25 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32190975&tid=1680923]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
4ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 317ms |

| 0 / 0 |
