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

Откуда:
Сообщений: 148
Есть таблица:
CREATE TABLE [dbo].[WareRest] (
	[Id_Ware] [int] NOT NULL ,
	[WarehouseNo] [int] NOT NULL ,
	[Rest] [Quant] NOT NULL ,
	[Reserv] [Quant] NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[WareRest] WITH NOCHECK ADD 
	CONSTRAINT [PK_WareRest] PRIMARY KEY  CLUSTERED 
	(
		[Id_Ware],
		[WarehouseNo]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[WareRest] ADD 
	CONSTRAINT [FK_WareRest_Ware] FOREIGN KEY 
	(
		[Id_Ware]
	) REFERENCES [dbo].[Ware] (
		[Id_Ware]
	),
	CONSTRAINT [FK_WareRest_Warehouse] FOREIGN KEY 
	(
		[WarehouseNo]
	) REFERENCES [dbo].[Warehouse] (
		[Numb_Warehouse]
	)
GO
В этой таблице может быть запись с определённым набором Id_Ware и WarehouseNo, а может и не быть.
Для того, чтобы при отсутсвующей записи получить значение 0, я использую следующую конструкцию: IsNull (sum (xxx), 0).
А можно делать проверку записи на существование.

Привожу пример, где эти оба метода используются последовательно один за другим:
DECLARE	@StoreQ		decimal (19,2),	@StoreReserv		decimal (19,2)

SET STATISTICS PROFILE ON

if not exists (SELECT	*  
	FROM		WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	100 	
) begin
	SELECT	@StoreQ = 0,	@StoreReserv = 0
end else begin
	SELECT	@StoreQ	= Rest,   
		@StoreReserv = Reserv   
	FROM	WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	100
end 	


SELECT	@StoreQ = IsNull (sum (Rest), 0),   
 	@StoreReserv = IsNull (sum (Reserv), 0)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo 		=	100 	

SET STATISTICS PROFILE OFF

Профили:
1. Запись есть в таблице:
(1 row(s) affected)

Rows        Executes    StmtText                                                                                                                                                                     StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                DefinedValues                                  EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList  Warnings Type                           Parallel EstimateExecutions       
----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ ----------- -------- ------------------------------ -------- ------------------------ 
1           1           if not exists (SELECT	*  
	FROM		WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	1 	
)                                                                           1           1           0           NULL                           NULL                           NULL                                                                                                                                    NULL                                           1.0                      NULL                     NULL                     NULL        3.2885191E-3             NULL        NULL     COND                           0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1003]=If ([Expr1004]=NULL) then 1 else 0))                                                                                                  1           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1003]=If ([Expr1004]=NULL) then 1 else 0)                                                                                  [Expr1003]=If ([Expr1004]=NULL) then 1 else 0  1.0                      0.0                      0.0000001                11          3.2885191E-3             [Expr1003]  NULL     PLAN_ROW                       0        1.0
1           1                  |--Nested Loops(Left Semi Join, DEFINE:([Expr1004] = [PROBE VALUE]))                                                                                                  1           3           2           Nested Loops                   Left Semi Join                 DEFINE:([Expr1004] = [PROBE VALUE])                                                                                                     [Expr1004] = [PROBE VALUE]                     1.0                      0.0                      4.1799999E-6             9           3.288419E-3              [Expr1004]  NULL     PLAN_ROW                       0        1.0
1           1                       |--Constant Scan                                                                                                                                                 1           4           3           Constant Scan                  Constant Scan                  NULL                                                                                                                                    NULL                                           1.0                      0.0                      1.157E-6                 4           1.157E-6                 NULL        NULL     PLAN_ROW                       0        1.0
1           1                       |--Clustered Index Seek(OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD)  1           5           3           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD  NULL                                           1.0                      3.2034749E-3             7.9607002E-5             53          3.283082E-3              NULL        NULL     PLAN_ROW                       0        1.0

(5 row(s) affected)

