我正在努力创建一个SQL查询,所以我希望有人能够帮助我。
这个想法是:我有一个名为[logs]的表。
我需要在此表上执行初始过滤器以缩小搜索范围。然后我们将其称为集合A.然后我需要计算子集A中的唯一条目。
所以我遇到的问题是如何选择select的结果。
我是否需要使用临时表或视图?
此查询将在1亿行上运行,因此,如果有更好的性能选项,请大声说出来。
到目前为止,这是我的尝试:
CREATE PROCEDURE CheckForActiveRadioCount
@AccountCodeStart varchar(50),
@AccountCodeEnd varchar(50),
@RepeaterId varchar(50),
@DateStart varchar(50),
@DateEND varchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @_DateStart DATETIME2(2) = CAST(@DateStart as DATETIME2(2));
DECLARE @_DateEnd DATETIME2(2) = CAST(@DateEnd as DATETIME2(2));
DECLARE @_AcStart INT = CAST(@AccountCodeStart as INT);
DECLARE @_AcEnd INT = CAST(@AccountCodeEnd as INT);
SELECT
messageId, time, direction, hasRouting, deviceType, unitId, accountCode,
clientId, data
FROM
[LoggingServer].[dbo].[Logs] AS data WITH (INDEX = NCILogIdLogs)
WHERE
((deviceType = 1) OR (deviceType = 4))
AND (unitId LIKE @RepeaterId)
AND (direction = 0)
AND (TRY_CONVERT(INT,[accountCode]) >= @_AcStart) //ACCOUNT CODE CAN BE LETTERS, THESE SHOULD BE IGNORED
AND (TRY_CONVERT(INT,[accountCode]) <= @_AcEnd) //ACCOUNT CODE CAN BE LETTERS, THESE SHOULD BE IGNORED
AND (time > @DateStart )
AND (time < @DateEnd )
SELECT
COUNT(DISTINCT [AccoutCode])
FROM
data AS NumberOfUniqueRadios
END GO
的问题:
如果WHERE
是accountCode
可能是数字'ABC'(必须忽略)或'1234',我如何在[accountCode]上执行varchar
必须包括在内吗?
我希望输出能够做两件事:
和
答案 0 :(得分:2)
评论太长了。
为什么要将参数作为字符串传递,然后将它们转换为适当的数据类型?存储过程应该采用正确的日期类型。
为什么要使用整数而不是字符串来比较帐户代码?
为什么要指定使用特定索引而不是让引擎选择最佳执行计划?
我认为你的代码应该更像这样:
CREATE PROCEDURE CheckForActiveRadioCount (
@AccountCodeStart varchar(50),
@AccountCodeEnd varchar(50),
@RepeaterId varchar(50),
@DateStart DATETIME2(2),
@DateEND DATETIME2(2)
) AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(DISTINCTD accountCode) as NumberOfUniqueRadios
FROM [FSK_LoggingServer].[dbo].[Logs] l
WHERE (deviceType IN (1, 4) AND
unitId LIKE @RepeaterId AND
direction = 0 AND
accountCode >= @_AcStart AND accountCode <= @_AcEnd AND
try_convert(accountCode, int) is not null and
time > @DateStart AND time < @DateEnd;
END;