Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
Приветствую форумчан. Прошу Вашего совета для решения задачи по фильтрации продукции с подсчетом количества товара для каждой фильтра.
Есть несколько таблиц
Первая:
CategorieFilters - категория фильтров

CREATE TABLE [dbo].[CategorieFilters](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CategoryId] [int] NOT NULL,
	[FilterType] [int] NOT NULL,
	[Name] [varchar](50) NOT NULL,
	[Position] [int] NOT NULL,
 CONSTRAINT [PK_FilterCategories] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


Вторая:
CategorieFilterValues
- здесь храню значение для фильтров

CREATE TABLE [dbo].[CategorieFilterValues](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[CategorieFilterId] [int] NOT NULL,
	[RusValue] [varchar](200) NOT NULL,
	[UkrValue] [varchar](200) NULL,
	[IsRange] [bit] NOT NULL,
	[Identifier] [int] NULL,
 CONSTRAINT [PK_CategorieFilterValues] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



Для удобства фильтрации товаров создал вюшку

FilterViews

SELECT     dbo.ProductProductParametrs.Id, dbo.Products.CategoryId, dbo.ProductProductParametrs.ProductId, dbo.ProductProductParametrs.ProductParametrId, 
                      dbo.ProductProductParametrs.UkrValue, dbo.ProductProductParametrs.RusValue, dbo.Products.BrandId, dbo.Products.MinPrice, dbo.Products.MaxPrice, 
                      dbo.ProductProductParametrs.RusNumberValue, dbo.ProductProductParametrs.UkrNumberValue
FROM         dbo.ProductProductParametrs INNER JOIN
                      dbo.Products ON dbo.ProductProductParametrs.ProductId = dbo.Products.Id
WHERE     (dbo.ProductProductParametrs.RusValue <> 'н.д.')

Данная вюшка возвращает 500 тыс записей, а так их больше 620 тыс.

На данный момент я для каждого значения генерирую запрос.

private int GetProductCount(int categoryId, int filterId, IEnumerable<int> selectParametrList)
		{
			int[] filtersId = selectParametrList != null ? selectParametrList.Concat(new[] { filterId }).ToArray() : new[] { filterId };

			var filters = this.categorieFilterValueService.GetById(filtersId).Select(item => new SelectFilter
				{
					FilterId = item.Id,
					FilterType = item.CategorieFilter.FilterType,
					CategoryId = categoryId,
					Value = item.RusValue,
					IsRange = item.IsRange,
					Identifier = item.Identifier
				});

			var rootFilter = filters.FirstOrDefault(item => item.FilterId == filterId);


			var cmd = new StringBuilder();
			switch ((FilterTypes)rootFilter.FilterType)
			{
				case FilterTypes.Breand:
					cmd.AppendFormat("CategoryId = {0} AND BrandId = {1}", categoryId, rootFilter.Identifier);
					break;
				case FilterTypes.Parametr:
					cmd.AppendFormat("CategoryId = {0} AND ProductParametrId = {1} AND RusValue LIKE ('%{2}%')", categoryId, rootFilter.Identifier, rootFilter.Value);
					break;
				case FilterTypes.Price:
					int min = Convert.ToInt32(rootFilter.Value.Split(new[] { '-' }).FirstOrDefault());
					int max = Convert.ToInt32(rootFilter.Value.Split(new[] { '-' }).LastOrDefault());
					cmd.AppendFormat("CategoryId = {0} AND MinPrice >= {1} AND MaxPrice <= {2}", categoryId, min, max);
					break;
			}

			return this.filterViewService.GetProductCount(cmd);
		}


Проблема в том, что при таком раскладе страница сайта формирует 35 - 41 сек.
Надеюсь на Ваши советы! Заранее спасибо!
1 июл 12, 08:26    [12800248]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
grifin85,

Получите сформированный запрос, запустите его в Managment Studio с получение плана выполнения. Проанализируйте его. Посмотрите на отсутствующие индексы на таблицах участвующих в запросе.
И возможно лучше сначала найти все параметры удовлетворяющие условию (без вьюхи) а потом уже заджойнить товары.
1 июл 12, 10:02    [12800271]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
Ну индексы у меня были только в продуктах, добавил еще в параметры продуктов. И да помогло. Два раза быстрей начал работать. Стало 13 - 14 сек. Я вюшку использую потому что у меня фильтры еще по категории и бренду. Но я думаю может еще добавить и идентификатор бренда в таблицу параметров? Хочу добиться результата на 3-4 сек. Да еще забыл упомянуть что всего значений например в одной категории 68. То есть 68 запросов на подсчет количества для каждого значения.
И да большое спасибо за подсказку за индексы, забыл про них :(
2 июл 12, 05:37    [12801791]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а сколько записей в результате?
2 июл 12, 08:36    [12801945]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
grifin85
Да еще забыл упомянуть что всего значений например в одной категории 68. То есть 68 запросов на подсчет количества для каждого значения.

А один запрос нельзя сделать, чтобы он вернул резалтсет сразу для 68 значений?
Это должно значительно ускорить.
2 июл 12, 08:38    [12801954]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
предлагаю, во-первых сделать запрос параметризованным, во-вторых запускать в ssms и показать нам 'плохие' планы выполнения
2 июл 12, 09:43    [12802186]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
Владимир Затуливетер
grifin85
Да еще забыл упомянуть что всего значений например в одной категории 68. То есть 68 запросов на подсчет количества для каждого значения.

А один запрос нельзя сделать, чтобы он вернул резалтсет сразу для 68 значений?
Это должно значительно ускорить.

Я думал об этом. Но в сиквеле нельзя работать с массивами. А я некоторые данные разбиваю на массив, например диапазон, который я храню в одной строке.
Но благодаря тому что я добавил индексы до дополнительных полей, а также добавил два поля и убрал одну таблицу (конечно приходиться хранить дополнительную инфу). Мне удалось уменьшит генерацию страницы до 3- 4 сек.
Плюс еще подключу хеширование, может еще секунду выиграю.
2 июл 12, 10:04    [12802280]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9826
Массивы и Списки в SQL Server
2 июл 12, 10:27    [12802382]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
grifin85
Я думал об этом. Но в сиквеле нельзя работать с массивами. А я некоторые данные разбиваю на массив, например диапазон, который я храню в одной строке.

Не совсем (а точнее совсем не) понял подход автора. В сиквеле есть реляционные таблицы. Массивы просто не нужны. Общие тоталы по таблице товаров в разбивке по категориям товаров считаются одним запросом. Можно оказать на пальцах примеры хитрых фильтров ?
2 июл 12, 10:28    [12802393]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
Снова прошу Вашего совета. Снова проблема со скоростью выполнения запроса
Я обнаружил что когда несколько характеристик выбрал пользователь у меня начинает скрипт долго работать
Например вот такой запрос

SELECT COUNT(*) FROM ProductProductParametrs WHERE CategoryId = 75 AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (BrandId = 3 OR BrandId = 12) AND  (ProductParametrId = 996 AND RusNumberValue = 6) OR  (ProductParametrId = 122 AND RusValue LIKE ('Жемчужный металлик'))) AND (ProductParametrId = 997 AND RusValue LIKE 'Верхнее')


выполняется в течении 12 - 13 сек

Хотя такой

SELECT COUNT(*) FROM ProductProductParametrs WHERE CategoryId = 75 AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (BrandId = 3 OR BrandId = 12) AND  (ProductParametrId = 996 AND RusNumberValue = 6) OR  (ProductParametrId = 122 AND RusValue LIKE ('Жемчужный металлик')))


