Как я могу улучшить объединение итерации - PullRequest
0 голосов
/ 31 мая 2011

Я пытаюсь эффективно просмотреть базу данных, но изо всех сил.Следующий фрагмент создается из хранимой процедуры, которая перебирает все категории и имена полей.Проблема в том, что мне нужен топ-1 на основе поиска.Другая проблема заключается в том, что теперь мне нужно расширить это, чтобы сделать несколько мест, а не только одно, что он делает из моего кода .net на данный момент, чтобы сделать его более эффективным.

Любой совет поможет,спасибо

DECLARE @ApplicationProviderId INT
SET @ApplicationProviderId = 3
DECLARE @LocationId BIGINT
SET @LocationId = 928502
DECLARE @CategoryId INT
SET @CategoryId = 502
SELECT  sub.VolatileLocationContentId, sub.ContentProviderId, sub.CategoryId, sub.FieldName, sub.Value  --, sub.*
    FROM
        (SELECT     TOP 1 vlc.VolatileLocationContentId, vlc.ContentProviderId, vlc.CategoryId, vlc.FieldName, vlc.Value

        FROM            [VolatileLocationContent] vlc

        INNER JOIN  [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
        ON          vlc.ContentProviderId = apcpvlc.ContentProviderId
        AND         vlc.FieldName = apcpvlc.FieldName

        WHERE           apcpvlc.ApplicationProviderId = @ApplicationProviderId
        AND         LocationId = @LocationId
        AND         vlc.FieldName = 'DescriptionStandard'
        AND         NOT vlc.Value IS null AND           vlc.CategoryId = @CategoryId                AND         vlc.DeactivatedOn IS NULL
        ORDER BY    apcpvlc.Priority
        ) sub
UNION
            SELECT  sub.VolatileLocationContentId, sub.ContentProviderId, sub.CategoryId, sub.FieldName, sub.Value  --, sub.*
    FROM
        (SELECT     TOP 1 vlc.VolatileLocationContentId, vlc.ContentProviderId, vlc.CategoryId, vlc.FieldName, vlc.Value

        FROM            [VolatileLocationContent] vlc

        INNER JOIN  [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
        ON          vlc.ContentProviderId = apcpvlc.ContentProviderId
        AND         vlc.FieldName = apcpvlc.FieldName

        WHERE           apcpvlc.ApplicationProviderId = @ApplicationProviderId
        AND         LocationId = @LocationId
        AND         vlc.FieldName = 'Image1'
        AND         NOT vlc.Value IS null AND           vlc.CategoryId = @CategoryId                AND         vlc.DeactivatedOn IS NULL
        ORDER BY    apcpvlc.Priority
        ) sub

1 Ответ

0 голосов
/ 01 июня 2011

Может быть, что-то вроде этого:

DECLARE @ApplicationProviderId INT;
SET @ApplicationProviderId = 3;
DECLARE @LocationId BIGINT;
SET @LocationId = 928502;
DECLARE @CategoryId INT;
SET @CategoryId = 502;
WITH sub AS (
    SELECT     vlc.VolatileLocationContentId, vlc.ContentProviderId,
               vlc.CategoryId, vlc.FieldName, vlc.Value,
               ROW_NUMBER() OVER (PARTITION BY vlc.FieldName
                                      ORDER BY apcpvlc.Priority) AS rownum
    FROM       [VolatileLocationContent] vlc
    INNER JOIN [ApplicationProviderContentProviderVolatileLocationContentField] apcpvlc
    ON         vlc.ContentProviderId = apcpvlc.ContentProviderId
    AND        vlc.FieldName = apcpvlc.FieldName

    WHERE      apcpvlc.ApplicationProviderId = @ApplicationProviderId
    AND        LocationId = @LocationId
    AND        vlc.FieldName IN ('DescriptionStandard', 'Image1')
    AND        NOT vlc.Value IS null
    AND        vlc.CategoryId = @CategoryId
    AND        vlc.DeactivatedOn IS NULL
)
SELECT
  sub.VolatileLocationContentId,
  sub.ContentProviderId,
  sub.CategoryId,
  sub.FieldName,
  sub.Value
FROM sub
WHERE sub.rownum = 1
...