Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Explain при отсутствии физического доступа к серверу - как? / 16 сообщений из 16, страница 1 из 1
06.12.2011, 13:23
    #37560855
Sergey Balter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Требуется:
получить планы нескольких запросов средствами чисто клиентских программ.

Informix-сервер физически находится у заказчика в другом городе и удаленного доступа к компьютеру нет. В наличии имеется только SQLSquirrel и возможность подсоединиться к серверу и выполнять SQL-statements/queries.

С Informix не знаком. Гугление принесло
- директиву SET EXPLAIN, что позволяет получить план в файле на компьютере сервера, что не подходит по ограничениям безопасности у заказчика.
- ссылки на утилиту SQL Trace (вроде бы входит в поставку Информикса?) но доступа к штатным средствам администрирования у нас нет.

Возможно ли получить планы через SQLSquirrel? или какие-то дополнительные утилиты, не требующие доступа к компьютеру сервера?

Для сравнения, в Оракле команда EXPLAIN PLAN записывает план в таблицу, из которой его можно прочитать обычным SELECT
...
Рейтинг: 0 / 0
06.12.2011, 14:49
    #37561061
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Sergey Balter,

В новых версиях Информикса можно использовать встроенную функцию EXPLAIN_SQL().
Ниже ее пример использования через JDBC, использовал copy/paste
сам не проверял, возможны ошибки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
/*Example of JDBC program running EXPLAIN_SQL*/

 CallableStatement cstmt2 = 
	conn.prepareCall("{call informix.explain_sql(?, ?, ?, ?, ?, ?, ?)}");

/* set up the parameters */
cstmt2.registerOutParameter( 1, Types.INTEGER );
cstmt2.registerOutParameter( 2, Types.INTEGER );
cstmt2.setString(3,null);
cstmt2.setNull( 5, Types.BLOB );                  // Filter
cstmt2.registerOutParameter( 6, Types.BLOB );     // XML_OUTPUT
cstmt2.registerOutParameter( 7, Types.BLOB );     // XML_MESSAGE

file = new File("./xmlins");
fin = new FileInputStream(file);
    
byte[] buffer = new byte[8000];

IfxLobDescriptor loDesc = new IfxLobDescriptor(conn);
IfxLocator loPtr = new IfxLocator();
IfxSmartBlob smb = new IfxSmartBlob(conn);
int loFd = smb.IfxLoCreate(loDesc, smb.LO_RDWR, loPtr);

n = fin.read(buffer);
if (n > 0) n = smb.IfxLoWrite(loFd, buffer);
  
smb.IfxLoClose(loFd);
Blob blb = new IfxBblob(loPtr);
cstmt2.setBlob(4, blb); // set the blob column

ResultSet rs = cstmt2.executeQuery();

int outmajver = cstmt2.getInt(1);
int outminver = cstmt2.getInt(2);

/* read the xml explain output if there is any */
while (rs.next())
    {
    byte[] buf = new byte[80000];
    b = (IfxBblob) rs.getBlob(1);

    if (b != null
        {
     IfxLocator loptr = b.getLocator();
     IfxSmartBlob smbl = new IfxSmartBlob(conn);
     int lofd = smbl.IfxLoOpen(loptr, smbl.LO_RDONLY);
     outfile = new File("./out.xml");
     fout = new FileOutputStream(outfile); 
     int size = smbl.IfxLoRead(lofd, fout, 80000);
     smbl.IfxLoClose(lofd);
     smbl.IfxLoRelease(loptr);
        }
    }

/* get blob out parameters */
 outmsg_b = (IfxBblob)cstmt2.getBlob(7);
 if (outmsg_b == null)
      System.out.println("outmsg_b is null");
  else
      {
     IfxLocator xml_msg_loptr = outmsg_b.getLocator();
     IfxSmartBlob xml_msg_smbl = new IfxSmartBlob(conn);
     int msg_out_lofd = xml_msg_smbl.IfxLoOpen(xml_msg_loptr, 
                                               xml_msg_smbl.LO_RDONLY);
     msg_out_outfile = new File("./xml_msg.xml");
     msg_out_fout = new FileOutputStream(msg_out_outfile);
          
     int xml_msg_size = xml_msg_smbl.IfxLoRead(msg_out_lofd, 
                                               msg_out_fout, 80000);
     xml_msg_smbl.IfxLoClose(msg_out_lofd);          
     xml_msg_smbl.IfxLoRelease(xml_msg_loptr);
   }
...
Рейтинг: 0 / 0
06.12.2011, 14:50
    #37561068
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Sergey Balter, версию Информикс-сервера скажи, а? А то Оракл 5 тоже не очень план запроса в таблички писал...
...
Рейтинг: 0 / 0
06.12.2011, 15:12
    #37561127
Sergey Balter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Informix 11
...
Рейтинг: 0 / 0
06.12.2011, 15:46
    #37561222
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Sergey BalterInformix 11
11.10, 11.50, 11.70? :)

