Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择查询需要很长时间_Sql Server - Fatal编程技术网

Sql server 选择查询需要很长时间

Sql 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

我想问一下如何使我的查询比现在更快, 我在一个表中有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 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
上有索引,否则任何查询都不会快速执行