Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Скорость SQL-запроса на FoxPro  [new]
Алекс_Лена_Лиза
Member

Откуда:
Сообщений: 23
Специалисты, скажите пожалуйста - можно ли ускорить выполнение SQL-запроса, приведённого ниже (SQL-сервер не стоит, эмулируется FoxPro).
Первый вариант:

tem3='SELECT ALL tem_docs_rasch_dk.datu, tem_docs_rasch_dk.regn, tem_docs_rasch_dk.subd,'+;

'tem_docs_rasch_dk.subk,tem_docs_rasch_dk.nnum,'+;

'tem_docs_rasch_dk.nkol,tem_docs_rasch_dk.kodv,tem_docs_rasch_dk.sumv,tem_docs_rasch_dk.sumi,'+;

'tem_docs_rasch_dk.nmo,tem_docs_rasch_dk.nza,tem_docs_rasch_dk.razv,tem_docs_rasch_dk.nump,'+;

'tem_docs_rasch_dk.lock,tem_docs_rasch_dk.incdt,tem_docs_rasch_dk.inckt,tem_docs_rasch_dk.choft,'+;

'tem_docs_rasch_dk.gregn,tem_docs_rasch_dk.obpdt,tem_docs_rasch_dk.obpkt,tem_docs_rasch_dk.artikul,'+;

'tem_docs_rasch_dk.omrk_nl FROM tem_docs_rasch_dk RIGHT OUTER JOIN psbase_rez_forCur_dbkr ON ALLTRIM(tem_docs_rasch_dk.subd) == ALLTRIM(psbase_rez_forCur_dbkr.subs) ' +;

'.OR. ALLTRIM(tem_docs_rasch_dk.subk) == ALLTRIM(psbase_rez_forCur_dbkr.subs) WHERE tem_docs_rasch_dk.datu >= tem1 .AND. '+ ;

'tem_docs_rasch_dk.datu < tem2'

tem4=' ORDER BY tem_docs_rasch_dk.regn INTO CURSOR '

tem5=tem3+IIF(EMPTY(THISFORM.predsubs1),'','.AND. (tem_docs_rasch_dk.subd==THISFORM.predsubs1 .OR. tem_docs_rasch_dk.subk==THISFORM.predsubs1)')+;

tem4+'tem_vib1_docs_dk READWRITE'

&tem5

Второй вариант (только отличающаяся часть):

tem3='SELECT ALL tem_docs_rasch_dk.datu, tem_docs_rasch_dk.regn, tem_docs_rasch_dk.subd,'+;

'tem_docs_rasch_dk.subk,tem_docs_rasch_dk.nnum,'+;

'tem_docs_rasch_dk.nkol,tem_docs_rasch_dk.kodv,tem_docs_rasch_dk.sumv,tem_docs_rasch_dk.sumi,'+;

'tem_docs_rasch_dk.nmo,tem_docs_rasch_dk.nza,tem_docs_rasch_dk.razv,tem_docs_rasch_dk.nump,'+;

'tem_docs_rasch_dk.lock,tem_docs_rasch_dk.incdt,tem_docs_rasch_dk.inckt,tem_docs_rasch_dk.choft,'+;

'tem_docs_rasch_dk.gregn,tem_docs_rasch_dk.obpdt,tem_docs_rasch_dk.obpkt,tem_docs_rasch_dk.artikul,'+;

'tem_docs_rasch_dk.omrk_nl FROM tem_docs_rasch_dk,psbase_rez_forCur_dbkr WHERE (ALLTRIM(tem_docs_rasch_dk.subd) == ALLTRIM(psbase_rez_forCur_dbkr.subs) ' +;

'.OR. ALLTRIM(tem_docs_rasch_dk.subk) == ALLTRIM(psbase_rez_forCur_dbkr.subs)) .AND. tem_docs_rasch_dk.datu >= tem1 .AND. '+ ;

'tem_docs_rasch_dk.datu < tem2'

tem1 и tem2 - даты, psbase_rez_forCur_dbkr - выборка из таблицы счетов, tem_docs_rasch_dk - таблица операций.
Результат выводится требуемый, скорость на хорошей машине тоже приемлемая, но только если выборка счетов небольшая.
В SQL я пока новичок, хотелось бы узнать мнение специалистов - как правильно строить подобные запросы. Скорость вариантов почти одинакова, мне сейчас сложно определить разницу (сижу на хорошей машине).
19 июн 05, 18:24    [1631923]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
Redrik
Member

Откуда:
Сообщений: 808
Убрать бы ALLTRIM'ы, да чтоб индексы были (не активные) по полям, которые в условиях...
P.S. А зачем макроподстановки?
19 июн 05, 19:03    [1631965]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Основа Rushmore - оптимизации - это индексы. Есть индексы - оптимизация возможна. Нет индексов - нет оптимизации.

Использоваться могут только те индексы, выражение индексного ключа которых абсолютно совпадает с выражением, использованном справа или слева от символа сравнения в запросе.

В общем случае Вам поможет функция SYS(3054)

Внутри команды Select-SQL способ сравнения символьных строк регулируется настройкой SET ANSI. Почитайте в описании к этой настройке, что будет означать использование символа тождественного равенства (==) внутри команды Select-SQL. Это будет не совсем то, что Вы предполагаете.
20 июн 05, 10:48    [1632643]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
Алекс_Лена_Лиза
Member

Откуда:
Сообщений: 23
ВладимирМ
Основа Rushmore - оптимизации - это индексы. Есть индексы - оптимизация возможна. Нет индексов - нет оптимизации.

Использоваться могут только те индексы, выражение индексного ключа которых абсолютно совпадает с выражением, использованном справа или слева от символа сравнения в запросе.

