|
|
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
Специалисты, скажите пожалуйста - можно ли ускорить выполнение 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.06.2005, 18:24:08 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
Убрать бы ALLTRIM'ы, да чтоб индексы были (не активные) по полям, которые в условиях... P.S. А зачем макроподстановки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2005, 19:03:59 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
Основа Rushmore - оптимизации - это индексы. Есть индексы - оптимизация возможна. Нет индексов - нет оптимизации. Использоваться могут только те индексы, выражение индексного ключа которых абсолютно совпадает с выражением, использованном справа или слева от символа сравнения в запросе. В общем случае Вам поможет функция SYS(3054) Внутри команды Select-SQL способ сравнения символьных строк регулируется настройкой SET ANSI. Почитайте в описании к этой настройке, что будет означать использование символа тождественного равенства (==) внутри команды Select-SQL. Это будет не совсем то, что Вы предполагаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2005, 10:48:48 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
ВладимирМОснова Rushmore - оптимизации - это индексы. Есть индексы - оптимизация возможна. Нет индексов - нет оптимизации. Использоваться могут только те индексы, выражение индексного ключа которых абсолютно совпадает с выражением, использованном справа или слева от символа сравнения в запросе. В общем случае Вам поможет функция SYS(3054) Внутри команды Select-SQL способ сравнения символьных строк регулируется настройкой SET ANSI. Почитайте в описании к этой настройке, что будет означать использование символа тождественного равенства (==) внутри команды Select-SQL. Это будет не совсем то, что Вы предполагаете. Извиняюсь, если не понял. Почему я неправильно предполагаю что такое тождественное равенство? Мне необходимо найти именно тождественное совпадение. Например я ищу "5" счёт, а у меня может быть и "5" и "51". Естественно, мне надо "==". Без ALLTRIM может выпасть сравнение "5" и " 5". По поводу первого ответа. Если в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 11:24:25 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
RedrikУбрать бы ALLTRIM'ы, да чтоб индексы были (не активные) по полям, которые в условиях... P.S. А зачем макроподстановки? Макроподстановки сделаны для удобства, чтобы удобнее было собирать запрос с переменными данными. Обычно собранное выражение SQL-запроса подставляется в источник колонки грида, но в данном случае получился многоступенчатый запрос (в воросе приведена только одна ступенька). Если писать запрос сразу, то макроподстановок будет больше - в теле самого запроса (не локальные же переменные туда подставлять - необходимы их значения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 11:37:10 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
1) Если Вам требуется ALLTRIM(), значит у Вас что-то неправильно в самой стркутуре базы данных. Ведущие пробелы должны отсекаться еще на стадии ввода(модификации) данных. Тем более, если речь идет о полях, по которым происходит объединение таблиц. Предположительно - это Primary Key и Foreign Key. И у них могут быть ведущие пробелы? Тут надо "в консерватории что-то подправить". 2) Вы бы все-таки сначала HELP почитали, а потом возмущались. Внутри команды Select-SQL символ тождественного равенства означает, что более короткая строка будет дополнена пробелами, чтобы уровняться по длине с более длинной. Согласен, в данном случае - это без разницы. Просто это надо иметь в виду. 3) Поскольку Вы так и не сказали, какие же индексы у Вас есть, то ничего по поводу оптимизации сказать невозможно. Алекс_Лена_ЛизаПо поводу первого ответа. Если в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее. Конечно, стоит. Но для Вас более важным является изучение даже не принципов написания команды Select-SQL, а организация базы данных как таковой. Т.е. как вообще хранить информацию в базе данных. Ваш запрос отражает явную "кривизну" самой базы данных и полное непонимание принципов объединения таблиц (связка PK - FK) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:06:48 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
авторЕсли в дальнейшем предполагается переход на SQL-сервер, то стоит ли использовать Rushmore - оптимизацию? Хотелось бы узнать об этом подробнее На самом деле все сервера используют индексы, поэтому понимание как данные выбираются не зависит то вида сервера. Просто "взрослые сервера" имеют свои особенности в построении индексов. SQL-серверы имеют более навороченные движки чем движок Фокса и помимо просто индексов там используются алгоритмы эвристик, хеш-преобразований итп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:07:30 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
Кстати, насколько я помню, Код: plaintext Код: plaintext Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:34:50 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
ВладимирМ 2) Вы бы все-таки сначала HELP почитали, а потом возмущались. Внутри команды Select-SQL символ тождественного равенства означает, что более короткая строка будет дополнена пробелами, чтобы уровняться по длине с более длинной. Согласен, в данном случае - это без разницы. Просто это надо иметь в виду. Я его и почитал, после чего написал предыдущий ответ (ну не надо уж совсем за идиота принимать). ВладимирМ1) Если Вам требуется ALLTRIM(), значит у Вас что-то неправильно в самой стркутуре базы данных. Ведущие пробелы должны отсекаться еще на стадии ввода(модификации) данных. Тем более, если речь идет о полях, по которым происходит объединение таблиц. Предположительно - это Primary Key и Foreign Key. И у них могут быть ведущие пробелы? Тут надо "в консерватории что-то подправить". Эксперименты показали, что наличие или отсутствие ALLTRIM не очень сильно сказывается на скорости работы запроса (оставлено для надёжности). Структура конечно не оптимальна, но она есть и постоянно модифицируется. Объединение на уровне FoxPro вряд ли целесообразно - в запросе участвуют не исходные таблицы, а SQL-выборка предыдущей ступени и курсор таблицы, имя которой переменно (зависит от года). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 13:05:14 |
|
||
|
Скорость SQL-запроса на FoxPro
|
|||
|---|---|---|---|
|
#18+
Алекс_Лена_ЛизаЭксперименты показали, что наличие или отсутствие ALLTRIM не очень сильно сказывается на скорости работы запроса (оставлено для надёжности). Это как раз и значит, что Вы неправильно спроектировали базу данных. По этим полям обязательно должны быть индексы. И вот в этом случае скорость существенно изменилась бы. Алекс_Лена_ЛизаОбъединение на уровне FoxPro вряд ли целесообразно - в запросе участвуют не исходные таблицы, а SQL-выборка предыдущей ступени и курсор таблицы, имя которой переменно (зависит от года). Тогда о какой оптимизации вообще можно говорить! Нет индексов - нет оптимизации! Либо делайте выборку напрямую из исходных таблиц, либо стройте индексы по этим временным курсорам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 14:17:12 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33130746&tid=1594006]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 359ms |

| 0 / 0 |
