Sql 将VARBINARY转换为VARCHAR和charindex的查询优化
我有一个存储库表,它有大约1870万行,每个月大约添加50万到10万行。表结构如下所示Sql 将VARBINARY转换为VARCHAR和charindex的查询优化,sql,sql-server,performance,sql-server-2012,varbinary,Sql,Sql Server,Performance,Sql Server 2012,Varbinary,我有一个存储库表,它有大约1870万行,每个月大约添加50万到10万行。表结构如下所示 CREATE TABLE [dbo].[my_table]( [id] [bigint] NULL, [a_timestamp] [datetime] NULL, [eventId] [bigint] NULL, [userId] [varchar](255) NULL, [customerid] [varchar](128) NULL, [messageTyp
CREATE TABLE [dbo].[my_table](
[id] [bigint] NULL,
[a_timestamp] [datetime] NULL,
[eventId] [bigint] NULL,
[userId] [varchar](255) NULL,
[customerid] [varchar](128) NULL,
[messageType] [varchar](100) NULL,
[message] [varbinary](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
我编写了以下查询以获得每个月的各种计数。现在执行查询大约需要10分钟。我需要帮助来优化这个查询,如果可能的话,将时间缩短到几分钟
SELECT DATEADD(month, DATEDIFF(month, 0,a_timestamp), 0) AS MonthYear,
COUNT(*) AS [Count],
COUNT(DISTINCT customerid) AS [Unique Customers],
COUNT(DISTINCT userId) AS [Unique Users]
FROM [my_table]
WHERE messageType = 'Outbound'
AND userId NOT IN ('master', 'admin')
AND CHARINDEX('Retrieve Document',CONVERT(VARCHAR(MAX),[message])) > 1
GROUP BY DATEADD(month, DATEDIFF(month, 0,a_timestamp), 0)
ORDER BY MonthYear
我认为执行时间长的主要原因如下
从VARBINARY转换为VARCHAR,并搜索是否“Retrieve Document”CHARINDEX('Retrieve Document',CONVERT(VARCHAR(MAX),[message]))>1
筛选列表中用户以外的用户(实际列表长度超过2个字符串,大约10个字符串)userId不在('master','admin')
- 表中有1870万行
- 我不创建此表,也无法更改它
- 我没有
权限SHOWPLAN
- 我需要在Excel数据连接中使用此查询,并让用户从Excel运行它。用户将只有选择权限
INSERT INTO AccumulatedResults
(
MonthYear,
[COUNT],
UniqueCustomers,
UniqueUsers,
)
SELECT
DATEADD(month, DATEDIFF(month, 0, a_timestamp), 0) AS MonthYear,
COUNT(*) AS [Count],
COUNT(DISTINCT customerid) AS [Unique Customers],
COUNT(DISTINCT userId) AS [Unique Users]
FROM
[my_table]
WHERE
messageType = 'Outbound' AND
userId NOT IN ('master', 'admin') AND
CHARINDEX('Retrieve Document', CONVERT(VARCHAR(MAX), [message])) > 1
-- This is a new condition
AND DATEADD(month, DATEDIFF(month, 0, a_timestamp), 0)
> (SELECT MAX(MonthYear) FROM AccumulatedResults)
GROUP BY
DATEADD(month, DATEDIFF(month, 0, a_timestamp), 0)
+1感谢您提出创建新表的想法。我需要在excel数据连接中使用此查询,并让用户从excel运行它。用户将只有选择权限。因此,这可能不是最好的答案。我将更新问题以反映这一点,最终用户将使用我的解决方案从excel电子表格中查询“累计结果”,这几乎是即时的。您每月仅运行一次上述查询,以便将新结果作为单独作业插入。单独作业是指触发器?可以每月手动运行一次脚本,也可以在SSIS中使用计划作业。有许多方法可以定期运行SQL脚本。底线是,用户查询的是一个小得多的表,其中包含预先准备好的结果,这当然要快得多。“AccumeratedResults”表应该在“MonthYear”上有一个主索引。好的,我会尝试一下,然后让您知道它是如何运行的