在SQLite中使用索引优化查询速度 ( Archived on 2009-11-3 16:45:09 146 Views )
在进行多个表联合查询的时候,使用索引可以显著的提高速度,刚才用SQLite做了一下测试。
建立三个表:
create table t1
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
create table t2
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
create table t3
(id integer primary key,
num integer not null,
word1 text not null,
word2 text not null);
建立若干索引:
t1表:在num,word1,word2上有复合索引
t2表:在num,word1,word2上各有一个索引
t3表:在word1上有一个索引
create index idxT1 on t1(num,word1,word2);
create index idxT2Num on t2(num);
create index idxT2Word1 on t2(word1);
create index idxT2Word2 on t2(word2);
create index idxT3Word1 on t3(word1);
向三个表中各插入10000行数据,其中num项为随机数字,word1和word2中是英文单词,三个表中对应的num,word1和word2列中都包含有部分相同值,但是它们在表中出现的顺序不同。
速度测试结果:
1) select count(*) from t1,t3 where t1.word2=t3.word2;
很慢(t3.word2上没有索引)
2) select count(*) from t3,t1 where t1.word2=t3.word2;
很慢(t1.word2上没有独立索引)
3) select count(*) from t1,t2 where t1.word2=t2.word2;
很快(t2.word2上有索引)
4) select count(*) from t2,t1 where t1.word2=t2.word2;
很慢(t1.word2上没有独立索引)
5) select count(*) from t1,t2 where t1.num=t2.num;
很快(t2.num上有索引)
6) select count(*) from t2,t1 where t1.num=t2.num;
很快(t1的复合索引中,第一个列是num)
7) select count(*) from t1,t3 where t1.num=t3.num;
很慢(t3.num上没有索引)
8) select count(*) from t3,t1 where t1.num=t3.num;
很快(t1的复合索引中,第一个列是num)
结论:在from子句后面的两个表中,如果第2个表中要查询的列里面带有索引,这个查询的速度就快,反之就慢。比如第三个查询,from后面的第2个表是 t2,t2在word2上有索引,所以这个查询就快,当输入SQL命令并回车后,查询结果就立即显示出来了,但是如果使用第4个查询命令(即把t1和t2 的位置互换),查询起来却用了1分零6秒。
可见索引的建立对于提高数据库查询的速度是非常重要的。
在数据库中的bit类型在dataset中存放值测验 ( Archived on 2009-2-13 17:00:24 643 Views )
在数据库中的bit类型在dataset中存放值测验
表结构如下
CREATE TABLE [operator](
[guid] [nvarchar](36) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
[name] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
[pwd] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
[islock] [bit] NULL
)
表里数据内容如下
75E16F0C-B785-4EFA-A8EC-8B5868F851E8 chenzz chenzz NULL
45196378-AF0F-4A50-AB15-63CE7729A66F admin admin 1
A0DE05FA-C240-49A5-80A8-5B2F653060D1 cs css 0
3EFE95B9-DF66-4BE8-ACA5-6DCA75E0DA91 george chenzz 0
测试程序如下:
string connstring = "Data Source=(local);Initial Catalog=MyDb;Integrated Security=True";
DataSet ds = ExecuteDataSet("select * from operator", connstring);
string ss1 = ds.Tables[0].Rows[0]["islock"].ToString(); //结果为""
string ss2 = ds.Tables[0].Rows[1]["islock"].ToString(); //结果为"True"
string ss3 = ds.Tables[0].Rows[2]["islock"].ToString(); //结果为"False"
string ss4 = ds.Tables[0].Rows[3]["islock"].ToString(); //结果为"False"
结论:在数据库中bit类型数据读入到dataset后数据变为"True","False"--(注意, 字母第一个为大写),所以写程序要判断一bit 类型的数据值时(此数据已先读入到 DataSet)可以根据其值是否等于"True"或"False"来进行相应的操作
如下所示
string ss1 = ds.Tables[0].Rows[0]["islock"].ToString();
if(ss1=="True")
{
//to do something
}