Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.02.2006, 17:27
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Здравствуйте! Хочется узнать - как влиеят наличие представления на производительность базы (Sybase 12.5.3) Суть в том, что есть очень большая таблица - и очень интенсивно обновляемая, одно из полей у нее datetime. Хочется иметь представление, где это поле datetime включает записи, созданные например в прошлом месяце. То есть скажем я это поле с каким-нибудь datepart(mm,dateadd(mm,-1,getdate())). Ну и еще во вьюхе с некоторыми полями операции произведу. Насколько это будет накладно для сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.02.2006, 21:02
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
Трава у домаХочется узнать - как влиеят наличие представления на производительность базы (Sybase 12.5.3) Если говорить в двух словах, само наличие или отсутствие VIEW никак не влияет на производительнось. Но это не значит, что наличие VIEW в запросе не может сделать этот запрос катострофически медленно выполняемым. Все зависит от того, какой VIEW используется. Дело в том, что VIEW оптимизируется вместе со всем запросом, сначала как бы подставляется в запрос, а потом весь запрос оптимизируестя. Но при этом сервер должен сохранить логическую эквивалентность view внутри запроса и сложные view могут приводит к реализации т.н. стратегии материализации view, и обычно это хорошо (для скорости работы запроса) не кончается. Приведу пример : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В таком случае скорее всего сервер сначала выберет всю таблицу my_table, группируя ее по соотв. полям, а потом применит фильтр по s_f3 и f2. Трава у дома Суть в том, что есть очень большая таблица - и очень интенсивно обновляемая, одно из полей у нее datetime. Хочется иметь представление, где это поле datetime включает записи, созданные например в прошлом месяце. То есть скажем я это поле с каким-нибудь datepart(mm,dateadd(mm,-1,getdate())). Ну и еще во вьюхе с некоторыми полями операции произведу. Насколько это будет накладно для сервера? Такое view скорее всего будет так же оптимизируемо, как и просто запрос. Т.е. view на производительность не повлияет Однако надо заметить, что применение выражений типа datepart(mm,dateadd(mm,-1,getdate())) плохо сказывается на производительности (как просто запроса, так и запроса с view). Потому что по такому выражению применить индекс сервер не сможет. Рекомендую попробовать выражения LIKE с датой (которые очень хорошо оптимизируются), хотя не представляю как это можно применить для данного конкретного случая. Из своего опыта могу сказать, что мы такие запросы клали в процедуры, параметром процедуры служили граничные даты (или они брались из getadate), далее в переменной вычислялись реальные начальная и конечная дата и потом они вставлялись как параметр в запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 00:30
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Спасибо, очень интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 00:34
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Вообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы. Думал - что если от этого уйти, использовав вьюху, но видимо это будет гораздо тормознутее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 06:16
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
а я то думал, по наивности душевной, что сервер создает материальную сущьность (что нибудь типа индексов полей из основных таблиц) ну да ладно - запомним и учтем что вьюха это - просто запрос... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 09:51
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Трава у домаа я то думал, по наивности душевной, что сервер создает материальную сущьность (что нибудь типа индексов полей из основных таблиц) ну да ладно - запомним и учтем что вьюха это - просто запрос... вообще в вумных книжках написано, что бывают материализованные представления, когда результаты запроса постоянно хранятся в базе. Но бывает ли такое в ASE? И могут ли быть в материализованном представлении вычисляемые столбцы? Идеаьный случай был бы - материализованное представление, обновляемое (в моем случае) по дате. Но такое ощущение, что это фантастика :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 10:36
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
Трвав у домаВообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы. Думал - что если от этого уйти, использовав вьюху, но видимо это будет гораздо тормознутее. Нет, не будет. В таком случае вы можете просто во 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, то он будет обрабатывать записи не за месяц, а все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 10:37
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
вообще в вумных книжках написано, что бывают материализованные представления, когда результаты запроса постоянно хранятся в базе. Но бывает ли такое в ASE? Не бывает пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 10:53
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
MasterZiv create view MYTABLE_last_month as select * from MYTABLE where date between '20060201' and '20060228' но тогда надо будет его каждый месяц пересоздавать. А изначальная идея была в том, чтобы было на автомате - с помощью вычисляемого столбца по getdate() представление было всегда актуальным: данные за прошлый месяц. Но получается - такой вычисляемый столбец портит производительность :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 11:32
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
Материализованные представления - те же таблицы, только что создаются и обновляются автоматически на базе полей запроса представления. Так что, сделанная и обновляемая ручками табличка на базе некоего запроса ничем не хуже, чем материализованное представление, разве что кода чуть больше получается. Вы так и делаете. Я вот правда не понимаю фразы: авторВообще-то я сейчас эту таблицу (за месяц) просто создаю первого числа, по крону, выбирая туда записи из главной таблицы. Зачем ее создавать ? У нее каждый месяц структура что ли другая ? Сделайте раз ее и по крону обнуляйте в начале след месяца и заполняйте новым последним месяцем. Сколько кстати у Вас в среднем записей в месяц выходит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 11:57
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Записей за месяц - от 800 тыс до миллиона. А в главной - более 30 млн. записей. ASCRUS я неправильно написал - конечно, я ее не создаю каждый месяц, а очищаю и заполняю данными :-) Просто в какой-то момент пришла бредовая мысль, что представление с вычисляемым по getdate() столбцом может избавить от крона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.02.2006, 12:04
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
В общем, везде, где я писал "создавать" - конечно, имелось в виду "заполнять". Шиза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 12:50
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
Трава у дома 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.: Данное условие нуждается в небольшой корректировке, например по времени. Возможно, ещё что не учтено. Но смысл такой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 13:27
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
работаю с 7й и 9й иногда проще использовать временные таблицы, чем вьюсы. я у себя некоторую часть логики переписал через tmp таблицы. скорость просчета увеличилась в разы. с ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 15:09
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
авторс ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно... да, видимо при моих объемах будет медленно. я примерно такое же сделал как у _makSim но временная таблица быстрее - к тому же у меня там есть еще одно вычисляемое поле, которое надо индексировать, что в view невозможно, как я понимаю. Вот если бы представления были с материализацией - это может решило бы проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 17:16
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
_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 поставить нельзя (т.е поставить-то можно, да работать не будет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 17:19
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
работаю с 7й и 9й Ну начнем с того, что разговор об ASE, а не ASA. с ростом таблиц вьюс начинает работать всё медленнее и медленнее... оно и понятно... Это запросы работают у вас все медленнее и медленнее. Потому что плохие они у вас, таблицы сканируют. Хорошие запросы ведут себя как логарифм от размера таблицы, т.е. практически не растут. А VIEW здесь ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 17:39
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
MasterZiv Ну начнем с того, что разговор об ASE, а не ASA. начнем с того, что я читать умею и видел в теме, ап чём речь. именно поэтому и указал с чем столкнулся сам. тема близкая. и не надо меня тыкать носом. MasterZiv Это запросы работают у вас все медленнее и медленнее. Потому что плохие они у вас, таблицы сканируют. Хорошие запросы ведут себя как логарифм от размера таблицы, т.е. практически не растут. А VIEW здесь ни при чем. я не понимаю термина "плохой запрос" и "хороший запрос". если мне надо сделать выборку всех номеров накладных из двух таблиц, то без сканирвоания целой таблицы здесь не обойтись. вот и получился у меня простой UNION-запрос со статическим ограничением по времени из двух таблиц. работает быстро до тех пор, пока не начинаешь его сортировать или фильтровать. способа его оптимизировать так, чтобы он стал работать так же быстро, как при переделке через временные таблицы - не нашёл. мой опыт пока показал, что обработка во временных таблицах происходит быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.02.2006, 19:09
|
|||
|---|---|---|---|
View и поизводительность |
|||
|
#18+
rashmanя не понимаю термина "плохой запрос" и "хороший запрос". если мне надо сделать выборку всех номеров накладных из двух таблиц, то без сканирвоания целой таблицы здесь не обойтись. Это и есть плохой запрос. т.е. он может быть нужный, но плохой. rashman мой опыт пока показал, что обработка во временных таблицах происходит быстрее. Как бы вам сказать, а то вы опять обидитесь еще ... Это неправильно. Нельзя сказать, что временные таблицы работают ВСЕГДА быстрее. Когда-то быстрее, когда-то - наоборот. Обычно с ними быстрее, когда у вас есть сложная выборка (возможно со сканированием таблицы), которую потом нужно несколько раз обрабатывать. Таким образом, выделяя данные во временную таблицу, мы делаем сложную выборку только один раз, а потом с маленьким числом записей уже все быстро работает. Но иногда само наличие временной таблицы будет наоборот портить производительность -- вр. таблицу надо наполнить, и потом удалять, это тоже IO и время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.02.2006, 10:26
|
|||
|---|---|---|---|
|
|||
View и поизводительность |
|||
|
#18+
MasterZiv Как бы вам сказать, а то вы опять обидитесь еще ... я не обидчивый. но не люблю когда не по делу начинают тыкать носом в оффтоп. мир-дружба-жвачка ;о) MasterZiv Это неправильно. Нельзя сказать, что временные таблицы работают ВСЕГДА быстрее. Когда-то быстрее, когда-то - наоборот. Обычно с ними быстрее, когда у вас есть сложная выборка (возможно со сканированием таблицы), которую потом нужно несколько раз обрабатывать. Таким образом, выделяя данные во временную таблицу, мы делаем сложную выборку только один раз, а потом с маленьким числом записей уже все быстро работает. Но иногда само наличие временной таблицы будет наоборот портить производительность -- вр. таблицу надо наполнить, и потом удалять, это тоже IO и время. я это прекрасно понимаю. и у меня не вся логика работает на тмп - вьюсов тоже хватает. но когда речь зашла о низкой производительности, я не смог оптимизировать запрос так, чтобы вьюс стал быстрее работать. было проще переделать в корне. просто поделился своим опытом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&tablet=1&tid=2013066]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 350ms |

| 0 / 0 |
