Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 继续-在查询完成之前查看第一行_Sql_Sql Server_Database_Oracle_Informix - Fatal编程技术网

Sql 继续-在查询完成之前查看第一行

Sql 继续-在查询完成之前查看第一行,sql,sql-server,database,oracle,informix,Sql,Sql Server,Database,Oracle,Informix,我已经确定了我的用户通常使用的查询结构。创建复合索引以支持这些构造并提供第一行功能对我来说有意义吗 如果我从SE迁移到IDS,我将失去使用C-ISAM调用编写低级函数的能力,但会获得第一行以及其他好处,如:索引扫描的集合读取(onconfig使用[uko]BATCHEDREAD)、优化器指令、并行查询等 评论中的信息 当铺生产表由:customer.name char(30)使用通配符(LASSURF*查找LASTNAME姓氏、FIRSTNAME)查询,或由pawns.ticket_numbe

我已经确定了我的用户通常使用的查询结构。创建复合索引以支持这些构造并提供第一行功能对我来说有意义吗

如果我从SE迁移到IDS,我将失去使用C-ISAM调用编写低级函数的能力,但会获得第一行以及其他好处,如:索引扫描的集合读取(onconfig使用[uko]BATCHEDREAD)、优化器指令、并行查询等


评论中的信息 当铺生产表由:customer.name char(30)使用通配符(LASSURF*查找LASTNAME姓氏、FIRSTNAME)查询,或由pawns.ticket_number INT查询。客户和典当通过:customer.name=pawns.name,而非customer.serial=pawns.fk连接。trx日期早于1年的典当被移动到另一个硬盘上另一个数据库中的历史表(>500K nrows)。历史数据的索引由trx_日期递减。这就是即席复合查询结构发挥作用的地方

一旦找到客户的典当交易,当客户进行intrest或兑换pymt时,该行将更新。如果客户在90天内没有进行pymt,用户将手动更新他们将没收的典当。典当。当客户赎回典当或因缺少pymt而没收典当时,状态变为不活动。当不活动者的trx日期超过1年时,他们将从典当表移至历史表,因此此应用程序中不会发生大规模更新。当铺每天早上开业前都会执行此程序

{ISQL 2.10.06E(SE-DOS16M保护模式)典当表优化-
每天一次,在业务开始前,程序}
卸载到“U:\UNL\ACTIVES.UNL”
选择*从pawns中选择pawns.status=“A”
按pawns.cust\u名称、pawns.trx\u日期订购;
卸载到“U:\UNL\INACTIVE.UNL”
从典当中选择*
在哪里典当。状态“A”
和pawns.trx_date>=(今天-365)
按pawns.cust\u名称、pawns.trx\u日期描述订购;
卸载到“U:\UNL\HISTORIC.UNL”
从典当中选择*
在哪里典当。状态“A”
和pawns.trx_日期<(今天-365)
典当订单。trx_日期说明;
放下桌上的棋子;
创建表兵
(
trx_num串行,
客户姓名字符(30),
状态字符(1),
trx_日期,
…)在“S:\PAWNSHOP.DBS\PAWNS”中;
从“U:\UNL\ACTIVES.UNL”加载到典当中;{500:600 nrows平均值}
从“U:\UNL\INACTIVE.UNL”加载到典当中;{6500:7000 nrows平均值}
从“U:\UNL\HISTORIC.UNL”加载,插入dss:HISTORIC;{>500K nrows}
在典当上创建集群索引pa_cust_idx(客户名称);
{这将每个客户分组典当在一起,在
在大多数情况下,最早的trx_日期订单在最后一年内,然后是不活跃的典当
最近的trx_日期订单。超过1年的不活动将加载到历史记录中
表位于单独的数据库中,位于单独的硬盘上。历史记录表
每周对DSS查询进行优化。}
在典当上创建唯一索引pa_trx_num_idx(trx_num);
在典当上创建索引pa_trx_date_idx(trx_date);
在典当上创建索引pa_status_idx(状态);
{grant语句…}
更新统计数据;