Вобщем, копать в сторону вариантов:
1. Запросы к БД sysmaster, таблица syssqexplain.
2. Установить у себя OpenAdmin Tool
3. параметр конфигурации SQLTRACE, task('set sql tracing on'); EXECUTE FUNCTION task(“set sql user tracing on”,47), таблицы syssqltrace...
...
Рейтинг: 0 / 0
06.12.2011, 18:58
    #37561661
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
АнатоЛой,

я могу ошибаться, но по-моему с помощью sysmaster:syssqexplain и конфигурационного параметра SQLTRACE нельзя получить план запроса, который нужен топик-стартеру, да и судя по исходному сообщению админы закрыли доступ к серверу , я думаю, в том числе и к sysmaster :)

С уважением, Виктор
...
Рейтинг: 0 / 0
06.12.2011, 20:15
    #37561776
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
victor16АнатоЛой,

я могу ошибаться, но по-моему с помощью sysmaster:syssqexplain и конфигурационного параметра SQLTRACE нельзя получить план запроса, который нужен топик-стартеру, да и судя по исходному сообщению админы закрыли доступ к серверу , я думаю, в том числе и к sysmaster :)

С уважением, Виктор
По скудной информации от ТС (ибо "С Informix не знаком") наши предположения друг-друга стоят :). ТС не сказал:
1. для чего ему нужен "план запроса". Предположение: для оптимизации. Вывод: если мозги на месте, то и syssqexplain пригодится.
2. что sysmaster точно закрыта... У ТС нет "удалённого доступа" (в моём понимании это RDP, ssh и прочее из этой категории :).

Не понял только, почему решили, что SQLTRACE не поможет?
Параметр доступен админу, не сказано что к админу "нет доступа".
...
Рейтинг: 0 / 0
06.12.2011, 20:54
    #37561830
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
АнатоЛойНе понял только, почему решили, что SQLTRACE не поможет?
Потому что конфигурационный параметр SQLTRACE позволяет управлять трассировкой SQL, т.е. кто когда во-сколько какой SQL-оператор выполнил, какие таблицы при этом были затронуты, и какие ресурсы были выделены, вплоть до того какие значения имели переменные при исполнении хранимых процедур, но план запроса он не позволяет получить, впрочем я могу ошибаться. Также мне кажется, что не стоит включить трассировку SQL для всех запросов на сервер ради получения плана запроса всего одной выборки, поскольку это может снизить производительность сервера.
Я пока знаю только 2 легальных пути получения плана запроса клентом:
1) выполнить SET EXPLAIN и просить админа достать файл с сервера
2) использовать встроенную функцию explain_sql(), я привел пример с JDBC, поскольку необходимый топикстартеру инструмент SQuirreL SQL is an open-source Java SQL Client program for any JDBC compliant database.

Кстати, вопрос к Sergey Balter: удалось ли получить план запроса?
...
Рейтинг: 0 / 0
06.12.2011, 22:01
    #37561946
Andron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
...
Рейтинг: 0 / 0
06.12.2011, 22:20
    #37561976
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
victor16АнатоЛойНе понял только, почему решили, что SQLTRACE не поможет?
Потому что конфигурационный параметр SQLTRACE позволяет управлять трассировкой SQL, т.е. кто когда во-сколько какой SQL-оператор выполнил, какие таблицы при этом были затронуты, и какие ресурсы были выделены, вплоть до того какие значения имели переменные при исполнении хранимых процедур, но план запроса он не позволяет получить, впрочем я могу ошибаться.

1. Да, syssqltrace* не полноценная замена SET EXPLAIN..., это даже больше , ибо для проведения оптимизации может дать то, чего не даст SET EXPLAIN.
SQLTRACE включает и трассировку запросов. Информация о трассировке осаждается в таблицах syssqltrace, syssqltrace_info, syssqltrace_iter, syssqltrace_hvar.
onstat -g his, который выводит информацию "из этих таблиц", в том числе выводит следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Iterator/Explain
 ================
 ID   Left  Right   Est Cost   Est Rows   Num Rows    Partnum Type
  3      0      0         17         42        146    1048579 Index Scan
  4      0      0       5249       2366       2366    1048580 Seq Scan
  2      3      4       5266      99372     345436          0 Nested Join
  1      2      0          1          1          1          0 Group
Это ли не есть часть плана выполнения запроса? Имхо, куцый, но всё же план :) Дерево (left-right), в котором есть даже ссылки на обрабатываемые данные БД (partnum). И это только вывод onstat -g his, в syssqltrace_iter есть ещё и какие-то флаги для каждого итератора :). Ищите да обрящете!

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

Трассировку можно включить SQLTRACE "глобально" либо для "сеансов". Кроме того, даже включенную можно отключить через SQL-запрос. Кроме того, включать и выключать можно через SQL отдельно для каждого сеанса .

victor16Я пока знаю только 2 легальных пути получения плана запроса клентом:
1) выполнить SET EXPLAIN и просить админа достать файл с сервера
2) использовать встроенную функцию explain_sql(), я привел пример с JDBC, поскольку необходимый топикстартеру инструмент SQuirreL SQL is an open-source Java SQL Client program for any JDBC compliant database.

