Если я создаю SQL-представление с вычисляемыми столбцами, но выбираю подмножество этих столбцов, какую производительность я могу получить? - PullRequest
3 голосов
/ 16 декабря 2011

Если у меня есть представление в SQL, которое содержит различные вычисляемые столбцы, некоторые из которых могут быть очень дорогими, но выбрать только несколько столбцов одновременно, я получу еще больший удар по производительности, чем если бы я был разделить виды на несколько видов и использовать их по отдельности?

Например, если у меня в таблице 5 столбцов, и мое представление содержит те же 5 столбцов, но также 10 простых вычисляемых столбцов и 10 дорогих вычисляемых столбцов (с использованием средних значений или аналогичных) и решают выбрать только один или два из простые вычисляемые столбцы, могу ли я ожидать, что это будет дороже, чем если бы я разделил дорогие столбцы в их собственное представление?

Edit:
Меня особенно интересуют ответы, касающиеся баз данных SQL Server и Postgres, но в случае необходимости достаточно более общего ответа.

Edit2:
Я рассмотрел планы запросов в SQL Server, и кажется, что не стоит составлять план для вычисляемых столбцов, когда они не выбраны, поэтому я надеюсь, что можно объединить все столбцы в одно представление, но хотелось бы подтверждение: D

Редактировать 3:
@ NaveenBabu У меня пока нет проблем с производительностью - это несколько гипотетично. Дополнительные столбцы в основном будут такими, как: DATEPART(mm, aDateField), DATEPART(dd, aDateField) т.е. простые дешевые дополнения к столу. Но будут более сложные дорогие столбцы, такие как: (SELECT COUNT(*) FROM events WHERE events.iTicket = tickets.iCode) as NumberOfEvents

Так что, я думаю, если вы хотите общий пример, представление будет:

CREATE VIEW TicketsView AS
SELECT 
   tickets.idx, tickets.a, tickets.b, tickets.c, tickets.d, 
   DATEPART(mm, a) as ticketMonth, DATEPART(dd, a) as ticketDay, 
   DATEPART(yy, a) as ticketYear, 
   (SELECT COUNT(*) FROM events WHERE events.iTicket = tickets.idx) as numEvents 
FROM tickets

Или что-то в этом роде. Последний столбец явно дороже остальных, поэтому: Если я SELECT tickets.idx, tickets.b, tickets.ticketMonth FROM TicketsView потребуется ли выполнить подсчет / подсчет для вычисления numEvents, так как я не выбрал его из представления?

1 Ответ

2 голосов
/ 16 декабря 2011

В SQL Server основной принцип заключается в том, что представления расширяются в строке.

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

Это означает, что поля, на которые нет ссылок в вашем запросе, не являютсяНе копируется.

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

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

...