Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 如何在Firebird 2.5.1中加速简单的连接查询_Sql_Firebird - Fatal编程技术网

Sql 如何在Firebird 2.5.1中加速简单的连接查询

Sql 如何在Firebird 2.5.1中加速简单的连接查询,sql,firebird,Sql,Firebird,在Firebird 2.5.1中对两个大表执行简单的内部联接查询时,结果在几秒钟后返回。在其他数据库中,结果在几毫秒后返回。问题是如何加快查询速度,为什么Firebird使用自然索引而不是索引 查询是: SELECT FIRST 20 * FROM A INNER JOIN B ON A.ID = B.AID; 由此产生的计划是: PLAN JOIN (A NATURAL, B INDEX (IDX_B_1)) 统计数字: 表和索引元数据: CREATE TABLE "A" ( "I

在Firebird 2.5.1中对两个大表执行简单的内部联接查询时,结果在几秒钟后返回。在其他数据库中,结果在几毫秒后返回。问题是如何加快查询速度,为什么Firebird使用自然索引而不是索引

查询是:

SELECT FIRST 20 * FROM A INNER JOIN B ON A.ID = B.AID;
由此产生的计划是:

PLAN JOIN (A NATURAL, B INDEX (IDX_B_1))
统计数字:

表和索引元数据:

CREATE TABLE "A" 
(
  "ID"   INTEGER NOT NULL,
CONSTRAINT "PK_A" PRIMARY KEY ("ID")
);


CREATE TABLE "B" 
(
  "ID"   INTEGER NOT NULL,
  "AID"  INTEGER,
CONSTRAINT "PK_B" PRIMARY KEY ("ID")
);


CREATE INDEX "IDX_B_1" ON "B"("AID");
要填充,可以使用以下步骤:

declare variable nba integer;
declare variable nbb integer;
declare variable nbc integer;

begin
  nba = 0;
  nbb = 0;
  nbc = 0;
  while (nba < 100000) do begin
    insert into A (ID) values (:nba);
    nbc = 0;
    while (nbc < 50) do begin
      insert into B (ID, AID)
      values (:nbb, :nba);
      nbb = nbb + 1;
      nbc = nbc + 1;
    end
    nba = nba + 1;
  end
end
声明变量nba整数;
声明变量nbb整数;
声明变量nbc integer;
开始
nba=0;
nbb=0;
nbc=0;
当(nba<100000)开始时
插入A(ID)值(:nba);
nbc=0;
当(nbc<50)开始时
插入B(ID,AID)
数值(:nbb,:nba);
nbb=nbb+1;
nbc=nbc+1;
终止
nba=nba+1;
终止
终止

我在Windows 64上的超级服务器上执行了此操作,并且没有更新我获得的索引的统计信息,而是计划加入(B NATURAL,一个索引(PK_A)),该索引在0.080s内执行。在更新统计数据后,我得到了plan
PlanJoin(一个自然的B索引(IDX_B_1))
,它在0.020秒内执行。确保您的索引统计信息是最新的。顺便说一句:有什么理由不定义从B到a的外键吗?您的实际计划和执行详细信息,特别是受影响的行,似乎表明您实际上没有执行a
SELECT FIRST 20
。感谢您的尝试。我将尝试使用Firebird Superserver和Windows 64重新创建您的情况,看看是否可以得到相同的结果。目前我们使用的是32位版本和超类。顺便说一句,没有理由不定义外键。我不认为这个问题是nessecary提出的。如果数字仍然很高,请尝试使用其他工具来执行(例如Flamerobin或纯ISQL),可能您的工具正在模拟前20个(这可能很奇怪,但谁知道呢)。