Выберите количество запросов или вычисляемый столбец - PullRequest
1 голос
/ 13 октября 2011

Итак, у меня есть 2 таблицы:

Таблица категорий

Analit  int 
PositionInMenu  int 

Таблица элементов

Analit  int 
CategoryAn  int 

Итак, у меня есть около 50 категорий и 2000 предметов.Мне нужно взять для каждой категории количество предметов, которые оно включает.

1) SELECT *, (SELECT COUNT(Analit) FROM Item_table t2 WHERE t2.CategoryAn = t1.Analit) as tCount FROM Categories_table t1 ORDER BY PositionInMenu

2) Добавить в таблицу категорий вычисляемый столбец с помощьювызов функции:

([dbo].[Categories_GetItemsCountInCategory]([Analit]))

и код функции:

CREATE FUNCTION dbo.Categories_GetItemsCountInCategory
    (   
    @categoryId int = null
    )
RETURNS int
AS
    BEGIN
    RETURN (SELECT COUNT(Analit) 
            FROM Items 
            WHERE CategoryAn = @categoryId)
    END

И тогда я могу просто взять значение добавленного столбца в мой запрос:

SELECT *
FROM Categories_table
ORDER BY PositionInMenu

Итак, вопрос .Что лучше для меня?

1 Ответ

4 голосов
/ 13 октября 2011

В большинстве случаев лучше иметь встроенный доступ к данным в запросе, а не в скалярных UDF.

Оптимизатор запросов не расширяет скалярные (или многопользовательские) UDF, поэтому вы всегда применяете вложенные циклыплан соединения, вместо того, чтобы позволять ему рассматривать альтернативы.

Вы также можете рассмотреть OUTER JOIN ... GROUP BY, а не коррелированный подзапрос.

SELECT t1.*,
       ISNULL(tCount, 0) AS tCount
FROM   Categories_table t1
       LEFT JOIN (SELECT COUNT(Analit) AS tCount,
                         CategoryAn
                  FROM   Item_table
                  GROUP  BY CategoryAn) t2
         ON t2.CategoryAn = t1.Analit
ORDER  BY PositionInMenu  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...