SQL数据库内表太多,查询一次要半个多小时,如何优化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL数据库内表太多,查询一次要半个多小时,如何优化?相关的知识,希望对你有一定的参考价值。

SQL server的数据库,库里面有1100张表,合计大概有几十亿条记录,之前用union all命令连接表,进行全库联查,查询倒是没有问题,就是耗费时间太长,基本上每次查询都在30分钟左右,而且每次查询完SQL server的进程就把内存占满了,必须重启服务才能解决。
请问如何解决这个问题,是优化代码还是什么?如果是优化代码请告知详细的执行代码,谢谢!

参考技术A 你说的是腾讯泄漏的那个QQ群数据库吧!!
for GroupData = 1 to 11
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=****;UID=sa;PWD=sa;DATABASE=GroupData"&GroupData
for Group = (GroupData-1)*100+1 to (GroupData)*100
exec = "SELECT * FROM Group"&Group&" where QQNum = 375000016"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
if not rs.eof then
response.write(Rs("Nick")+"<br>")
else
response.write("表"&Group&"没有记录"+"<br>")
end if
rs.close
next
next
参考技术B 建议你对你要查询的表,建一个索引,索引字段就选择你要查询的条件字段,速度就会快很多的。追问

我只找到一个表建立索引的方法,请问1100张表怎么批量建立索引?

追答

没有批量建索引的方法,你的数据多应该不是每个表的数据都很多吧,你就把数据表多的几个表建立索引就可以啦!

参考技术C 优化查询,建立分区,进行分布查询,这样能大幅度的减少查询,时间,但涉及关系如果过多,可以 参考技术D 这也太夸张了。难道几十亿数据都是需要用到的吗?是多少年的数据?
可以把多年以前的数据,不经常用到的数据放到备份表中去,这样速度就会快很多追问

就是前段时间泄露的那个数据,数据是分散在1100个表里的

追答

。。。。没办法了。这个确实太多了点。sql实在是无法优化到那么细致的地步了

第5个回答  2013-11-26 SQL优化都是针对实际业务、表结构来修改SQL文的,没有几个万能又显著的优化方法。

使用SQL语句查询表及表字段类型说明

今天突然遇到有人要数据库表及表字段说明,数据库表太多又不能一个个表去找,就想想SQL是否能直接查询出来。

经过查询资料,加上一些自己的一些调整写了一个sql语句,在此记录一下,以方便日后查找使用。

SELECT  ( CASE WHEN a.colorder = 1 THEN d.name
               ELSE ‘‘
          END ) N‘表名‘ ,
        ( CASE WHEN a.colorder = 1
               THEN ISNULL(( SELECT TOP 1 value FROM   sys.extended_properties WHERE  major_id = OBJECT_ID(d.name) ), ‘‘)
               ELSE ‘‘
          END ) N‘表说明‘ ,
        a.colorder N‘字段序号‘ ,
        a.name N‘字段名‘ ,
        ( CASE WHEN COLUMNPROPERTY(a.id, a.name, ‘IsIdentity‘) = 1 THEN ‘√‘
               ELSE ‘‘
          END ) N‘标识‘ ,
        ( CASE WHEN ( SELECT    COUNT(*)
                      FROM      sysobjects
                      WHERE     name IN (
                                SELECT  name
                                FROM    sysindexes
                                WHERE   id = a.id
                                        AND indid IN (
                                        SELECT  indid
                                        FROM    sysindexkeys
                                        WHERE   id = a.id
                                                AND colid IN ( SELECT  colid FROM syscolumns WHERE id = a.id AND name = a.name ) 
										) 
								)
                                AND xtype = ‘PK‘
                    ) > 0 THEN ‘√‘
               ELSE ‘‘
          END ) N‘主键‘ ,
        b.name N‘类型‘ ,
        a.length N‘占用字节数‘ ,
        COLUMNPROPERTY(a.id, a.name, ‘PRECISION‘) AS N‘长度‘ ,
        ISNULL(COLUMNPROPERTY(a.id, a.name, ‘Scale‘), 0) AS N‘小数位数‘ ,
        ( CASE WHEN a.isnullable = 1 THEN ‘√‘
               ELSE ‘‘
          END ) N‘允许空‘ ,
        ISNULL(e.text, ‘‘) N‘默认值‘ ,
        ISNULL(g.[value], ‘‘) AS N‘字段说明‘
FROM    sys.syscolumns a
        LEFT JOIN sys.systypes b ON a.xtype = b.xusertype
        INNER JOIN sys.sysobjects d ON a.id = d.id
                                       AND d.xtype = ‘U‘
                                       AND d.name <> ‘dtproperties‘
        LEFT JOIN sys.syscomments e ON a.cdefault = e.id
        LEFT JOIN sys.extended_properties g ON a.id = g.major_id
                                               AND a.colid = g.minor_id
ORDER BY OBJECT_NAME(a.id) ,
        a.colorder; 

  

以上是关于SQL数据库内表太多,查询一次要半个多小时,如何优化?的主要内容,如果未能解决你的问题,请参考以下文章

AS中导入GitHub开源项目SlidingMenu总结,此方法有效,但是太耗时间。 「我用了半个多小时」

PostgreSQL如何防止表太大?

使用SQL语句查询表及表字段类型说明

Oracle 查询前半个小时的数量

sql 查找 现在30分钟之前的 数据

如何查询出一个数据库中的某个表中的某个字段?