как я могу изменить это представление? - PullRequest
0 голосов
/ 25 сентября 2008

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

ALTER VIEW [dbo].[Recon2]
WITH SCHEMABINDING
AS
SELECT     
dbo.Transactions.CustomerCode, 
dbo.Customer_Master.CustomerName, 
dbo.Transactions.TransDate, 
dbo.Transactions.PubCode, 
dbo.Transactions.TransType, 
dbo.Transactions.Copies, 
SUM(dbo.Transactions.TotalAmount) AS TotalAmount, 
'0' AS ReceiptNo, 
'2008-01-01' AS PaymentDate, 
0 AS Amount, 
dbo.Transactions.Period, 
dbo.Transactions.Year, 
dbo.Publication_Master.PubName, 
dbo.Customer_Master.SalesCode,
COUNT_BIG(*) AS COUNT
FROM         
dbo.Publication_Master INNER JOIN
dbo.Customer_Master INNER JOIN
dbo.Transactions ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode ON 
dbo.Publication_Master.PubCode = dbo.Transactions.PubCode
WHERE     
(dbo.Customer_Master.CustomerCode NOT IN
(SELECT     CustomerCode
 FROM       dbo.StreetSaleRcpt
 WHERE      (PubCode = dbo.Transactions.PubCode) AND 
            (TransactionDate = dbo.Transactions.TransDate) AND 
            (Updated = 1) AND 
            (PeriodMonth = dbo.Transactions.Period) AND 
            (PeriodYear = dbo.Transactions.Year)))
GROUP BY dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, 
                      dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.Transactions.[Update], dbo.Transactions.TransType, 
                      dbo.Transactions.Copies, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Transactions.TotalAmount

Ответы [ 3 ]

3 голосов
/ 25 сентября 2008

Я не могу запустить его (очевидно), но как насчет этого ?:

SELECT
dbo.Transactions.CustomerCode, 
dbo.Customer_Master.CustomerName, 
dbo.Transactions.TransDate, 
dbo.Transactions.PubCode, 
dbo.Transactions.TransType, 
dbo.Transactions.Copies, 
'0' AS ReceiptNo, 
'2008-01-01' AS PaymentDate, 
0 AS Amount, 
dbo.Transactions.Period, 
dbo.Transactions.Year, 
dbo.Publication_Master.PubName, 
dbo.Customer_Master.SalesCode, 
dbo.StreetSaleRcpt.CustomerCode,
SUM(dbo.Transactions.TotalAmount) AS TotalAmount, 
COUNT_BIG(*) AS COUNT 
FROM dbo.Publication_Master 
INNER JOIN dbo.Customer_Master ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode 
INNER JOIN dbo.Transactions ON dbo.Publication_Master.PubCode = dbo.Transactions.PubCode 
LEFT OUTER JOIN dbo.StreetSaleRcpt ON (
    dbo.StreetSaleRcpt.PubCode = dbo.Transactions.PubCode 
    AND dbo.StreetSaleRcpt.TransactionDate = dbo.Transactions.TransDate
    AND dbo.StreetSaleRcpt.PeriodMonth = dbo.Transactions.Period
    AND dbo.StreetSaleRcpt.PeriodYear = dbo.Transactions.Year
    AND dbo.StreetSaleRcpt.Updated = 1
    AND dbo.StreetSaleRcpt.CustomerCode = dbo.Customer_Master.CustomerCode
)
WHERE dbo.StreetSaleRcpt.CustomerCode IS NULL
GROUP BY 
dbo.Transactions.CustomerCode, 
dbo.Customer_Master.CustomerName, 
dbo.Transactions.TransDate, 
dbo.Transactions.PubCode, 
dbo.Publication_Master.PubName, 
dbo.Customer_Master.SalesCode, 
dbo.Transactions.[Update], 
dbo.Transactions.TransType, 
dbo.Transactions.Copies, 
dbo.Transactions.Period, 
dbo.Transactions.Year, 
dbo.Transactions.TotalAmount,
dbo.StreetSaleRcpt.CustomerCode

Сделайте ваш коррелированный подзапрос левым соединением и проверьте его отсутствие («WHERE dbo.StreetSaleRcpt.CustomerCode IS NULL») вместо «NOT IN».

Удачи.

0 голосов
/ 25 сентября 2008

Эта форма позволит использовать индекс StreetSaleRcpt для каждой строки Publication_Master:

ALTER VIEW [dbo].[Recon2] WITH SCHEMABINDING AS SELECT
dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Transactions.TransType, dbo.Transactions.Copies, SUM(dbo.Transactions.TotalAmount) AS TotalAmount, '0' AS ReceiptNo, '2008-01-01' AS PaymentDate, 0 AS Amount, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, COUNT_BIG(*) AS COUNT
FROM dbo.Publication_Master 
INNER JOIN dbo.Customer_Master 
INNER JOIN dbo.Transactions ON dbo.Customer_Master.CustomerCode = dbo.Transactions.CustomerCode ON dbo.Publication_Master.PubCode = dbo.Transactions.PubCode 
WHERE
(NOT EXISTS 
   (SELECT NULL FROM dbo.StreetSaleRcpt 
   WHERE (PubCode = dbo.Transactions.PubCode) 
   AND (TransactionDate = dbo.Transactions.TransDate) 
   AND (Updated = 1)
   AND (PeriodMonth = dbo.Transactions.Period) 
   AND (PeriodYear = dbo.Transactions.Year)
   ANMD (CustomerCode = dbo.Customer_Master.CustomerCode)
   )
) GROUP BY dbo.Transactions.CustomerCode, dbo.Customer_Master.CustomerName, dbo.Transactions.TransDate, dbo.Transactions.PubCode, dbo.Publication_Master.PubName, dbo.Customer_Master.SalesCode, dbo.Transactions.[Update], dbo.Transactions.TransType, dbo.Transactions.Copies, dbo.Transactions.Period, dbo.Transactions.Year, dbo.Transactions.TotalAmount
0 голосов
/ 25 сентября 2008

По крайней мере, в Oracle вы можете перейти с VIEW на MATERIALIZED VIEW. Будут рассмотрены некоторые другие проблемы, такие как табличное пространство и методы синхронизации, но, возможно, стоит изучить их.

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

Что наиболее практично, зависит от ряда факторов - размера таблицы, частоты обновлений, потребности в самых актуальных данных и т. Д.

...