代码之家  ›  专栏  ›  技术社区  ›  John

SQL 2005-链接到Oracle的服务器查询非常慢

  •  7
  • John  · 技术社区  · 15 年前

    在我的sql2005服务器上,我有一个通过ORAB.甲骨文供应商。

    如果我通过由4部分组成的标识符运行查询,如下所示:

    SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345
    

    要花一分钟才能完成。如果我像这样运行相同的查询:

    SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345')
    

    它马上就完成了。我是否缺少一个设置来在适当的时间段内运行第一个查询?还是我一直在使用openquery?

    1 回复  |  直到 15 年前
        1
  •  14
  •   Dean    15 年前

    或者,当您使用OPENQUERY时,sqlserver将SQL语句发送到目标数据库进行处理。在处理过程中,会利用表上的任何索引。在将结果集发送回SQL Server之前,还会在Oracle端应用where子句。

    根据我的经验,除了最简单的查询外,OPENQUERY将为您提供更好的性能。

    出于上述原因,我建议对所有内容都使用OpenQuery。

    在使用OpenQuery时,您可能已经遇到的一个难点是单引号。如果要发送到远程数据库的sql字符串需要在字符串或日期周围加单引号,则需要对其进行转义。否则,它们会意外地终止sql字符串。

    以下是一个模板,每当我处理链接服务器的openquery语句中的变量时,我都会使用它来处理单引号问题:

    DECLARE @UniqueId int 
    , @sql varchar(500) 
    , @linkedserver varchar(30) 
    , @statement varchar(600) 
    
    SET @UniqueId = 2 
    
    SET @linkedserver = 'LINKSERV' 
    SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL' 
    SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '  
    SET @Statement = @Statement + '''' +  @SQL + ''')' 
    EXEC(@Statement) 
    
    推荐文章