или такой

SELECT COUNT(*) FROM ProductProductParametrs WHERE CategoryId = 75 AND (ProductParametrId = 997 AND RusValue LIKE 'Верхнее')


очень быстро
22 июл 12, 22:40    [12899632]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
svenom
Member [заблокирован]

Откуда:
Сообщений: 3242
grifin85,
Что говорит план? Вообще, при любых проблемах с производительностью запросов, вашими первыми действиями должны быть:
1) Просмотр плана запроса
2) Просмотр статистики
... но никак не вопрос в форуме
23 июл 12, 09:53    [12900587]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
svenom
grifin85,
Что говорит план? Вообще, при любых проблемах с производительностью запросов, вашими первыми действиями должны быть:
1) Просмотр плана запроса
2) Просмотр статистики
... но никак не вопрос в форуме


Ну я не силен пока что в SQL, почему и спрашиваю совета что надо делать. И Ваш смех тут не уместен.
23 июл 12, 15:10    [12903041]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
svenom
Member [заблокирован]

Откуда:
Сообщений: 3242
grifin85
Ну я не силен пока что в SQL, почему и спрашиваю совета что надо делать. И Ваш смех тут не уместен.
Оптимизация выполнения запроса это не какая-то рутинная операция. Скорость зависит от множества факторов, начиная от железа, заканчивая приложением, "потребляющим" данный запрос. Отправной точкой почти всегда является анализ плана запроса. Вас и просят выложить его здесь.
23 июл 12, 15:12    [12903064]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
svenom
grifin85
Ну я не силен пока что в SQL, почему и спрашиваю совета что надо делать. И Ваш смех тут не уместен.
Оптимизация выполнения запроса это не какая-то рутинная операция. Скорость зависит от множества факторов, начиная от железа, заканчивая приложением, "потребляющим" данный запрос. Отправной точкой почти всегда является анализ плана запроса. Вас и просят выложить его здесь.