Rows        Executes    StmtText                                                                                                                                                                StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                DefinedValues                                                                   EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                              Warnings Type                           Parallel EstimateExecutions       
----------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ --------------------------------------- -------- ------------------------------ -------- ------------------------ 
1           1           SELECT	@StoreQ	= Rest,   
		@StoreReserv = Reserv   
	FROM	WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	1                                                2           1           0           NULL                           NULL                           NULL                                                                                                                                    NULL                                                                            1.0                      NULL                     NULL                     NULL        3.2831749E-3             NULL                                    NULL     SELECT                         0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])))                                                            2           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv]))                                                 [Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])  1.0                      0.0                      0.0000001                25          3.2831749E-3             [Expr1002], [Expr1003]                  NULL     PLAN_ROW                       0        1.0
1           1                  |--Clustered Index Seek(OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD)  2           3           2           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD  [WareRest].[Reserv], [WareRest].[Rest]                                          1.0                      3.2034749E-3             7.9600002E-5             25          3.2830751E-3             [WareRest].[Reserv], [WareRest].[Rest]  NULL     PLAN_ROW                       0        1.0

(3 row(s) affected)

Rows        Executes    StmtText                                                                                                                                                                          StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                DefinedValues                                                                                                   EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                              Warnings Type                           Parallel EstimateExecutions       
----------- ----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ --------------------------------------- -------- ------------------------------ -------- ------------------------ 
1           1           SELECT	@StoreQ = IsNull (sum (Rest), 0),   
 	@StoreReserv = IsNull (sum (Reserv), 0)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo 		=	1                         3           1           0           NULL                           NULL                           NULL                                                                                                                                    NULL                                                                                                            1.0                      NULL                     NULL                     NULL        3.283282E-3              NULL                                    NULL     SELECT                         0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00))))                                                          3           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00)))                                     [Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00))                      1.0                      0.0                      0.0000001                25          3.283282E-3              [Expr1004], [Expr1005]                  NULL     PLAN_ROW                       0        1.0
1           1                  |--Compute Scalar(DEFINE:([Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016]))                                 3           3           2           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016])                 [Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016]  1.0                      0.0                      0.0000001                41          3.2831819E-3             [Expr1002], [Expr1003]                  NULL     PLAN_ROW                       0        1.0
1           1                       |--Stream Aggregate(DEFINE:([Expr1014]=Count(*), [Expr1015]=SUM([WareRest].[Rest]), [Expr1016]=SUM([WareRest].[Reserv])))                                             3           4           3           Stream Aggregate               Aggregate                      NULL                                                                                                                                    [Expr1014]=Count(*), [Expr1015]=SUM([WareRest].[Rest]), [Expr1016]=SUM([WareRest].[Reserv])                     1.0                      0.0                      0.0000001                41          3.2831819E-3             [Expr1014], [Expr1015], [Expr1016]      NULL     PLAN_ROW                       0        1.0
1           1                            |--Clustered Index Seek(OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD)  3           5           4           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD  [WareRest].[Rest], [WareRest].[Reserv]                                                                          1.0                      3.2034749E-3             7.9607002E-5             53          3.283082E-3              [WareRest].[Rest], [WareRest].[Reserv]  NULL     PLAN_ROW                       0        1.0

(5 row(s) affected)

2. Запись отсутствует в таблице:
(1 row(s) affected)

Rows        Executes    StmtText                                                                                                                                                                       StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                  DefinedValues                                  EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList  Warnings Type                           Parallel EstimateExecutions       
----------- ----------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ----------- ----------- ----------- ------------------------------ ------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ ----------- -------- ------------------------------ -------- ------------------------ 
1           1           if not exists (SELECT	*  
	FROM		WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	100 	
)                                                                           3           1           0           NULL                           NULL                           NULL                                                                                                                                      NULL                                           1.0                      NULL                     NULL                     NULL        3.2885191E-3             NULL        NULL     COND                           0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1003]=If ([Expr1004]=NULL) then 1 else 0))                                                                                                    3           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1003]=If ([Expr1004]=NULL) then 1 else 0)                                                                                    [Expr1003]=If ([Expr1004]=NULL) then 1 else 0  1.0                      0.0                      0.0000001                11          3.2885191E-3             [Expr1003]  NULL     PLAN_ROW                       0        1.0
1           1                  |--Nested Loops(Left Semi Join, DEFINE:([Expr1004] = [PROBE VALUE]))                                                                                                    3           3           2           Nested Loops                   Left Semi Join                 DEFINE:([Expr1004] = [PROBE VALUE])                                                                                                       [Expr1004] = [PROBE VALUE]                     1.0                      0.0                      4.1799999E-6             9           3.288419E-3              [Expr1004]  NULL     PLAN_ROW                       0        1.0
1           1                       |--Constant Scan                                                                                                                                                   3           4           3           Constant Scan                  Constant Scan                  NULL                                                                                                                                      NULL                                           1.0                      0.0                      1.157E-6                 4           1.157E-6                 NULL        NULL     PLAN_ROW                       0        1.0
0           1                       |--Clustered Index Seek(OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD)  3           5           3           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD  NULL                                           1.0                      3.2034749E-3             7.9607002E-5             53          3.283082E-3              NULL        NULL     PLAN_ROW                       0        1.0

