powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / View и поизводительность
20 сообщений из 20, страница 1 из 1
View и поизводительность
    #33539598
Здравствуйте!

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

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

Насколько это будет накладно для сервера?
...
Рейтинг: 0 / 0
View и поизводительность
    #33539704
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трава у домаХочется узнать - как влиеят наличие представления на производительность базы (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
View и поизводительность
    #33539786
Спасибо, очень интересно
...
Рейтинг: 0 / 0
View и поизводительность
    #33539787
Вообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы.

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

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

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

Нет, не будет. В таком случае вы можете просто во 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
View и поизводительность
    #33540086
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще в вумных книжках написано, что бывают материализованные представления, когда результаты запроса постоянно хранятся в базе.
Но бывает ли такое в ASE?

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

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

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

Просто в какой-то момент пришла бредовая мысль, что представление с вычисляемым по getdate() столбцом может избавить от крона.
...
Рейтинг: 0 / 0
View и поизводительность
    #33540406
В общем, везде, где я писал "создавать" - конечно, имелось в виду "заполнять".
Шиза.
...
Рейтинг: 0 / 0
View и поизводительность
    #33543233
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Трава у дома 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
View и поизводительность
    #33543401
rashman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работаю с 7й и 9й
иногда проще использовать временные таблицы, чем вьюсы. я у себя некоторую часть логики переписал через tmp таблицы. скорость просчета увеличилась в разы.

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

да, видимо при моих объемах будет медленно.
я примерно такое же сделал как у _makSim но временная таблица быстрее - к тому же
у меня там есть еще одно вычисляемое поле, которое надо индексировать, что в view невозможно, как я понимаю.
Вот если бы представления были с материализацией - это может решило бы проблему.
...
Рейтинг: 0 / 0
View и поизводительность
    #33544346
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
View и поизводительность
    #33544358
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работаю с 7й и 9й

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

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

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


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

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

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

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


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

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


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

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


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

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

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

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

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

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


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