Несмотря на Ваш смех все равно говорю спасибо. И возник такой вопрос

Чем отличаются индекс

CREATE NONCLUSTERED INDEX [PK_ProductParametrValues] ON [dbo].[ProductProductParametrs] 
(
 [CategoryId] ASC,
 [BrandId] ASC,
 [ProductId] ASC,
 [ProductParametrId] ASC,
 [RusNumberValue] ASC,
 [MinPrice] ASC,
 [MaxPrice] ASC,
 [RusValue] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO


от

CREATE NONCLUSTERED INDEX [PK_ProductProductParametr] ON [dbo].[ProductProductParametrs] 
(
 [ProductId] ASC
)
INCLUDE ( [CategoryId],
[BrandId],
[ProductParametrId],
[RusValue],
[RusNumberValue]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO


И нужен ли первый индекс если создал второй, или для второго добавить недостающих полей от первого, а первый можно удалить?
23 июл 12, 15:37    [12903312]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
grifin85,

Честно говоря, не совсем понятен вопрос. В итоге, какой в итоге запрос медленный? Вьюшка, запрос с count(*) или нечто, что генерируется динамически или еще что-то?
23 июл 12, 16:07    [12903650]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация фильтра с подсчетом количества записей  [new]
grifin85
Member

Откуда:
Сообщений: 9
SomewhereSomehow
grifin85,

Честно говоря, не совсем понятен вопрос. В итоге, какой в итоге запрос медленный? Вьюшка, запрос с count(*) или нечто, что генерируется динамически или еще что-то?


Сейчас у меня тормозит вот такие запросы, хотя когда тестирую менеджере вроде быстро работает

SELECT COUNT(*) FROM Products WHERE Id IN (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (ProductParametrId = 1 AND RusValue LIKE 'Изотермический автохолодильник') AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND BrandId = 12 AND  (ProductParametrId = 996 AND RusNumberValue = 6) AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (ProductParametrId = 1 AND RusValue LIKE 'Изотермический автохолодильник') OR (ProductParametrId = 989 AND RusValue LIKE ('A+')) ) ))


Запрос конечно получается страшный, но я не знаю как лучше подсчитать товары для каждого значения