Про "легальные пути" - не понял. Есть вариант "не просить админа и взломать сервак"? :)

Так я же поэтому и рассказываю про другие варианты :). Я, например, про explain_sql() ужо забыл, поскольку ни IBM Data Studio, ни Java, ни даже OAT активно не пользую.
Хотел даже на досуге привести пример с получением файла типа EXPLAIN на основании syssqltace*, но чувствую, что будет это не скоро.
Поэтому даю только что найденную ссылку для ищущих . Чтобы привести в свою пользу ещё формальные аргументы, вот цитата из этого источника:
авторThe syssqltrace_iter table is yet another pseudo table that sqltracing creates and
uses for the tracing mechanism. The syssqltrace_iter tables stores the SQL
query plan and
iterators information that is also used by onstat -g his to
display the iterators and explain portion of the onstat output. This table also
allows you to run SQL statements to query the table data. This is extremely
useful if you just want to know the iterator plan and explain information for a
specific SQL, which you need to obtain by running a query using the sql_id on
this table instead of using onstat, which prints all of the tracing information
together.
Вкратце: "в таблице syssqltrace_iter хранится план запроса и " даже больше :). "Можете с помощью SQL поиметь любимую информацию в удобной позе удобном виде"... Отаке...

victor16Кстати, вопрос к Sergey Balter: удалось ли получить план запроса?
Да-да-да... :)
...
Рейтинг: 0 / 0
06.12.2011, 22:31
    #37561994
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
AndronSergey Balter,

План запроса? Легко!
Sergey Balter, как не очень знакомого с Informix, предупреждаю - решения Andron не заточено под Винду, о чём написано в статье и видно из текста ХП, а также нужен Informix 11.50xC6+...
Andron, это пять (поскольку готовое и работающее решение, пусть и с упомянутыми ограничениями...). Но всё равно в syssqltrace больше информации для оптимизации :).
...
Рейтинг: 0 / 0
12.12.2011, 15:16
    #37571071
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
AndronSergey Balter,

План запроса? Легко!

Справедливости ради надо отметить, что это то же самый SET EXPLAIN. В статье приведен способ доставки файлов с сервера клиенту через EXTERNAL TABLEs. Могу предложить дополнительно:

создать буферную таблицу и вставить содержимое файла через команду SYSTEM, которая в свою очередь вызывает dbaccess с соответствующей командой, примерно так:
Код: plsql
1.
2.
3.
let var1 = dbinfo('sessionid');
let var2 = "echo 'insert into mytable ... ' || `cat sqexplain.out` .. | dbaccess mydatabase >/dev/null 2>&1";
system var2;


может использоваться практически во всех версиях INFORMIX. Недостаток - необходимо как-то экранировать неалфавитные символы в файле.


использование пары filetoblob(...,"SERVER") / blobtofile(...,"CLIENT")
может использоваться без ограничения на всех версиях Informix, имеющих поддержку BLOB.

Оба способа предполагают наличие у юзера прав на чтение или запись файлов из файловой системы, что у обычного пользователя бывает не всегда. Правда, по-моему, топик-стартеру это уже не нужно :)
...
Рейтинг: 0 / 0
13.12.2011, 12:07
    #37572520
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
victor16Правда, по-моему, топик-стартеру это уже не нужно :)
Зато сколько нового для себя открыли участники обсуждения! :).
Я, в частности, не задумывался о полезности использования external table, а тут как раз проект по интеграции систем, в одной из систем используется Informix. Муссируется тема bulk insert для повышения производительности.
Стоит проверить и вариант с create external :).
...
Рейтинг: 0 / 0
13.12.2011, 16:16
    #37573271
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
мечта:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
mysql> explain select max(f1+10) from testix where f0=10150 group by f0;
+----+-------------+--------+------+-----------------+---------+---------+-------+------+-------------+
| id | select_type | table  | type | possible_keys   | key     | key_len | ref   | rows | Extra       |
+----+-------------+--------+------+-----------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | testix | ref  | testix3,testix1 | testix3 | 4       | const |    6 | Using index |
+----+-------------+--------+------+-----------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
postgre=# explain select max(position) from roles where id<10 ;
                        QUERY PLAN                         
-----------------------------------------------------------
 Aggregate  (cost=1.03..1.04 rows=1 width=4)
   ->  Seq Scan on roles  (cost=0.00..1.02 rows=1 width=4)
         Filter: (id < 10)
(3 rows)
...
Рейтинг: 0 / 0
13.12.2011, 16:26
    #37573324
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
АнатоЛойМуссируется тема bulk insert для повышения производительности.
Стоит проверить и вариант с create external :).

Проверил... Нравицца!
...
Рейтинг: 0 / 0
13.12.2011, 16:32
    #37573345
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Explain при отсутствии физического доступа к серверу - как?
Журавлев Денисмечта:

В новогодние праздники себя побалую, повожусь... О результатах отпишусь :)
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Explain при отсутствии физического доступа к серверу - как? / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]