Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / View и поизводительность / 20 сообщений из 20, страница 1 из 1
12.02.2006, 17:27
    #33539598
View и поизводительность
Здравствуйте!

Хочется узнать - как влиеят наличие представления на производительность базы (Sybase 12.5.3)

Суть в том, что есть очень большая таблица - и очень интенсивно обновляемая, одно из полей у нее datetime.
Хочется иметь представление, где это поле datetime включает записи, созданные например в прошлом месяце. То есть скажем я это поле с каким-нибудь datepart(mm,dateadd(mm,-1,getdate())). Ну и еще во вьюхе с некоторыми полями операции произведу.

Насколько это будет накладно для сервера?
...
Рейтинг: 0 / 0
12.02.2006, 21:02
    #33539704
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
Трава у домаХочется узнать - как влиеят наличие представления на производительность базы (Sybase 12.5.3)


Если говорить в двух словах, само наличие или отсутствие VIEW никак не влияет на производительнось. Но это не значит, что наличие VIEW в запросе не
может сделать этот запрос катострофически медленно выполняемым. Все зависит от того, какой VIEW используется.

Дело в том, что VIEW оптимизируется вместе со всем запросом, сначала как бы подставляется в запрос, а потом весь запрос оптимизируестя. Но при этом сервер должен сохранить логическую эквивалентность view внутри запроса и сложные view могут приводит к реализации т.н. стратегии материализации view, и обычно это хорошо (для скорости работы запроса) не кончается.
Приведу пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create view my_table_groupped
as
select f1,f2, sum(f3) as s_f3, sum(f4) as s_f4
from my_table
where f5 = 'my_favorite_f5_val'
go

select *
from my_table_groupped
where s_f3 >  200 
and f2 = 'qqq'

В таком случае скорее всего сервер сначала выберет всю таблицу my_table, группируя ее по соотв. полям, а потом применит фильтр по s_f3 и f2.

Трава у дома
Суть в том, что есть очень большая таблица - и очень интенсивно обновляемая, одно из полей у нее datetime.
Хочется иметь представление, где это поле datetime включает записи, созданные например в прошлом месяце. То есть скажем я это поле с каким-нибудь datepart(mm,dateadd(mm,-1,getdate())). Ну и еще во вьюхе с некоторыми полями операции произведу.

Насколько это будет накладно для сервера?

Такое view скорее всего будет так же оптимизируемо, как и просто запрос.
Т.е. view на производительность не повлияет
Однако надо заметить, что применение выражений типа datepart(mm,dateadd(mm,-1,getdate())) плохо сказывается на производительности (как просто запроса, так и запроса с view). Потому что по такому выражению применить индекс сервер не сможет. Рекомендую попробовать выражения LIKE с датой (которые очень хорошо оптимизируются), хотя не представляю как это можно
применить для данного конкретного случая.

Из своего опыта могу сказать, что мы такие запросы клали в процедуры, параметром процедуры служили граничные даты (или они брались из getadate),
далее в переменной вычислялись реальные начальная и конечная дата и потом они вставлялись как параметр в запрос.
...
Рейтинг: 0 / 0
13.02.2006, 00:30
    #33539786
View и поизводительность
Спасибо, очень интересно
...
Рейтинг: 0 / 0
13.02.2006, 00:34
    #33539787
View и поизводительность
Вообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы.

Думал - что если от этого уйти, использовав вьюху, но видимо это будет гораздо тормознутее.
...
Рейтинг: 0 / 0
13.02.2006, 06:16
    #33539824
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
а я то думал, по наивности душевной, что сервер создает материальную сущьность (что нибудь типа индексов полей из основных таблиц) ну да ладно - запомним и учтем что вьюха это - просто запрос...
...
Рейтинг: 0 / 0
13.02.2006, 09:51
    #33539992
View и поизводительность
Трава у домаа я то думал, по наивности душевной, что сервер создает материальную сущьность (что нибудь типа индексов полей из основных таблиц) ну да ладно - запомним и учтем что вьюха это - просто запрос...

вообще в вумных книжках написано, что бывают материализованные представления, когда результаты запроса постоянно хранятся в базе.
Но бывает ли такое в ASE? И могут ли быть в материализованном представлении вычисляемые столбцы?
Идеаьный случай был бы - материализованное представление, обновляемое (в моем случае) по дате. Но такое ощущение, что это фантастика :-)
...
Рейтинг: 0 / 0
13.02.2006, 10:36
    #33540080
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
Трвав у домаВообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы.