Вот план выполнения скрипта

<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.50.2500.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.0139885" StatementText="SELECT COUNT(*) FROM Products WHERE Id IN (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (ProductParametrId = 1 AND RusValue LIKE 'Изотермический автохолодильник') AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND BrandId = 12 AND  (ProductParametrId = 996 AND RusNumberValue = 6) AND ProductId in (SELECT ProductId FROM ProductProductParametrs WHERE CategoryId = 75 AND (ProductParametrId = 1 AND RusValue LIKE 'Изотермический автохолодильник') OR (ProductParametrId = 989 AND RusValue LIKE ('A+')) ) ))" StatementType="SELECT" QueryHash="0xC375965AC11875C6" QueryPlanHash="0x349EEF8A4AECB96B">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="0" CachedPlanSize="48" CompileTime="146" CompileCPU="146" CompileMemory="3320">
            <RelOp AvgRowSize="11" EstimateCPU="1.1E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="0.0139885">
              <OutputList>
                <ColumnReference Column="Expr1012" />
              </OutputList>
              <ComputeScalar>
                <DefinedValues>
                  <DefinedValue>
                    <ColumnReference Column="Expr1012" />
                    <ScalarOperator ScalarString="CONVERT_IMPLICIT(int,[Expr1015],0)">
                      <Convert DataType="int" Style="0" Implicit="true">
                        <ScalarOperator>
                          <Identifier>
                            <ColumnReference Column="Expr1015" />
                          </Identifier>
                        </ScalarOperator>
                      </Convert>
                    </ScalarOperator>
                  </DefinedValue>
                </DefinedValues>
                <RelOp AvgRowSize="11" EstimateCPU="1.1E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Aggregate" NodeId="1" Parallel="false" PhysicalOp="Stream Aggregate" EstimatedTotalSubtreeCost="0.0139885">
                  <OutputList>
                    <ColumnReference Column="Expr1015" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                  </RunTimeInformation>
                  <StreamAggregate>
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Column="Expr1015" />
                        <ScalarOperator ScalarString="Count(*)">
                          <Aggregate AggType="countstar" Distinct="false" />
                        </ScalarOperator>
                      </DefinedValue>
                    </DefinedValues>
                    <RelOp AvgRowSize="9" EstimateCPU="1E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Aggregate" NodeId="3" Parallel="false" PhysicalOp="Stream Aggregate" EstimatedTotalSubtreeCost="0.0139874">
                      <OutputList />
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <StreamAggregate>
                        <DefinedValues />
                        <GroupBy>
                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Column="Id" />
                        </GroupBy>
                        <RelOp AvgRowSize="11" EstimateCPU="4.18E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Inner Join" NodeId="5" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0139864">
                          <OutputList>
                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Column="Id" />
                          </OutputList>
                          <RunTimeInformation>
                            <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" />
                          </RunTimeInformation>
                          <NestedLoops Optimized="false">
                            <OuterReferences>
                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                            </OuterReferences>
                            <RelOp AvgRowSize="15" EstimateCPU="4.18E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Inner Join" NodeId="6" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.0106991">
                              <OutputList>
                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                              </OutputList>
                              <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" />
                              </RunTimeInformation>
                              <NestedLoops Optimized="false">
                                <OuterReferences>
                                  <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                </OuterReferences>
                                <RelOp AvgRowSize="11" EstimateCPU="1E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Aggregate" NodeId="7" Parallel="false" PhysicalOp="Stream Aggregate" EstimatedTotalSubtreeCost="0.00714282">
                                  <OutputList>
                                    <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                  </OutputList>
                                  <RunTimeInformation>
                                    <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                                  </RunTimeInformation>
                                  <StreamAggregate>
                                    <DefinedValues />
                                    <GroupBy>
                                      <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                    </GroupBy>
                                    <RelOp AvgRowSize="11" EstimateCPU="4.18E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Left Semi Join" NodeId="8" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00714182">
                                      <OutputList>
                                        <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                      </OutputList>
                                      <RunTimeInformation>
                                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                                      </RunTimeInformation>
                                      <NestedLoops Optimized="false">
                                        <OuterReferences>
                                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                        </OuterReferences>
                                        <RelOp AvgRowSize="28" EstimateCPU="0.000258434" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Index Seek" NodeId="9" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.00338343" TableCardinality="769725">
                                          <OutputList>
                                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="Id" />
                                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusNumberValue" />
                                            <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusValue" />
                                            <ColumnReference Column="KeyCo10" />
                                            <ColumnReference Column="KeyCo11" />
                                          </OutputList>
                                          <RunTimeInformation>
                                            <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                                          </RunTimeInformation>
                                          <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                                            <DefinedValues>
                                              <DefinedValue>
                                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="Id" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusNumberValue" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusValue" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Column="KeyCo10" />
                                              </DefinedValue>
                                              <DefinedValue>
                                                <ColumnReference Column="KeyCo11" />
                                              </DefinedValue>
                                            </DefinedValues>
                                            <Object Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Index="[PK_ProductParametrValues]" TableReferenceId="2" IndexKind="NonClustered" />
                                            <SeekPredicates>
                                              <SeekPredicateNew>
                                                <SeekKeys>
                                                  <Prefix ScanType="EQ">
                                                    <RangeColumns>
                                                      <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="CategoryId" />
                                                      <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="BrandId" />
                                                    </RangeColumns>
                                                    <RangeExpressions>
                                                      <ScalarOperator ScalarString="(75)">
                                                        <Const ConstValue="(75)" />
                                                      </ScalarOperator>
                                                      <ScalarOperator ScalarString="(12)">
                                                        <Const ConstValue="(12)" />
                                                      </ScalarOperator>
                                                    </RangeExpressions>
                                                  </Prefix>
                                                </SeekKeys>
                                              </SeekPredicateNew>
                                            </SeekPredicates>
                                            <Predicate>
                                              <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[ProductParametrId]=(996) AND [1gb_zamov].[dbo].[ProductProductParametrs].[RusNumberValue]=(6.00)">
                                                <Logical Operation="AND">
                                                  <ScalarOperator>
                                                    <Compare CompareOp="EQ">
                                                      <ScalarOperator>
                                                        <Identifier>
                                                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                                        </Identifier>
                                                      </ScalarOperator>
                                                      <ScalarOperator>
                                                        <Const ConstValue="(996)" />
                                                      </ScalarOperator>
                                                    </Compare>
                                                  </ScalarOperator>
                                                  <ScalarOperator>
                                                    <Compare CompareOp="EQ">
                                                      <ScalarOperator>
                                                        <Identifier>
                                                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusNumberValue" />
                                                        </Identifier>
                                                      </ScalarOperator>
                                                      <ScalarOperator>
                                                        <Const ConstValue="(6.00)" />
                                                      </ScalarOperator>
                                                    </Compare>
                                                  </ScalarOperator>
                                                </Logical>
                                              </ScalarOperator>
                                            </Predicate>
                                          </IndexScan>
                                        </RelOp>
                                        <RelOp AvgRowSize="28" EstimateCPU="0.000267868" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Index Seek" NodeId="10" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.00339287" TableCardinality="769725">
                                          <OutputList />
                                          <RunTimeInformation>
                                            <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="0" ActualExecutions="1" />
                                          </RunTimeInformation>
                                          <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                                            <DefinedValues />
                                            <Object Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Index="[PK_ProductProductParametr]" TableReferenceId="3" IndexKind="NonClustered" />
                                            <SeekPredicates>
                                              <SeekPredicateNew>
                                                <SeekKeys>
                                                  <Prefix ScanType="EQ">
                                                    <RangeColumns>
                                                      <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                                    </RangeColumns>
                                                    <RangeExpressions>
                                                      <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[ProductId]">
                                                        <Identifier>
                                                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                                        </Identifier>
                                                      </ScalarOperator>
                                                    </RangeExpressions>
                                                  </Prefix>
                                                </SeekKeys>
                                              </SeekPredicateNew>
                                            </SeekPredicates>
                                            <Predicate>
                                              <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[CategoryId]=(75) AND [1gb_zamov].[dbo].[ProductProductParametrs].[ProductParametrId]=(1) AND [1gb_zamov].[dbo].[ProductProductParametrs].[RusValue] like 'Изотермический автохолодильник' OR [1gb_zamov].[dbo].[ProductProductParametrs].[ProductParametrId]=(989) AND [1gb_zamov].[dbo].[ProductProductParametrs].[RusValue] like 'A+'">
                                                <Logical Operation="OR">
                                                  <ScalarOperator>
                                                    <Logical Operation="AND">
                                                      <ScalarOperator>
                                                        <Compare CompareOp="EQ">
                                                          <ScalarOperator>
                                                            <Identifier>
                                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="CategoryId" />
                                                            </Identifier>
                                                          </ScalarOperator>
                                                          <ScalarOperator>
                                                            <Const ConstValue="(75)" />
                                                          </ScalarOperator>
                                                        </Compare>
                                                      </ScalarOperator>
                                                      <ScalarOperator>
                                                        <Compare CompareOp="EQ">
                                                          <ScalarOperator>
                                                            <Identifier>
                                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                                            </Identifier>
                                                          </ScalarOperator>
                                                          <ScalarOperator>
                                                            <Const ConstValue="(1)" />
                                                          </ScalarOperator>
                                                        </Compare>
                                                      </ScalarOperator>
                                                      <ScalarOperator>
                                                        <Intrinsic FunctionName="like">
                                                          <ScalarOperator>
                                                            <Identifier>
                                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusValue" />
                                                            </Identifier>
                                                          </ScalarOperator>
                                                          <ScalarOperator>
                                                            <Const ConstValue="'Изотермический автохолодильник'" />
                                                          </ScalarOperator>
                                                        </Intrinsic>
                                                      </ScalarOperator>
                                                    </Logical>
                                                  </ScalarOperator>
                                                  <ScalarOperator>
                                                    <Logical Operation="AND">
                                                      <ScalarOperator>
                                                        <Compare CompareOp="EQ">
                                                          <ScalarOperator>
                                                            <Identifier>
                                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                                            </Identifier>
                                                          </ScalarOperator>
                                                          <ScalarOperator>
                                                            <Const ConstValue="(989)" />
                                                          </ScalarOperator>
                                                        </Compare>
                                                      </ScalarOperator>
                                                      <ScalarOperator>
                                                        <Intrinsic FunctionName="like">
                                                          <ScalarOperator>
                                                            <Identifier>
                                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusValue" />
                                                            </Identifier>
                                                          </ScalarOperator>
                                                          <ScalarOperator>
                                                            <Const ConstValue="'A+'" />
                                                          </ScalarOperator>
                                                        </Intrinsic>
                                                      </ScalarOperator>
                                                    </Logical>
                                                  </ScalarOperator>
                                                </Logical>
                                              </ScalarOperator>
                                            </Predicate>
                                          </IndexScan>
                                        </RelOp>
                                      </NestedLoops>
                                    </RelOp>
                                  </StreamAggregate>
                                </RelOp>
                                <RelOp AvgRowSize="32" EstimateCPU="0.000267868" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Index Seek" NodeId="12" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.00339287" TableCardinality="769725">
                                  <OutputList>
                                    <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                  </OutputList>
                                  <RunTimeInformation>
                                    <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" />
                                  </RunTimeInformation>
                                  <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                                    <DefinedValues>
                                      <DefinedValue>
                                        <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                      </DefinedValue>
                                    </DefinedValues>
                                    <Object Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Index="[PK_ProductProductParametr]" TableReferenceId="1" IndexKind="NonClustered" />
                                    <SeekPredicates>
                                      <SeekPredicateNew>
                                        <SeekKeys>
                                          <Prefix ScanType="EQ">
                                            <RangeColumns>
                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                            </RangeColumns>
                                            <RangeExpressions>
                                              <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[ProductId]">
                                                <Identifier>
                                                  <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                                </Identifier>
                                              </ScalarOperator>
                                            </RangeExpressions>
                                          </Prefix>
                                        </SeekKeys>
                                      </SeekPredicateNew>
                                    </SeekPredicates>
                                    <Predicate>
                                      <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[CategoryId]=(75) AND [1gb_zamov].[dbo].[ProductProductParametrs].[ProductParametrId]=(1) AND [1gb_zamov].[dbo].[ProductProductParametrs].[RusValue] like 'Изотермический автохолодильник'">
                                        <Logical Operation="AND">
                                          <ScalarOperator>
                                            <Compare CompareOp="EQ">
                                              <ScalarOperator>
                                                <Identifier>
                                                  <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="CategoryId" />
                                                </Identifier>
                                              </ScalarOperator>
                                              <ScalarOperator>
                                                <Const ConstValue="(75)" />
                                              </ScalarOperator>
                                            </Compare>
                                          </ScalarOperator>
                                          <ScalarOperator>
                                            <Compare CompareOp="EQ">
                                              <ScalarOperator>
                                                <Identifier>
                                                  <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductParametrId" />
                                                </Identifier>
                                              </ScalarOperator>
                                              <ScalarOperator>
                                                <Const ConstValue="(1)" />
                                              </ScalarOperator>
                                            </Compare>
                                          </ScalarOperator>
                                          <ScalarOperator>
                                            <Intrinsic FunctionName="like">
                                              <ScalarOperator>
                                                <Identifier>
                                                  <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="RusValue" />
                                                </Identifier>
                                              </ScalarOperator>
                                              <ScalarOperator>
                                                <Const ConstValue="'Изотермический автохолодильник'" />
                                              </ScalarOperator>
                                            </Intrinsic>
                                          </ScalarOperator>
                                        </Logical>
                                      </ScalarOperator>
                                    </Predicate>
                                  </IndexScan>
                                </RelOp>
                              </NestedLoops>
                            </RelOp>
                            <RelOp AvgRowSize="11" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="13" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="49266">
                              <OutputList>
                                <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Column="Id" />
                              </OutputList>
                              <RunTimeInformation>
                                <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
                              </RunTimeInformation>
                              <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false">
                                <DefinedValues>
                                  <DefinedValue>
                                    <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Column="Id" />
                                  </DefinedValue>
                                </DefinedValues>
                                <Object Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Index="[PK_Products]" IndexKind="Clustered" />
                                <SeekPredicates>
                                  <SeekPredicateNew>
                                    <SeekKeys>
                                      <Prefix ScanType="EQ">
                                        <RangeColumns>
                                          <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[Products]" Column="Id" />
                                        </RangeColumns>
                                        <RangeExpressions>
                                          <ScalarOperator ScalarString="[1gb_zamov].[dbo].[ProductProductParametrs].[ProductId]">
                                            <Identifier>
                                              <ColumnReference Database="[1gb_zamov]" Schema="[dbo]" Table="[ProductProductParametrs]" Column="ProductId" />
                                            </Identifier>
                                          </ScalarOperator>
                                        </RangeExpressions>
                                      </Prefix>
                                    </SeekKeys>
                                  </SeekPredicateNew>
                                </SeekPredicates>
                              </IndexScan>
                            </RelOp>
                          </NestedLoops>
                        </RelOp>
                      </StreamAggregate>
                    </RelOp>
                  </StreamAggregate>
                </RelOp>
              </ComputeScalar>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>


Не знаю блин даже что делать :( Можно конечно закешировать некоторые данные. Но все равно это пока не выход
26 июл 12, 23:14    [12922291]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить