Вопрос

Когда я создаю представление, я в основном делающую новую таблицу, которая автоматически будет трансертирована, когда данные в одном из таблиц она объединяет изменения; это правильно?

Также почему я не могу использовать подзапросы на мой взгляд?

Это было полезно?

Решение

Просмотр работ как таблица, но это не столик. Это никогда не существует; Это только подготовленное утверждение SQL, которое выполняется, когда вы ссылаетесь на имя просмотра. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

... эквивалентно запуску:

SELECT x.* 
  FROM (SELECT * FROM bar) x

MySqldumm никогда не будет содержать строки, которые будут вставлены в вид ...

Также почему я не могу использовать подзапросы на мой взгляд ????

Это, к сожалению, является (хотя и сомнительным) дизайном. Есть многочисленные ограничения для видов MySQL, которые документированы: http://dev.mysql.com/doc/refman/5.0/ruete-view.html.

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


Нет.
Таблица может иметь индексы, связанные с индексами, которые могут сделать поиск данных быстрее (при некоторых затратах для вставки / обновления). Некоторые базы данных поддерживают «материализованные» представления, которые являются представлениями, которые могут иметь к ним индексы, которые не должны быть удивленным, что MySQL не поддерживает Учитывая функциональность ограниченного просмотра (которая только началась в V5 IIRC, очень поздно в игре).

Поскольку представление представляет собой производную таблицу, производительность представления так же хорош, как запрос, включенный. Если этот запрос отстой, проблема производительности будет просто Snowball ... что сказал, когда при запросе представления - если ссылка на столбце представления в предложении Where не попадает в функцию (т. Е. WHERE v.column LIKE ..., нет WHERE LOWER(t.column) LIKE ...) Оптимизатор может протолкнуть критерии (называемый предикатом) на исходный запрос - делая его быстрее.

Другие советы

Я также столкнулся с такой же проблемой (к моему удивлению, потому что мой поиск, похоже, указывает на то, что Oracle и MS поддерживают его).

Я получаю это ограничение (по крайней мере, на данный момент до доказательства не используемого) путем создания двух дополнительных просмотров для моего окончательного представления.

Пример:

CREATE VIEW Foo1 AS
    SELECT * FROM t ORDER BY ID, InsertDate DESC

CREATE VIEW Foo2 AS
    SELECT * FROM Foo1 GROUP BY ID

CREATE VIEW Foo AS
    SELECT * FROM Foo2 ORDER BY ID

Пример выше в основном имеет таблицу «T», которая является временной таблицей, содержащей все ревизии. Мой «Foo» (вид) в основном - простой вид только на мои самые современные изменения каждой записи. Кажется, работает хорошо!

Обновлять:

Я не знаю, есть ли это еще одна ошибка в MySQL 5.1, но вышеприведенный пример на самом деле не работает! «Foo1» работает, как и ожидалось, но «Foo2», похоже, игнорирует заказ до группировки, поэтому мой конечный результат не то, что предназначен. Я даже получаю тот же результат, если я изменим «Desc» для «ASC» (удивительно).

Кроме того, если вы прочитаете 17.5.1. Просмотр синтаксиса Раздел, это четко утверждено:

«Вид может быть создан из многих видов выбора операторов. Это может относиться к базовым таблицам или другим представлениям. Он может использовать объединения, объединение и подзапросы».

Я собираюсь обновить свою базу данных до 5,6 и попробовать его снова!

Разница:

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

CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar) 

будет работать - но в то же время вы получите вид только для чтения ... простой вид на одной таблице позволит обновить «через» вид на базовую таблицу

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top