Думал - что если от этого уйти, использовав вьюху, но видимо это будет гораздо тормознутее.

Нет, не будет. В таком случае вы можете просто во VIEW всобачивать две константы границы месяца в BETWEEN. Или LIKE.
Это будет эффективно.

create view MYTABLE_last_month
as
select *
from MYTABLE
where date between '20060201' and '20060228'

Но учтите, что поскольку эффективно выборка из этого VIEW будет отличаться от выборки из самой таблицы добавлением в ваш запрос условия
and date between '20060201' and '20060228'
, а записей во всей таблице, как я понимаю, гораздо больше, чем за месяц,
то ваши запросы могут выполняться с меньшей скоростью. Но view здесь ни при чем. Просто если запрос не возмет индекс по date, то он будет обрабатывать записи не за месяц, а все.
...
Рейтинг: 0 / 0
13.02.2006, 10:37
    #33540086
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
вообще в вумных книжках написано, что бывают материализованные представления, когда результаты запроса постоянно хранятся в базе.
Но бывает ли такое в ASE?

Не бывает пока.
...
Рейтинг: 0 / 0
13.02.2006, 10:53
    #33540134
View и поизводительность
MasterZiv create view MYTABLE_last_month
as
select *
from MYTABLE
where date between '20060201' and '20060228'

но тогда надо будет его каждый месяц пересоздавать.
А изначальная идея была в том, чтобы было на автомате - с помощью вычисляемого столбца по getdate() представление было всегда актуальным: данные за прошлый месяц.
Но получается - такой вычисляемый столбец портит производительность :-(
...
Рейтинг: 0 / 0
13.02.2006, 11:32
    #33540298
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
Материализованные представления - те же таблицы, только что создаются и обновляются автоматически на базе полей запроса представления. Так что, сделанная и обновляемая ручками табличка на базе некоего запроса ничем не хуже, чем материализованное представление, разве что кода чуть больше получается. Вы так и делаете. Я вот правда не понимаю фразы:
авторВообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы.
Зачем ее создавать ? У нее каждый месяц структура что ли другая ? Сделайте раз ее и по крону обнуляйте в начале след месяца и заполняйте новым последним месяцем. Сколько кстати у Вас в среднем записей в месяц выходит ?
...
Рейтинг: 0 / 0
13.02.2006, 11:57
    #33540370
View и поизводительность
Записей за месяц - от 800 тыс до миллиона. А в главной - более 30 млн. записей.

ASCRUS я неправильно написал - конечно, я ее не создаю каждый месяц, а очищаю и заполняю данными :-)

Просто в какой-то момент пришла бредовая мысль, что представление с вычисляемым по getdate() столбцом может избавить от крона.
...
Рейтинг: 0 / 0
13.02.2006, 12:04
    #33540406
View и поизводительность
В общем, везде, где я писал "создавать" - конечно, имелось в виду "заполнять".
Шиза.
...
Рейтинг: 0 / 0
14.02.2006, 12:50
    #33543233
_makSim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
Трава у дома MasterZiv create view MYTABLE_last_month
as
select *
from MYTABLE
where date between '20060201' and '20060228'

но тогда надо будет его каждый месяц пересоздавать.
А изначальная идея была в том, чтобы было на автомате - с помощью вычисляемого столбца по getdate() представление было всегда актуальным: данные за прошлый месяц.
Но получается - такой вычисляемый столбец портит производительность :-(

create view MYTABLE_last_month
as
select *
from MYTABLE
where date between dateadd(dd,1-datepart(dd,getdate()),getdate())
and dateadd(dd,-datepart(dd,getdate()),dateadd(mm,1,getdate()))

Зачем пересоздавать? Вот такой запрос по-моему не запретит использование индекса по date.

P.S.: Данное условие нуждается в небольшой корректировке, например по времени. Возможно, ещё что не учтено. Но смысл такой.
...
Рейтинг: 0 / 0
14.02.2006, 13:27
    #33543401
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
работаю с 7й и 9й
иногда проще использовать временные таблицы, чем вьюсы. я у себя некоторую часть логики переписал через tmp таблицы. скорость просчета увеличилась в разы.

с ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно...
...
Рейтинг: 0 / 0
14.02.2006, 15:09
    #33543825
View и поизводительность
авторс ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно...

да, видимо при моих объемах будет медленно.
я примерно такое же сделал как у _makSim но временная таблица быстрее - к тому же
у меня там есть еще одно вычисляемое поле, которое надо индексировать, что в view невозможно, как я понимаю.
Вот если бы представления были с материализацией - это может решило бы проблему.
...
Рейтинг: 0 / 0
14.02.2006, 17:16
    #33544346
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
_makSim
where date between dateadd(dd,1-datepart(dd,getdate()),getdate())
and dateadd(dd,-datepart(dd,getdate()),dateadd(mm,1,getdate()))

Зачем пересоздавать? Вот такой запрос по-моему не запретит использование индекса по date.



Не запретит конечно, но индекс использоваться скорее всего не будет.
Потому что SARG-ом стоит выражение. Оптимизатор не способен вычислить выражение и оценить его селективность. Поэтому индекс по date может использоваться в запросе, но не для оптимизации SARG-а, а если его выберут еще по каким-то критериям.

А хинт индекса во VIEW поставить нельзя (т.е поставить-то можно, да работать не будет).
...
Рейтинг: 0 / 0
14.02.2006, 17:19
    #33544358
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
работаю с 7й и 9й

Ну начнем с того, что разговор об ASE, а не ASA.

с ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно...

Это запросы работают у вас все медленнее и медленнее. Потому что плохие они у вас, таблицы сканируют. Хорошие запросы ведут себя как логарифм от размера таблицы, т.е. практически не растут. А VIEW здесь ни при чем.
...
Рейтинг: 0 / 0
14.02.2006, 17:39
    #33544419
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
MasterZiv
Ну начнем с того, что разговор об ASE, а не ASA.


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

MasterZiv
Это запросы работают у вас все медленнее и медленнее. Потому что плохие они у вас, таблицы сканируют. Хорошие запросы ведут себя как логарифм от размера таблицы, т.е. практически не растут. А VIEW здесь ни при чем.

я не понимаю термина "плохой запрос" и "хороший запрос". если мне надо сделать выборку всех номеров накладных из двух таблиц, то без сканирвоания целой таблицы здесь не обойтись.

вот и получился у меня простой UNION-запрос со статическим ограничением по времени из двух таблиц. работает быстро до тех пор, пока не начинаешь его сортировать или фильтровать. способа его оптимизировать так, чтобы он стал работать так же быстро, как при переделке через временные таблицы - не нашёл. мой опыт пока показал, что обработка во временных таблицах происходит быстрее.
...
Рейтинг: 0 / 0
14.02.2006, 19:09
    #33544666
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
rashmanя не понимаю термина "плохой запрос" и "хороший запрос". если мне надо сделать выборку всех номеров накладных из двух таблиц, то без сканирвоания целой таблицы здесь не обойтись.


Это и есть плохой запрос. т.е. он может быть нужный, но плохой.

rashman
мой опыт пока показал, что обработка во временных таблицах происходит быстрее.


Как бы вам сказать, а то вы опять обидитесь еще ...
Это неправильно. Нельзя сказать, что временные таблицы работают ВСЕГДА быстрее. Когда-то быстрее, когда-то - наоборот. Обычно с ними быстрее, когда у вас есть сложная выборка (возможно со сканированием таблицы), которую потом нужно несколько раз обрабатывать. Таким образом, выделяя данные во временную таблицу, мы делаем сложную выборку только один раз, а потом с маленьким числом записей уже все быстро работает.

Но иногда само наличие временной таблицы будет наоборот портить производительность -- вр. таблицу надо наполнить, и потом удалять, это тоже IO и время.
...
Рейтинг: 0 / 0
15.02.2006, 10:26
    #33545458
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
View и поизводительность
MasterZiv
Как бы вам сказать, а то вы опять обидитесь еще ...


я не обидчивый. но не люблю когда не по делу начинают тыкать носом в оффтоп.

мир-дружба-жвачка ;о)

MasterZiv
Это неправильно. Нельзя сказать, что временные таблицы работают ВСЕГДА быстрее. Когда-то быстрее, когда-то - наоборот. Обычно с ними быстрее, когда у вас есть сложная выборка (возможно со сканированием таблицы), которую потом нужно несколько раз обрабатывать. Таким образом, выделяя данные во временную таблицу, мы делаем сложную выборку только один раз, а потом с маленьким числом записей уже все быстро работает.

Но иногда само наличие временной таблицы будет наоборот портить производительность -- вр. таблицу надо наполнить, и потом удалять, это тоже IO и время.

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

просто поделился своим опытом.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / View и поизводительность / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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