В общем случае Вам поможет функция SYS(3054)

Внутри команды Select-SQL способ сравнения символьных строк регулируется настройкой SET ANSI. Почитайте в описании к этой настройке, что будет означать использование символа тождественного равенства (==) внутри команды Select-SQL. Это будет не совсем то, что Вы предполагаете.


Извиняюсь, если не понял. Почему я неправильно предполагаю что такое тождественное равенство? Мне необходимо найти именно тождественное совпадение. Например я ищу "5" счёт, а у меня может быть и "5" и "51". Естественно, мне надо "==". Без ALLTRIM может выпасть сравнение "5" и " 5".

По поводу первого ответа. Если в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее.
23 июн 05, 11:24    [1643201]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
Алекс_Лена_Лиза
Member

Откуда:
Сообщений: 23
Redrik
Убрать бы ALLTRIM'ы, да чтоб индексы были (не активные) по полям, которые в условиях...
P.S. А зачем макроподстановки?


Макроподстановки сделаны для удобства, чтобы удобнее было собирать запрос с переменными данными. Обычно собранное выражение SQL-запроса подставляется в источник колонки грида, но в данном случае получился многоступенчатый запрос (в воросе приведена только одна ступенька). Если писать запрос сразу, то макроподстановок будет больше - в теле самого запроса (не локальные же переменные туда подставлять - необходимы их значения).
23 июн 05, 11:37    [1643265]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
1) Если Вам требуется ALLTRIM(), значит у Вас что-то неправильно в самой стркутуре базы данных. Ведущие пробелы должны отсекаться еще на стадии ввода(модификации) данных.

Тем более, если речь идет о полях, по которым происходит объединение таблиц. Предположительно - это Primary Key и Foreign Key. И у них могут быть ведущие пробелы? Тут надо "в консерватории что-то подправить".

2) Вы бы все-таки сначала HELP почитали, а потом возмущались. Внутри команды Select-SQL символ тождественного равенства означает, что более короткая строка будет дополнена пробелами, чтобы уровняться по длине с более длинной. Согласен, в данном случае - это без разницы. Просто это надо иметь в виду.

3) Поскольку Вы так и не сказали, какие же индексы у Вас есть, то ничего по поводу оптимизации сказать невозможно.

Алекс_Лена_Лиза
По поводу первого ответа. Если в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее.

Конечно, стоит.

Но для Вас более важным является изучение даже не принципов написания команды Select-SQL, а организация базы данных как таковой. Т.е. как вообще хранить информацию в базе данных. Ваш запрос отражает явную "кривизну" самой базы данных и полное непонимание принципов объединения таблиц (связка PK - FK)
23 июн 05, 12:06    [1643428]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
PaulWist
Guest
автор
Если в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее


На самом деле все сервера используют индексы, поэтому понимание как данные выбираются не зависит то вида сервера. Просто "взрослые сервера" имеют свои особенности в построении индексов.

SQL-серверы имеют более навороченные движки чем движок Фокса и помимо просто индексов там используются алгоритмы эвристик, хеш-преобразований итп.
23 июн 05, 12:07    [1643431]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
Urri
Member

Откуда: Москва
Сообщений: 2693
Кстати, насколько я помню,
' 5' = '5'
всегда будет
FALSE
, независимо от настроек. Вот
'5 ' = '5'
или
'5' = '5 '
- другое дело. ;-)
23 июн 05, 12:34    [1643586]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
Алекс_Лена_Лиза
Member

Откуда:
Сообщений: 23
ВладимирМ


2) Вы бы все-таки сначала HELP почитали, а потом возмущались. Внутри команды Select-SQL символ тождественного равенства означает, что более короткая строка будет дополнена пробелами, чтобы уровняться по длине с более длинной. Согласен, в данном случае - это без разницы. Просто это надо иметь в виду.


Я его и почитал, после чего написал предыдущий ответ (ну не надо уж совсем за идиота принимать).

ВладимирМ
1) Если Вам требуется ALLTRIM(), значит у Вас что-то неправильно в самой стркутуре базы данных. Ведущие пробелы должны отсекаться еще на стадии ввода(модификации) данных.

Тем более, если речь идет о полях, по которым происходит объединение таблиц. Предположительно - это Primary Key и Foreign Key. И у них могут быть ведущие пробелы? Тут надо "в консерватории что-то подправить".



Эксперименты показали, что наличие или отсутствие ALLTRIM не очень сильно сказывается на скорости работы запроса (оставлено для надёжности).
Структура конечно не оптимальна, но она есть и постоянно модифицируется. Объединение на уровне FoxPro вряд ли целесообразно - в запросе участвуют не исходные таблицы, а SQL-выборка предыдущей ступени и курсор таблицы, имя которой переменно (зависит от года).
23 июн 05, 13:05    [1643754]     Ответить | Цитировать Сообщить модератору
 Re: Скорость SQL-запроса на FoxPro  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Алекс_Лена_Лиза
Эксперименты показали, что наличие или отсутствие ALLTRIM не очень сильно сказывается на скорости работы запроса (оставлено для надёжности).

Это как раз и значит, что Вы неправильно спроектировали базу данных. По этим полям обязательно должны быть индексы. И вот в этом случае скорость существенно изменилась бы.

Алекс_Лена_Лиза
Объединение на уровне FoxPro вряд ли целесообразно - в запросе участвуют не исходные таблицы, а SQL-выборка предыдущей ступени и курсор таблицы, имя которой переменно (зависит от года).

Тогда о какой оптимизации вообще можно говорить! Нет индексов - нет оптимизации!

Либо делайте выборку напрямую из исходных таблиц, либо стройте индексы по этим временным курсорам.
23 июн 05, 14:17    [1644132]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить