Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Проблема в следущем:
БД Foxpro лежит в сети, при выполнении запросов с клиентской машины происходит увеличение трафика(как будто копируется вся таблица для этого запроса на клиентскую машину, хотя результат запроса небольшой по объему).

Каким способом можно уменьшить трафик?
5 мар 11, 08:30    [10328772]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Dima T
Member

Откуда:
Сообщений: 15298
Целиком копируется если нет необходимых для оптимизации индексов.
Сделай sys(3054, 2), выполни запрос и смотри чего пишет.
5 мар 11, 08:50    [10328795]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Dima T,

Сделали запрос по полю с индексом, и SYS(3054,2) выдал
Rushmore optimization level for table dogovor: none
5 мар 11, 09:08    [10328829]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Покажите ваше выражение индекса.
5 мар 11, 09:37    [10328931]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Dima T
Member

Откуда:
Сообщений: 15298
Покажи сам запрос
5 мар 11, 09:43    [10328956]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Dima T,

Вот даже такой запрос занимает 25Мб трафика

SELECT num_dog;
FROM Z:\dogovor ;
WHERE YEAR(date_dog)=year(DATE())
5 мар 11, 09:56    [10329056]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Гость_17
Dima T,

Вот даже такой запрос занимает 25Мб трафика

SELECT num_dog;
FROM Z:\dogovor ;
WHERE YEAR(date_dog)=year(DATE())
Прелестно! :) А индекс, даже если и есть, наверняка по полю date_dog, а отнюдь не по выражению от этого поля, не так ли?
5 мар 11, 10:03    [10329103]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Dima T
Member

Откуда:
Сообщений: 15298
Гость_17
WHERE YEAR(date_dog)=year(DATE())

Должен быть индекс по date_dog
index on date_dog tag date_dog
но функцию YEAR() оптимизатор не понимает, поэтому надо ее убрать чтобы индекс заработал.
Замени условие на BETWEEN
WHERE date_dog between date(year(DATE()), 1, 1) and date(year(DATE()), 12, 31)
или для текущего года
WHERE date_dog >= date(year(DATE()), 1, 1)
5 мар 11, 10:06    [10329125]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Dima T, AndreTm

Индекс по DATE_DOG есть, сейчас попробую изменить условие
5 мар 11, 10:10    [10329152]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Sergey Sizov
Гость_17
Dima T,

Вот даже такой запрос занимает 25Мб трафика

SELECT num_dog;
FROM Z:\dogovor ;
WHERE YEAR(date_dog)=year(DATE())
Прелестно! :) А индекс, даже если и есть, наверняка по полю date_dog, а отнюдь не по выражению от этого поля, не так ли?





Да, только по полю
5 мар 11, 10:13    [10329185]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Кроме того, year(date()), date(year(date(... закинуть в переменные и использовать в запросе именно их
5 мар 11, 10:16    [10329206]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Гость_17
Sergey Sizov
пропущено...
Прелестно! :) А индекс, даже если и есть, наверняка по полю date_dog, а отнюдь не по выражению от этого поля, не так ли?

Да, только по полю
Что делать в таком случае Вам Dima T написал.
5 мар 11, 10:35    [10329323]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Гость_17
Guest
Dima T
Гость_17
WHERE YEAR(date_dog)=year(DATE())

Должен быть индекс по date_dog
index on date_dog tag date_dog
но функцию YEAR() оптимизатор не понимает, поэтому надо ее убрать чтобы индекс заработал.
Замени условие на BETWEEN
WHERE date_dog between date(year(DATE()), 1, 1) and date(year(DATE()), 12, 31)
или для текущего года
WHERE date_dog >= date(year(DATE()), 1, 1)


AndreTM
Кроме того, year(date()), date(year(date(... закинуть в переменные и использовать в запросе именно их



Спасибо всем, нормально отработало всеми указанными выше способами!
5 мар 11, 11:31    [10329679]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
Гость_17
Спасибо всем, нормально отработало всеми указанными выше способами!


старайтесь функции не использовать в условии ограничения запроса
5 мар 11, 11:34    [10329698]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
tanglir
Member

Откуда:
Сообщений: 28966
AndreTM
Кроме того, year(date()), date(year(date(... закинуть в переменные и использовать в запросе именно их
С этого будет профит в скорости?
5 мар 11, 11:35    [10329703]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
прошелмимо
Member [заблокирован]

Откуда: Из Курска понаехал
Сообщений: 10363
tanglir
AndreTM
Кроме того, year(date()), date(year(date(... закинуть в переменные и использовать в запросе именно их
С этого будет профит в скорости?


для фокспро в данном случае возможно нет,
но если так писать в транзакте,
то коллеги отобьют руки - и будут правы.
5 мар 11, 11:47    [10329774]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
То есть "типа правильно" будет примерно так:
***
select dogovor
index on date_dog tag date_dog
***
private CurrentYearFirstDate,CurrentYearLastDate
CurrentYearFirstDate=date(year(DATE()), 1, 1)
CurrentYearLastDate=date(year(DATE()), 12, 31)
***
SELECT a.num_dog FROM z:\dogovor a WHERE a.date_dog BETWEEN m.CurrentYearFirstDate AND m.CurrentYearLastDate
***
5 мар 11, 23:04    [10332517]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
Dima T
Member

Откуда:
Сообщений: 15298
AndreTM
То есть "типа правильно" будет примерно так:
private CurrentYearFirstDate,CurrentYearLastDate

Тут LOCAL надо бы, а не PRIVATE.
6 мар 11, 09:03    [10333227]     Ответить | Цитировать Сообщить модератору
 Re: Как уменьшить трафик при работе в сети?  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Там же написано "ТИПА"
LOCAL или PRIVATE - на скорость выполнения запроса не повлияет, а вот мозги разработчика направит в нужное русло...
6 мар 11, 09:12    [10333235]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить