数据库查询速度
现有两张表,连接条件一定后,需要对其反复查询,大概在几十万次左右。
怎样可以增加速度。建索引还是建视图,或者其他的办法。
oracle可以在内存中处理,sql是否有相同的办法?
------解决方案--------------------SQL Server中也可以将表高速缓存。
-------------------------------------------------
DBCC PINTABLE
将表标记为驻留,这表示 Microsoft SQL Server 不从内存中刷新表页。
语法
DBCC PINTABLE ( database_id , table_id )
参数
database_id
是要驻留的表的数据库标识 (ID) 号。若要确定该数据库 ID,请使用 DB_ID 函数。
table_id
是要驻留的表的对象标识号。若要确定表 ID,请使用 OBJECT_ID 函数。
注释
DBCC PINTABLE 不会导致将表读入到内存中。当表中的页由普通的 Transact-SQL 语句读入到高速缓存中时,这些页将标记为内存驻留页。当 SQL Server 需要空间以读入新页时,不会清空内存驻留页。SQL Server 仍然记录对页的更新,并且如有必要,将更新的页写回到磁盘。然而,在使用 DBCC UNPINTABLE 语句使该表不驻留之前,SQL Server 在高速缓存中一直保存可用页的复本。
DBCC PINTABLE 最适用于将小的、经常引用的表保存在内存中。将小表的页一次性读入到内存中,将来对其数据的所有引用都不需要从磁盘读入。
注意
DBCC PINTABLE 可以提供性能改进,但是使用时务必小心。如果驻留大表,则该表在开始时会使用一大部分高速缓存,而不为系统中的其它表保留足够的高速缓存。如果所驻留的表比高速缓存大,则该表会填满整个高速缓存。sysadmin 固定服务器角色的某个成员必须关闭而后重新启动 SQL Server,然后使表不驻留。驻留太多的表和驻留比高速缓存大的表会产生同样的问题。
------解决方案--------------------DBCC UNPINTABLE
将表标记为不在内存驻留。将表标记为不在内存驻留后,可以清空高速缓存中的表页。
语法
DBCC UNPINTABLE ( database_id , table_id )
参数
database_id
是含有要驻留的表的数据库的数据库标识 (ID) 号。若要获得数据库 ID,请使用 DB_ID。
table_id
是要驻留的表的对象 ID。若要确定对象 ID,请使用 OBJECT_ID。
注释
DBCC UNPINTABLE 不会导致立即将表从数据高速缓存中清空。而指定如果需要空间以从磁盘中读入新页,高速缓存中的表的所有页都可以清空。
------解决方案--------------------学习中
视图是一张虚表,表里面的数据放在高速缓存里,用视图查同样的快,个人意见
DECLARE @db_id int, @tbl_id int
USE szunderground30 --数据库
SET @db_id = DB_ID( 'szunderground30 ')
SET @tbl_id = OBJECT_ID( 'Exam_tQuestion ')--表名
DBCC PINTABLE (@db_id, @tbl_id)
------解决方案--------------------DECLARE @db_id int, @tbl_id int
USE pubs
SET @db_id = DB_ID( 'pubs ')
SET @tbl_id = OBJECT_ID( 'pubs..authors ')
DBCC PINTABLE (@db_id, @tbl_id)
这些语句都是什么意思啊!我要对表authors执行查询操作该怎么办呢
------解决方案--------------------sql怎么和oracle比 这种数据怎么处理都是oracle快多了
------解决方案--------------------将表标记为驻留,表示SQL Server不从内存中刷新表页, 可以提供性能改进,加快查询速度