没有简单的是/否答案-这是一种平衡行为,与许多性能问题一样

与指数相关的两个主要成本必须与收益相平衡

  • 在表中添加、删除和修改行时,必须维护索引。成本不是很大,但也不是可以忽略不计的
  • 索引占用磁盘空间
  • <> p>当查询有更多的索引时,也有一个小的开销被优化,

    好的索引的主要好处是,当索引可以得到很好的使用效果时,可以大大提高选择数据的性能

    如果您的表不是很稳定,并且经常使用索引有帮助的条件进行搜索,那么假设磁盘空间不是问题,那么创建复合索引可能是有意义的

    如果您的表非常不稳定,或者很少使用特定的索引(但在使用该索引的少数情况下是有益的),那么您可能应该权衡一下速度较慢的查询的几乎一次性成本,以及在可以使用索引的少数情况下存储和维护索引的成本

    关于索引设计的主题,有一本相当不错的书:由Lahdenmäki和Leach撰写(它也相当昂贵)


    弗兰克在最新评论中说:

    [五十] 寻找一些东西。如前所述,最简单的方法是允许Informix在拥有行之后开始返回行。(甲骨文默认这么做。)弗兰克的要求与谷歌的要求大致相同。好吧,这真的可以追溯到Alta Vista和90年代,当时谈论的是网络上的搜索索引。其思想是,您可以进行快速搜索,在报告搜索中返回的行数的同时提取前n个内容。(好像谷歌报告的数字是准确的。)

    弗兰克的这一补充评论在这个问题上更有意义,这是一个延续

    显然,除非SQL语句强制Informix进行排序,否则它会在得到结果后立即提供结果;总是这样。
    FIRST\u ROWS
    优化提示向IDS指出,如果它有两个查询计划可供选择,并且其中一个可以让它比另一个更快地生成第一行,那么它应该更喜欢快速生成第一行的一个,即使它的总体成本比另一个更高。即使在没有提示的情况下,IDS仍然会尽可能快地提供数据——它也会尽可能高效地提供数据

    当查询准备好后,您将得到可能返回的行数的估计值—您可以将其用作一个指标(少数、相当多、非常多)。分开,你可以很快和我联系
    {ISQL 2.10.06E (SE-DOS16M protected mode) pawns table optimization - 
     once-daily, before start of business, procedure}
    
     unload to "U:\UNL\ACTIVES.UNL"
        select * from pawns where pawns.status = "A"
      order by pawns.cust_name, pawns.trx_date;
    
     unload to "U:\UNL\INACTIVE.UNL"
        select * from pawns
         where pawns.status <> "A"
           and pawns.trx_date >= (today - 365)
      order by pawns.cust_name, pawns.trx_date desc;
    
     unload to "U:\UNL\HISTORIC.UNL"
        select * from pawns
         where pawns.status <> "A"
           and pawns.trx_date < (today - 365)
      order by pawns.trx_date desc;
    
     drop table pawns;
    
     create table pawns
     (
         trx_num serial,
         cust_name char(30),
         status char(1),
         trx_date date,
     . . . ) in "S:\PAWNSHOP.DBS\PAWNS";
    
     load from "U:\UNL\ACTIVES.UNL" insert into pawns;         {500:600 nrows avg.}
     load from "U:\UNL\INACTIVE.UNL" insert into pawns;        {6500:7000 nrows avg.}
     load from "U:\UNL\HISTORIC.UNL" insert into dss:historic; {>500K nrows}
    
     create cluster index pa_cust_idx on pawns (cust_name);
    
     {this groups each customers pawns together, actives in
      oldest trx_date order first, then inactive pawns within the last year in most 
      recent trx_date order. inactives older than 1 year are loaded into historic 
      table in a separate database, on a separate hard disk. historic table 
      optimization is done on a weekly basis for DSS queries.}
    
     create unique index pa_trx_num_idx on pawns (trx_num);
     create index pa_trx_date_idx on pawns (trx_date);
     create index pa_status_idx on pawns (status);
    
     {grant statements...}
    
     update statistics;