Sql server 选择查询需要很长时间
我想问一下如何使我的查询比现在更快, 我在一个表中有250万行,希望在处理之前将它们放入tempdbSql server 选择查询需要很长时间,sql-server,Sql Server,我想问一下如何使我的查询比现在更快, 我在一个表中有250万行,希望在处理之前将它们放入tempdb SELECT a.entity_cd, a.project_no, a.divisi, a.dept, a.acc_no, a.acc_curr,a.acc_period ,a.balance_base,a.db_base,a.cr_base,a.balance_forex,a.db_forex,a.cr_forex INTO #trlbal FROM dbo.acc_trlbal
SELECT a.entity_cd, a.project_no, a.divisi, a.dept, a.acc_no, a.acc_curr,a.acc_period ,a.balance_base,a.db_base,a.cr_base,a.balance_forex,a.db_forex,a.cr_forex
INTO #trlbal
FROM dbo.acc_trlbal a
WHERE a.entity_cd = @rt_entity_cd
AND LEFT(a.acc_period, 4) IN (@f_cyear, @f_lyear)
这是桌子的结构
CREATE TABLE [dbo].[acc_trlbal](
[entity_cd] [char](6) NOT NULL,
[project_no] [char](8) NOT NULL,
[divisi] [char](4) NOT NULL,
[dept] [char](4) NOT NULL,
[acc_no] [char](20) NOT NULL,
[acc_period] [char](6) NOT NULL,
[acc_type] [numeric](1, 0) NULL,
[balance_base] [numeric](17, 2) NULL,
[balance_forex] [numeric](17, 2) NULL,
[db_base] [numeric](17, 2) NULL,
[cr_base] [numeric](17, 2) NULL,
[db_forex] [numeric](17, 2) NULL,
[cr_forex] [numeric](17, 2) NULL,
[user_entry] [char](30) NULL,
[datetime] [datetime] NULL,
[acc_name] [char](250) NULL,
[acc_curr] [char](3) NULL,
[acc_spec] [numeric](1, 0) NULL,
[update_user] [char](10) NULL,
[update_date] [datetime] NULL,
[balance_base_adj] [numeric](21, 2) NULL,
[balance_forex_adj] [numeric](21, 2) NULL,
[db_base_adj] [numeric](21, 2) NULL,
[cr_base_adj] [numeric](21, 2) NULL,
[db_forex_adj] [numeric](21, 2) NULL,
[cr_forex_adj] [numeric](21, 2) NULL,
[balance_base_adj2] [numeric](21, 2) NULL,
[balance_forex_adj2] [numeric](21, 2) NULL,
[db_base_adj2] [numeric](21, 2) NULL,
[cr_base_adj2] [numeric](21, 2) NULL,
[db_forex_adj2] [numeric](21, 2) NULL,
[cr_forex_adj2] [numeric](21, 2) NULL
) ON [PRIMARY]
acc\u period
,@f\u cyear
,@f\u lyear
的数据类型是什么?。请发布acc\u trlbal
的表结构?我不是sql server专家,但您应该检查索引、主键等。我同意上述内容,我们需要该结构。不过我要说一句话。在WHERE子句中使用LEFT,将强制SQL Server对在(a.entity_cd=@rt_entity_cd)之后返回的数据集中的每个记录求值。因此,如果数据集相当大,可能会导致性能问题。您可以在左侧(a.acc\u period,4)
添加一个计算列,并在该列上创建一个索引。严格来说,不需要计算列,因为范围查询就足够了,例如acc\u period介于'20150101'和'20151231'之间。
。但是,将日期存储为char(6)
是一个非常糟糕的主意,尤其是当您可以仅使用date
类型来表示日期时。在字段上应用函数也是不好的,因为它会阻止优化器使用索引。有时优化器可以从中恢复,例如在将datetime
转换为date
时。当然,除非在acc\u period
上有索引,否则任何查询都不会快速执行