(5 row(s) affected)

Rows        Executes    StmtText                                                                                                                                                                            StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                  DefinedValues                                                                                                   EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                              Warnings Type                           Parallel EstimateExecutions       
----------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ --------------------------------------- -------- ------------------------------ -------- ------------------------ 
1           1           SELECT	@StoreQ = IsNull (sum (Rest), 0),   
 	@StoreReserv = IsNull (sum (Reserv), 0)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo 		=	100                         4           1           0           NULL                           NULL                           NULL                                                                                                                                      NULL                                                                                                            1.0                      NULL                     NULL                     NULL        3.283282E-3              NULL                                    NULL     SELECT                         0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00))))                                                            4           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00)))                                       [Expr1004]=Convert(isnull([Expr1002], 0.00)), [Expr1005]=Convert(isnull([Expr1003], 0.00))                      1.0                      0.0                      0.0000001                25          3.283282E-3              [Expr1004], [Expr1005]                  NULL     PLAN_ROW                       0        1.0
1           1                  |--Compute Scalar(DEFINE:([Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016]))                                   4           3           2           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016])                   [Expr1002]=If ([Expr1014]=0) then NULL else [Expr1015], [Expr1003]=If ([Expr1014]=0) then NULL else [Expr1016]  1.0                      0.0                      0.0000001                41          3.2831819E-3             [Expr1002], [Expr1003]                  NULL     PLAN_ROW                       0        1.0
1           1                       |--Stream Aggregate(DEFINE:([Expr1014]=Count(*), [Expr1015]=SUM([WareRest].[Rest]), [Expr1016]=SUM([WareRest].[Reserv])))                                               4           4           3           Stream Aggregate               Aggregate                      NULL                                                                                                                                      [Expr1014]=Count(*), [Expr1015]=SUM([WareRest].[Rest]), [Expr1016]=SUM([WareRest].[Reserv])                     1.0                      0.0                      0.0000001                41          3.2831819E-3             [Expr1014], [Expr1015], [Expr1016]      NULL     PLAN_ROW                       0        1.0
0           1                            |--Clustered Index Seek(OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD)  4           5           4           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaSystem].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD  [WareRest].[Rest], [WareRest].[Reserv]                                                                          1.0                      3.2034749E-3             7.9607002E-5             53          3.283082E-3              [WareRest].[Rest], [WareRest].[Reserv]  NULL     PLAN_ROW                       0        1.0

(5 row(s) affected)

Если я правильно понимаю, то 1-ый способ (через sum) более быстрый. Это так?
Есть ли ещё более эффективные варианты?
12 ноя 04, 17:13    [1102905]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
есть еще 3ий способ
SELECT	@StoreQ = 0,   
 	@StoreReserv = 0

SELECT	@StoreQ = sum (Rest),   
 	@StoreReserv = sum (Reserv)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo 
а вообще 1ый способ быстрее если записи нет
второй способ быстрее если запись есть.
и они не равны по идентичности, потому что если записи удовлетворяющим условию нет, тогда эти переменные останутся NULL

для спящего время бодрствования равносильно сну
12 ноя 04, 17:32    [1102964]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
Nividimka
Member

Откуда:
Сообщений: 148
Алексей2003
есть еще 3ий способ]

Предложенный Вами вариант не работает:
DECLARE	@StoreQ		decimal (19,2),	@StoreReserv		decimal (19,2)


SELECT	@StoreQ = 0,   
 	@StoreReserv = 0

SELECT	@StoreQ = sum (Rest),   
 	@StoreReserv = sum (Reserv)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo = 100

