Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 在+;还是慢_Sql - Fatal编程技术网

Sql 在+;还是慢

Sql 在+;还是慢,sql,Sql,我有一个问题如下 select a, b, c, CAST(d as bigint) as d, e, document_cat, g, h, i, fiscal_year, k, l, m, n, account, p, q, r, s, t, u, v, CONVERT(date, CONCAT(i,'01')) as [CalDate], CASE when r='' then CONCAT(d,'-', [account],'-','X','-',[fiscal_year]

我有一个问题如下

    select   
a,
b,
c,
CAST(d as bigint) as d,
e,
document_cat,
g,
h,
i,
fiscal_year,
k,
l,
m,
n,
account,
p,
q,
r,
s,
t,
u,
v,
CONVERT(date, CONCAT(i,'01')) as [CalDate],
CASE when r='' then CONCAT(d,'-', [account],'-','X','-',[fiscal_year],'-',p)
          else CONCAT(d,'-',[account],'-',[subsidiary],'-',[fiscal_year],'-',p) 
             end as [UQID],
CASE when r='' then [account] else CONCAT([account],'-',[r]) end as [GL]

FROM
Ledger
WHERE [company]=123456
AND (document_cat= 'CAT A' or document_cat= 'CAT B' or document_cat= 'CAT    C'.....'CAT I'
)
AND (fiscal_year]=2018 or fiscal_year =2019)
AND account BETWEEN 400000 and 999999
这是一个非常慢的查询

你能告诉我怎么快点吗

我不是DBA,我只能访问视图

列类型如下

+--------------+-----------+
|     Name     | Data_Type |
+--------------+-----------+
| a            | varchar   |
| b            | datetime  |
| c            | numeric   |
| d            | varchar   |
| e            | int       |
| document_cat | varchar   |
| g            | varchar   |
| i            | numeric   |
| fiscal_year  | numeric   |
| k            | date      |
| l            | date      |
| m            | varchar   |
| n            | varchar   |
| account      | varchar   |
| p            | tinyint   |
| q            | varchar   |
| r            | varchar   |
| s            | varchar   |
| t            | varchar   |
| u            | varchar   |
| v            | varchar   |
| h            | varchar   |
| company      | varchar   |
+--------------+-----------+

这是对原始问题的编辑。我对代码进行了编辑,以包含更详细的代码和有关此代码中所用列的数据类型的更多详细信息。

查询相当简单。如果您无法访问其他对象,如在表
分类账
上创建的索引,我们无法真正建议您如何优化此查询。还有,“极其缓慢”是什么意思?它是否返回任何数据?我建议您与DBA交谈,了解表上创建了哪些索引,并查看解释计划,以了解幕后真正发生了什么。如果表很大(比如100多行),并且没有索引,例如在
company
列上,则需要扫描整个表以返回数据,这将极大地影响此SELECT查询的性能,因为内存和磁盘的点击率越来越高

以你目前的特权,你的手脚被束缚住了。你可能应该升级到比你潜得更深的人


此外,仅仅是一个想法-
分类账
也可能是一个视图,而不是一个实际上只会使事情复杂化并需要更多关注和数据/对象调查的表

您可以将您的
语句转换为
中的
。这可能会有帮助。在其他RDBMS中,可能不是这样,但它会使代码更具可读性

Select a,b,c.....x,y,z from ledger 
where 
 company = 123456
 AND document_cat IN ('CAT A','CAT B','CAT C',.....,'CAT I')
 AND fiscal_year IN (2018,2019)
 AND account between 400000 and 999999

文档cat='cat A'
是无效的SQL。空间会引起问题。如果
ledger
是一个视图,那么您需要知道基础查询是什么,这样您就知道数据库在做什么。“有点跟踪”并且没有关于模式/键的信息,这几乎是无法回答的。
document\u cat
索引了吗?
条件中的其他列是否已编入索引?能否共享表
分类账的列类型。这里可能存在对varchar的隐式转换,如果表很大,这可能是一个昂贵的操作。谢谢您的建议。我不确定在哪些列上创建索引。目前,查询返回结果大约需要30分钟。此视图当前有2000多行。另外,我是否理解,通过在我使用的列上创建索引(由DBA创建)和(或)在语法之间创建索引,可以加快查询速度?