[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP и Представления (VIEW)
Curse
Подскажите, пожалуйста, как можно работать с представлениями при помощи PHP. Представления уже имеются на сервере MS SQL 2000, как их можно вызвать и получить из них данные?



Спустя 11 минут, 42 секунды (27.10.2010 - 21:49) waldicom написал(а):
Так же, как и с обычными таблицами

Спустя 1 минута, 34 секунды (27.10.2010 - 21:51) sergeiss написал(а):
Если ты умеешь работать с таблицами из той же БД, то с view работа ведётся точно также. Те же самые select'ы с джойнами или без джойнов... То есть, с точки зрения БД что view, что таблицы обрабатываются абсолютно одинаково.
По запросу даже не поймешь, на самом деле, откуда же именно берутся данные.

Спустя 1 час, 28 минут, 46 секунд (27.10.2010 - 23:19) Curse написал(а):
Приведите пример, пожалуйста.

Спустя 6 минут, 52 секунды (27.10.2010 - 23:26) Curse написал(а):
Приведите пример, пожалуйста.
Дело в том, что таблица содержит информацию, а представление содержит запрос.

Спустя 19 минут, 15 секунд (27.10.2010 - 23:45) waldicom написал(а):
Цитата (Curse @ 27.10.2010 - 22:26)
Дело в том, что таблица содержит информацию, а представление содержит запрос.

Для конечного пользователя нет никакой разницы. Поэтому просто работайте как с таблицей. Вы вообще пытались это сделать? Может какую ошибку скрипт выдает?

Спустя 1 день, 22 часа, 59 минут, 24 секунды (29.10.2010 - 22:45) Curse написал(а):
Ошибки нет, но продолжительность выполнения VIEW сводит с ума, от 35 до 570 секунд

Спустя 1 минута, 54 секунды (29.10.2010 - 22:47) twin написал(а):
то что за VIEW такой... Можно одним глазком?

Спустя 23 минуты, 34 секунды (29.10.2010 - 23:10) waldicom написал(а):
Цитата (Curse @ 29.10.2010 - 21:45)
Ошибки нет, но продолжительность выполнения VIEW сводит с ума, от 35 до 570 секунд

Столбцы VIEW при соединении используют индексы? Что говорит explain?

Спустя 1 день, 18 часов, 49 минут, 11 секунд (1.11.2010 - 19:00) Curse написал(а):
waldicom В самих представлениях какие соединения не знаю, в базах индексируется дата.
Используются 2 представления, выполняются более 12 секунд каждый, есть ли возможность оптимизировать запрос?
CREATE VIEW dbo.VIEW_DTVProverkaUk
AS
SELECT
MIN(dbo.Proverka_UK.Nastr_DT) AS VProverkaDT, dbo.UK.DT
FROM dbo.UK LEFT OUTER JOIN dbo.Proverka_UK ON dbo.UK.DT <= dbo.Proverka_UK.Nastr_DT
GROUP BY dbo.UK.DT

и
CREATE VIEW dbo.VIEW_DTNastrUk
AS
SELECT
MAX(dbo.Nastr_UK.Nastr_DT) AS DTNastr, dbo.UK.DT
FROM dbo.UK LEFT OUTER JOIN dbo.Nastr_UK ON dbo.UK.DT >= dbo.Nastr_UK.Nastr_DT
GROUP BY dbo.UK.DT

В таблицах dbo.Nastr_UK и dbo.Proverka_UK около 1000 записей
В таблице dbo.UK около 35000 записей

Спустя 42 минуты, 25 секунд (1.11.2010 - 19:42) waldicom написал(а):
Сделайте так:

EXPLAIN SELECT MIN(dbo.Proverka_UK.Nastr_DT) AS VProverkaDT, dbo.UK.DT
FROM dbo.UK LEFT OUTER JOIN dbo.Proverka_UK ON dbo.UK.DT <= dbo.Proverka_UK.Nastr_DT
GROUP BY dbo.UK.DT

и
EXPLAIN SELECT MAX(dbo.Nastr_UK.Nastr_DT) AS DTNastr, dbo.UK.DT
FROM dbo.UK LEFT OUTER JOIN dbo.Nastr_UK ON dbo.UK.DT >= dbo.Nastr_UK.Nastr_DT
GROUP BY dbo.UK.DT

и покажите результаты

Спустя 1 час, 6 минут, 50 секунд (1.11.2010 - 20:49) Curse написал(а):
Смогу показать только завтра, спасибо за помощь.

Спустя 1 день, 2 часа, 25 минут, 16 секунд (2.11.2010 - 23:14) Curse написал(а):
Microsoft SQL SERVER 2000 не понимает что такое EXPLAIN

Спустя 2 часа, 24 минуты, 28 секунд (3.11.2010 - 01:38) SlavaFr написал(а):
есть ли индексы на
dbo.Nastr_UK.Nastr_DT, dbo.UK.DT

хотя даже при индексах такое view не может быстро работать. для соединения dbo.UK.DT <= dbo.Proverka_UK.Nastr_DT база создавает темп таблицу где на каждый dbo.UK.DT до 1000 записей из Proverka_UK джойнт.

предлагаю опробовать варианты типа
SELECT ( select MIN(dbo.Proverka_UK.Nastr_DT) from dbo.Proverka_UK where dbo.Proverka_UK.Nastr_DT>= dbo.UK.DT)AS VProverkaDT, dbo.UK.DT
FROM dbo.UK

и
SELECT (select  MAX(dbo.Nastr_UK.Nastr_DT) from dbo.Nastr_UK where dbo.Nastr_UK.Nastr_DT <= dbo.UK.DT) AS DTNastr, dbo.UK.DT
FROM dbo.UK

Спустя 13 часов, 38 минут (3.11.2010 - 15:16) Curse написал(а):
Индексы только по DT

Спустя 44 минуты, 51 секунда (3.11.2010 - 16:01) SlavaFr написал(а):
Цитата (Curse @ 3.11.2010 - 12:16)
Индексы только по DT

индексы нужны по полям
dbo.Nastr_UK.Nastr_DT,
dbo.UK.DT,
dbo.Nastr_UK.Nastr_DT

Спустя 6 дней, 7 часов, 49 минут, 40 секунд (9.11.2010 - 23:51) Curse написал(а):
SlavaFr, Спасибо. Время на каждый запрос сократилось приблизительно на 1/3.

Спустя 1 час, 17 минут, 8 секунд (10.11.2010 - 01:08) SlavaFr написал(а):
да, не особо ускорилось.
А какие ты запросы на VIEW делаеш и как часто?
как долго протекает запрос теперь?

Если скорость очень важна, то возможно для ускорения прийдется делать денормализацию или создать связывающую таблицу между dbo.UK и подходящим значением из dbo.Proverka_UK.

Спустя 5 часов, 55 минут, 44 секунды (10.11.2010 - 07:04) Curse написал(а):
Некоторый View вызываются в других представлениях.

CREATE VIEW dbo.VIEW_PribUzk
AS
SELECT
dbo.VIEW_DTNastrUzk.DT, dbo.Users.Fio AS Fio_Prib, dbo.Nastr_UZK.TabNum AS TabNum_Prib
FROM dbo.VIEW_DTNastrUzk INNER JOIN
dbo.Nastr_UZK ON dbo.VIEW_DTNastrUzk.DTNastr = dbo.Nastr_UZK.Nastr_DT INNER JOIN
dbo.Users ON dbo.Nastr_UZK.TabNum = dbo.Users.TabNum
WHERE (dbo.Users.Vid_Users = 3)


CREATE VIEW dbo.VIEW_DTNastrProverkaUzk
AS
SELECT
MAX(dbo.Proverka_UZK.Nastr_DT) AS ProverkaDT, dbo.VIEW_DTNastrUzk.DTNastr AS NastrDT, dbo.VIEW_DTNastrUzk.DT
FROM dbo.VIEW_DTNastrUzk LEFT OUTER JOIN
dbo.Proverka_UZK ON dbo.VIEW_DTNastrUzk.DTNastr <= dbo.Proverka_UZK.Nastr_DT AND
dbo.VIEW_DTNastrUzk.DT >= dbo.Proverka_UZK.Nastr_DT
GROUP BY dbo.VIEW_DTNastrUzk.DTNastr, dbo.VIEW_DTNastrUzk.DT


CREATE VIEW dbo.VIEW_VProverkaUzk
AS
SELECT
dbo.VIEW_DTVProverkaUzk.DT, dbo.VIEW_DTVProverkaUzk.VProverkaDT, dbo.Proverka_UZK.Brak_Imp, dbo.Proverka_UZK.Good_Imp,
dbo.Proverka_UZK.NBrak_Imp, dbo.Proverka_UZK.NGood_Imp, dbo.Proverka_UZK.Result
FROM dbo.Proverka_UZK INNER JOIN dbo.VIEW_DTVProverkaUzk ON dbo.Proverka_UZK.Nastr_DT = dbo.VIEW_DTVProverkaUzk.VProverkaDT

DT в таблицах - дата, сейчас пытаюсь запросы ограничить по дате
Затем все VIEW объединяются:
CREATE VIEW dbo.VIEW_UZK
AS
SELECT DISTINCT

OP 100 PERCENT dbo.UZK.Num_Izd AS [НИ], dbo.TP.Num_TP AS [НТП], dbo.IZD.Izd_Order AS [ПН],
dbo.TP.Project AS Проект, dbo.TP.Koi AS КОИ, dbo.UZK.Control_Type AS [ТК], dbo.UZK.Shov_Imp AS [ШВИ],
dbo.UZK.Shov_mm AS [ШВММ], dbo.UZK.Result AS [РК], dbo.UZK.TabNum_Oper AS [ТНО],
dbo.UZK.TabNum_OTK AS [], dbo.VIEW_PribUzk.TabNum_Prib AS [],
dbo.UZK.DT AS [], dbo.VIEW_OperUzk.Fio_Oper AS [], dbo.VIEW_OtkUzk.Fio_OTK AS [],
dbo.VIEW_PribUzk.Fio_Prib AS [], CONVERT(datetime, STR(DATEPART(dd, dbo.UZK.DT), 2) + '.' + STR(DATEPART(mm, dbo.UZK.DT),
2) + '.' + STR(DATEPART(yy, dbo.UZK.DT), 4), 104) AS [ДатаК], dbo.VIEW_DTNastrProverkaUzk.ProverkaDT AS [Дата и время П],
dbo.Proverka_UZK.Brak_Imp AS [], dbo.Proverka_UZK.Good_Imp AS [],
dbo.Proverka_UZK.NBrak_Imp AS [], dbo.Proverka_UZK.NGood_Imp AS [],
dbo.Proverka_UZK.Result AS [], dbo.VIEW_DTNastrProverkaUzk.NastrDT AS [Дата и время Н],
dbo.Nastr_UZK.Brak_Imp AS [], dbo.Nastr_UZK.Good_Imp AS [],
dbo.Nastr_UZK.Brak_Level AS [], dbo.VIEW_VProverkaUzk.VProverkaDT AS [Дата и время ПП],
dbo.VIEW_VProverkaUzk.Brak_Imp AS [], dbo.VIEW_VProverkaUzk.Good_Imp AS [],
dbo.VIEW_VProverkaUzk.NBrak_Imp AS [],
dbo.VIEW_VProverkaUzk.NGood_Imp AS [],
dbo.VIEW_VProverkaUzk.Result AS []
FROM dbo.VIEW_PribUzk RIGHT OUTER JOIN
dbo.VIEW_VProverkaUzk RIGHT OUTER JOIN
dbo.TP INNER JOIN
dbo.IZD ON dbo.TP.Id_Tp = dbo.IZD.Id_Tp INNER JOIN
dbo.UZK ON dbo.IZD.Num_IZD = dbo.UZK.Num_Izd INNER JOIN
dbo.VIEW_DTNastrProverkaUzk ON dbo.UZK.DT = dbo.VIEW_DTNastrProverkaUzk.DT ON dbo.VIEW_VProverkaUzk.DT = dbo.UZK.DT LEFT OUTER JOIN
dbo.Nastr_UZK ON dbo.VIEW_DTNastrProverkaUzk.NastrDT = dbo.Nastr_UZK.Nastr_DT LEFT OUTER JOIN
dbo.Proverka_UZK ON dbo.VIEW_DTNastrProverkaUzk.ProverkaDT = dbo.Proverka_UZK.Nastr_DT ON
dbo.VIEW_PribUzk.DT = dbo.UZK.DT LEFT OUTER JOIN
dbo.VIEW_OtkUzk ON dbo.UZK.DT = dbo.VIEW_OtkUzk.DT LEFT OUTER JOIN
dbo.VIEW_OperUzk ON dbo.UZK.DT = dbo.VIEW_OperUzk.DT
ORDER BY dbo.VIEW_DTNastrProverkaUzk.NastrDT, dbo.VIEW_DTNastrProverkaUzk.ProverkaDT, dbo.TP.Num_TP, dbo.IZD.Izd_Order, dbo.UZK.DT

Изначально представление выполнялось 45 секунд, из них по 12 секунд, на запросы разобранные раньше. Предложенные вами запросы выполняются 9 секунд.
При использовании ограничений по дате, запрос ниже выполняется меньше чем за 1 секунду
SELECT (SELECT MIN(dbo.Proverka_UZK.Nastr_DT)
FROM dbo.Proverka_UZK
WHERE dbo.Proverka_UZK.Nastr_DT >= dbo.UZK.DT AND dbo.UZK.DT >= DATEADD(day, - 1, dbo.Proverka_UZK.Nastr_DT)) AS VProverkaDT, DT
FROM dbo.UZK

Сегодня посмотрю остальные

Спустя 17 часов, 53 секунды (11.11.2010 - 00:05) Curse написал(а):
Можно ли изменить запрос
CREATE VIEW dbo.VIEW_VProverkaUzk AS
SELECT
dbo.VIEW_DTVProverkaUzk.DT, dbo.VIEW_DTVProverkaUzk.VProverkaDT, dbo.Proverka_UZK.Brak_Imp, dbo.Proverka_UZK.Good_Imp,
dbo.Proverka_UZK.NBrak_Imp, dbo.Proverka_UZK.NGood_Imp, dbo.Proverka_UZK.Result
FROM dbo.Proverka_UZK INNER JOIN dbo.VIEW_DTVProverkaUzk ON dbo.Proverka_UZK.Nastr_DT = dbo.VIEW_DTVProverkaUzk.VProverkaDT
CREATE VIEW dbo.VIEW_DTNastrUzk

Который брал следующие данные
VProverkaDT     	DT
06.11.2009 19:53 06.11.2009 19:33
06.11.2009 19:53 06.11.2009 19:34
06.11.2009 19:53 06.11.2009 19:34
09.11.2009 7:25 06.11.2009 20:01
09.11.2009 10:41 09.11.2009 7:27
09.11.2009 10:41 09.11.2009 7:38
09.11.2009 10:41 09.11.2009 7:38

Так, Что бы он не терял данные.
После изменения некоторых представлений данные в них стали отличаться:
VProverkaDT     	DT
06.11.2009 19:53 06.11.2009 19:33
06.11.2009 19:53 06.11.2009 19:34
06.11.2009 19:53 06.11.2009 19:34
06.11.2009 20:01
09.11.2009 10:41 09.11.2009 7:27
09.11.2009 10:41 09.11.2009 7:38
09.11.2009 10:41 09.11.2009 7:38

Можно ли изменить запрос что бы строки с отсутствующими данными не выпадали?
Дата 09.11.2009 7:25 не важна, нужна пустая ячейка.

Спустя 14 часов, 52 минуты, 8 секунд (11.11.2010 - 14:57) SlavaFr написал(а):
я бы советовал отказатся от применения VIEW для использвнания его в других сложных опросах. Делай запрос на прямую и тогда ты сможеш полностью использовать индехы базы данных для быстрого опроса.
Цитата (Curse @ 10.11.2010 - 21:05)
После изменения некоторых представлений данные в них стали отличаться

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

Спустя 8 часов, 30 минут, 7 секунд (11.11.2010 - 23:27) Curse написал(а):
Без VIEW обойтись нельзя. К ним обращаются программы написанные в Microsoft Access, поэтому структуру итоговых представлений я не могу менять sad.gif

Спустя 1 час, 24 минуты, 6 секунд (12.11.2010 - 00:51) SlavaFr написал(а):
я в mssql к сожалению не шарю, да и чтоб нормальные советы в соложных таблицах давать нужно таблицы для тестирования под рукой иметь.

[любопытство]
а что означает AS [] ?
записывает все в один масив? или как?
[/любопытство]

Спустя 1 день, 33 минуты, 4 секунды (13.11.2010 - 01:24) Curse написал(а):
Видимо нет... если запрос делать по одной колонке, он выполнится быстро, не формируя остальные поля таблицы О_О

Спустя 11 часов, 40 минут, 19 секунд (13.11.2010 - 13:04) SlavaFr написал(а):
ну так не проще ли сразу только нужные поля перечислить?

Спустя 1 месяц, 1 день, 3 часа, 24 минуты, 33 секунды (14.12.2010 - 16:29) Curse написал(а):
оказалось быстрее, если перечислить поля, но не везде это удается sad.gif
Некоторые представления, ссылающиеся более чем на 2 других представления не получается переписать... иногда от сервера ответ не приходит в течении 2х часов.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.