SELECT	@StoreQ,   @StoreReserv 
Результ:
                                           
--------------------- --------------------- 
NULL                  NULL

(1 row(s) affected)

Алексей2003
и они не равны по идентичности, потому что если записи удовлетворяющим условию нет, тогда эти переменные останутся NULL

Тоже неверное передположение. Проверьте сами.
12 ноя 04, 17:43    [1103006]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
ChA
Member

Откуда: Москва
Сообщений: 11138
Может так ?
SELECT
	@StoreQ= Rest
	, @StoreReserv = Reserv
FROM WareRest
WHERE
	Id_Ware =48019
	AND WarehouseNo =100
IF @@ROWCOUNT = 0 SELECT @StoreQ = 0, @StoreReserv = 0
Если я правильно понял смысл...
12 ноя 04, 21:05    [1103339]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
Nividimka
Member

Откуда:
Сообщений: 148
ChA
Может так ?

Отличный вариант!
Может, кто из знатоков планов заценит, какой он даёт выигрыш по времени выполнения?
1. План с имеющейся записью:
Rows        Executes    StmtText                                                                                                                                                              StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                              DefinedValues                                                                   EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                              Warnings Type                           Parallel EstimateExecutions       
----------- ----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ --------------------------------------- -------- ------------------------------ -------- ------------------------ 
1           1           SELECT
	@StoreQ= Rest
	, @StoreReserv = Reserv
FROM WareRest
WHERE
	Id_Ware =48019
	AND WarehouseNo =1                                                          2           1           0           NULL                           NULL                           NULL                                                                                                                                  NULL                                                                            1.0                      NULL                     NULL                     NULL        3.2831749E-3             NULL                                    NULL     SELECT                         0        NULL
1           1             |--Compute Scalar(DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])))                                                          2           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv]))                                               [Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])  1.0                      0.0                      0.0000001                25          3.2831749E-3             [Expr1002], [Expr1003]                  NULL     PLAN_ROW                       0        1.0
1           1                  |--Clustered Index Seek(OBJECT:([NikaTest].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD)  2           3           2           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaTest].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=1) ORDERED FORWARD  [WareRest].[Reserv], [WareRest].[Rest]                                          1.0                      3.2034749E-3             7.9600002E-5             25          3.2830751E-3             [WareRest].[Reserv], [WareRest].[Rest]  NULL     PLAN_ROW                       0        1.0

(3 row(s) affected)


2. План с отсутствующей записью:
Rows        Executes    StmtText                                                                                                                                                                StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                DefinedValues                                                                   EstimateRows             EstimateIO               EstimateCPU              AvgRowSize  TotalSubtreeCost         OutputList                              Warnings Type                           Parallel EstimateExecutions       
----------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------ ------------------------ ------------------------ ----------- ------------------------ --------------------------------------- -------- ------------------------------ -------- ------------------------ 
0           1           SELECT
	@StoreQ= Rest
	, @StoreReserv = Reserv
FROM WareRest
WHERE
	Id_Ware =48019
	AND WarehouseNo =100                                                          1           1           0           NULL                           NULL                           NULL                                                                                                                                    NULL                                                                            1.0                      NULL                     NULL                     NULL        3.2831749E-3             NULL                                    NULL     SELECT                         0        NULL
