|
|
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Начну издалека: У меня есть таблица, на которую создан VIEW. Выглядит примерно так CREATE TABLE Table ( id INT NOT NULL PRIMARY KEY, className VARCHAR(20), ref1 INT REFERENCES ... ref2 INT REFERENCES ... ... ); CREATE VIEW View AS SELECT * FROM Table WHERE className = 'Foo'; Проблемы следующая: запрос на таблицу Table (к примеру SELECT * FROM Table WHERE ref1 = ... AND ref2 = ...) работает быстро, а такой же запрос к View работает гораздо медленнее... Индекс на колонку className создан, но от тоже особо не помогает. запрос вроде SELECT * FROM Table WHERE className = 'Foo' AND ref1 = ... AND ref2 = ... также работает быстрее, чем SELECT * FROM View WHERE ref1 = ... AND ref2 = ... В чем же дело? Как ускорить работу Informix-а со вьюшками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2005, 19:23 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
А при запросе через вьюшку индексы используются ? И какой размер выборки ? Очень большой ? Есть ли нормальные темповые пространства на сервере ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2005, 19:33 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Покажите execution plan для обеих вариантов. (set explain on; select ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 00:16 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
--А при запросе через вьюшку индексы используются ? В каком смысле? --И какой размер выборки ? Очень большой ? Количество записей в таблице около 400000, сама выборка может быть пустой --Есть ли нормальные темповые пространства на сервере ? Есть --Покажите execution plan для обеих вариантов А как его можно посмотреть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 15:26 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Вот что получилось: QUERY: ------ SELECT count(*) FROM PersonExamList WHERE PersonExamList.studentID IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3 AND begin_year = 1998 AND specialityID=11) AND PersonExamList.parentid=0 Estimated Cost: 321 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) and.graderecord: INDEX PATH Filters: ((and.graderecord.classname = 'PersonExamList' AND and.graderec ord.parentid = 0 ) AND and.graderecord.examsheetid IS NULL ) (1) Index Keys: studentid (Parallel, fragments: ALL) Lower Index Filter: and.graderecord.studentid = ANY <subquery> Subquery: --------- Estimated Cost: 221 Estimated # of Rows Returned: 8 Maximum Threads: 1 1) and.student: INDEX PATH Filters: and.student.specialityid = 11 (1) Index Keys: branchid facultyid state studyformid begin_year (Key-F irst) (Parallel, fragments: ALL) Lower Index Filter: (and.student.branchid = -1 AND and.student.facul tyid = 3 ) Key-First Filters: (and.student.begin_year = 1998 ) Соответственно хотелось бы: Чтобы сначала исполнялось (1) Index Keys: studentid (Parallel, fragments: ALL) Lower Index Filter: and.graderecord.studentid = ANY <subquery> а затем Filters: ((and.graderecord.classname = 'PersonExamList' AND and.graderec ord.parentid = 0 ) AND and.graderecord.examsheetid IS NULL ) Можно ли так сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 15:43 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Можно, читайте "optimizer directives" в доках. Но тема не раскрыта - почему отдельный select выполняется быстрее, чем теоретически идентичный с использованием view. Народ интересуется сравнить планы выполнения в обеих случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 23:27 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Вот планы выполнения обоих запросов.. Первый для VIEW, второй для TABLE.. Кстати план для VIEW отличается от ранее приведенного, различие видимо возникло из-за того, что первый выполнялся на однопроцессорной машине, а второй не дву.. Структура баз данных одна и таже QUERY: ------ SELECT count(*) FROM PersonExamList WHERE PersonExamList.studentID IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3 AND begin_year = 1998 AND specialityID=11) AND PersonExamList.parentid=0 Estimated Cost: 16 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) and.graderecord: INDEX PATH Filters: ((and.graderecord.studentid = ANY <subquery> AND and.graderecord.classname = 'PersonExamList' ) AND and.graderecord.parentid = 0 ) (1) Index Keys: examsheetid (Parallel, fragments: ALL) Lower Index Filter: and.graderecord.examsheetid IS NULL Subquery: --------- Estimated Cost: 2 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) and.student: INDEX PATH (1) Index Keys: facultyid branchid begin_year specialityid (Parallel, fragments: A LL) Lower Index Filter: (((and.student.begin_year = 1998 AND and.student.branchid = -1 ) AND and.student.specialityid = 11 ) AND and.student.facultyid = 3 ) QUERY: ------ SELECT count(*) FROM GradeRecord WHERE GradeRecord.studentID IN (SELECT id FROM Student WHERE branchID = -1 AND facultyID = 3 AND begin_year = 1998 AND specialityID=11) AND GradeRecord.parentid=0 Estimated Cost: 32 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) and.graderecord: INDEX PATH Filters: and.graderecord.parentid = 0 (1) Index Keys: studentid (Parallel, fragments: ALL) Lower Index Filter: and.graderecord.studentid = ANY <subquery> Subquery: --------- Estimated Cost: 2 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) and.student: INDEX PATH (1) Index Keys: facultyid branchid begin_year specialityid (Parallel, fragments: A LL) Lower Index Filter: (((and.student.begin_year = 1998 AND and.student.branchid = -1 ) AND and.student.specialityid = 11 ) AND and.student.facultyid = 3 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 11:17 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
alanderВот планы выполнения обоих запросов.. Первый для VIEW, второй для TABLE.. Я чего-то не понял. Запросы разные - соотв-но и планы разные. Чтобы запрос для TABLE был такой же как для VIEW, в нем нужно также указать ограничение, которое есть во вьюшке PersonExamList по таблице GradeRecord. И для полного счастья еще текст вьюхи, чтобы увидеть енто самое ограничение вживую. ЗЫ "план для VIEW отличается от ранее приведенного" видимо по причине различности данных на двух базах. В "ранее приведенном" случае большее кол-во строк удовлетворяет условиям выборки. В таких условиях и план будет другим (не обязательно, конечно), даже если БД идентичны по схеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 18:39 |
|
||
|
Медленная обработка VIEW Informix-ом
|
|||
|---|---|---|---|
|
#18+
Ув. alander ! Когда вы сравниваете 2 запроса, то сравнивайте яблоки с яблоками - приводите планы ОДНОГО И ТОГО ЖЕ запроса (с использованием и без использования view) НА ОДНИХ И ТЕХ ЖЕ ДАННЫХ. Потому что план запроса в информикс зависит не только от структуры базы, но и от самих данных. Про UPDATE STATISTCS слыхали ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2005, 01:13 |
|
||
|
|

start [/forum/topic.php?fid=44&fpage=59&tid=1609033]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 340ms |

| 0 / 0 |