0           1             |--Compute Scalar(DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])))                                                            1           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv]))                                                 [Expr1002]=Convert([WareRest].[Rest]), [Expr1003]=Convert([WareRest].[Reserv])  1.0                      0.0                      0.0000001                25          3.2831749E-3             [Expr1002], [Expr1003]                  NULL     PLAN_ROW                       0        1.0
0           1                  |--Clustered Index Seek(OBJECT:([NikaTest].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD)  1           3           2           Clustered Index Seek           Clustered Index Seek           OBJECT:([NikaTest].[dbo].[WareRest].[PK_WareRest]), SEEK:([WareRest].[Id_Ware]=48019 AND [WareRest].[WarehouseNo]=100) ORDERED FORWARD  [WareRest].[Reserv], [WareRest].[Rest]                                          1.0                      3.2034749E-3             7.9600002E-5             25          3.2830751E-3             [WareRest].[Reserv], [WareRest].[Rest]  NULL     PLAN_ROW                       0        1.0

(3 row(s) affected)

15 ноя 04, 14:21    [1106190]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
ChA
Member

Откуда: Москва
Сообщений: 11138
А разве не очевидно, что план одинаков, и лучше быть практически не может ?
Один нюанс, похоже, что типы переменных не совпадают с типами поля, отчего появляется Compute Scalar, но его влияние в данном примере пренебрежимо мало.
16 ноя 04, 01:08    [1107594]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
Nividimka
Member

Откуда:
Сообщений: 148
ChA
А разве не очевидно, что план одинаков, и лучше быть практически не может ?

Я не про сравнение 2-х планов из предыдущего топика: они, понятно, одинаковы.
Я про сравнение плана из предыдущего топика со всеми предыдущими вариантами.

ChA
Один нюанс, похоже, что типы переменных не совпадают с типами поля, отчего появляется Compute Scalar


Это для меня ново.
В таблице используется только int и quant (EXEC sp_addtype N'Quant', N'numeric(12,2)', N'null'). А пременные в скрипте об'явленны как decimal (19,2) (см выше).
Эта разница что, имеет какое-то значение?
Просвятите, пжлст!
16 ноя 04, 11:40    [1108406]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
ChA
Member

Откуда: Москва
Сообщений: 11138
Если не хотите потенциальных проблем в будущем, следите, чтобы тип переменной или параметра совпадал с типом поля. В противном случае у Вас могут возникать конвертации в планах запросов, что, в некоторых случаях, приводит к неоптимальности упомянутых планов. Признаком неоптимальности в этих случаях является наличие в плане запросов функции Convert...
16 ноя 04, 16:54    [1110317]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
сравнивайте значения TotalSubtreeCost
у самого левого верхнего элемента в Estimation Plan, для операции SELECT каждого запроса.
у кого меньше, тот и ест меньше ресурсов.

для спящего время бодрствования равносильно сну
16 ноя 04, 17:13    [1110428]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение 0 при отсутствующей записи  [new]
KGP
Member

Откуда: Москва
Сообщений: 4554
Nividimka
Есть таблица:
ALTER TABLE [dbo].[WareRest] WITH NOCHECK ADD
CONSTRAINT [PK_WareRest] PRIMARY KEY CLUSTERED
(
[Id_Ware],
[WarehouseNo]
) ON [PRIMARY]
GO
[/src]
В этой таблице может быть запись с определённым набором Id_Ware и WarehouseNo, а может и не быть.
Для того, чтобы при отсутсвующей записи получить значение 0, я использую следующую конструкцию: IsNull (sum (xxx), 0).
А можно делать проверку записи на существование.

Привожу пример, где эти оба метода используются последовательно один за другим:
DECLARE	@StoreQ		decimal (19,2),	@StoreReserv		decimal (19,2)

SET STATISTICS PROFILE ON

if not exists (SELECT	*  
	FROM		WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	100 	
) begin
	SELECT	@StoreQ = 0,	@StoreReserv = 0
end else begin
	SELECT	@StoreQ	= Rest,   
		@StoreReserv = Reserv   
	FROM	WareRest
	WHERE	Id_Ware 		=	48019	AND
		WarehouseNo 		=	100
end 	


SELECT	@StoreQ = IsNull (sum (Rest), 0),   
 	@StoreReserv = IsNull (sum (Reserv), 0)  
FROM		WareRest
WHERE	Id_Ware 		=	48019	AND
	WarehouseNo 		=	100 	

SET STATISTICS PROFILE OFF



[/src]Если я правильно понимаю, то 1-ый способ (через sum) более быстрый. Это так?
Есть ли ещё более эффективные варианты?


К чему IsNull (sum (Rest), 0) :( ???

У вас же PK таков, что запись о продаже если и есть, то одна.
Я бы предложил Вам так:
select @StoreQ = 0, @StoreReserv = 0
SELECT	@StoreQ	= [Rest], @StoreReserv = [Reserv]   
FROM	[WareRest]
WHERE	[Id_Ware]	=	48019	AND
	[WarehouseNo] 	=	100
Так как не найдя записи ... ничего просто и не произойдёт.
28 окт 05, 17:58    [2018185]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить