zoukankan      html  css  js  c++  java
  • 搜房面试题

    1、不使用数据库。怎样通过程序实现高速的排重计算?

          a、载入数据到集合中,然后使用Linq中的Distinct()进行去重。

    2、Union all与union的差别?Truncate与delete的差别?Having怎样使用?

          Union all与union的差别

          Truncate与delete的差别

          Having怎样使用

    3、对于1000万数据量的表来说。对于唯一的ID列创建索引与不创建索引,查询速度有多大差别?

            測试因为内存限制生成大量測试数据时,会提示内存不足。故本次測试将数据量限制在1000000(一百万)。

            构造測试数据例如以下:

    create table myTestTable as 
    select rownum as id,
                   to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
                   trunc(dbms_random.value(0, 100)) as random_id,
                   dbms_random.string('x', 20) random_string
              from dual
            connect by level <= 1000000;
    --myTestTableTest
    create table myTestTableTest as 
    select rownum as id,
                   to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
                   trunc(dbms_random.value(0, 100)) as random_id,
                   dbms_random.string('x', 20) random_string
              from dual
            connect by level <= 1000000;


    生成測试数据能够參考:

    点击打开链接

    点击打开链接

    为myTestTable表创建索引:

    create index sy001 on myTestTable(ID);
    Oracle创建索引的语法例如以下:

    create index 索引名 on 表名(列名);
    測试sql例如以下:

    SELECT * FROM myTestTableTest  WHERE  ID='10000';
    SELECT * FROM myTestTable  WHERE  ID='10000';
    測试查询所用时间:myTestTableTest耗时10.671秒。myTestTable耗时0.047秒

    SELECT * FROM myTestTableTest  WHERE  random_string='R5XLUNRTKUTE1IZT5R';
    SELECT * FROM myTestTable  WHERE  random_string='R5XLUNRTKU5YTE1IZT5R';
    測试查询所用时间:myTestTableTest耗时9.532秒。myTestTable耗时8.362秒

            通过数据能够看出对于创建了索引的ID列来说。查询速度的提升还是相当明显的,但对于非索引列的查询来说,提升并非非常明显,当数据量继续添加的时候。相信这样的差距会被增大。

    4、Guid的哈希值是否会反复?同一个字符串,在不同的程序和两个不同的server中,哈希值是否一样?

            全局唯一标识符。简称GUID。是一种由算法生成的唯一标识。GUID的主要目的是产生全然唯一的数字。

    在理想情况下,不论什么计算机和计算机集群都不会生成两个同样的GUID。随机生成两个同样GUID的可能性是很小的,但并不为0。所以。用于生成GUID的算法通常都增加了非随机的參数(如时间),以保证这样的反复的情况不会发生。

            哈希算法一样,哈希值应该不一样。

    5、对聚集索引和非聚集索引的理解?

          差别与理解

    6、

    Select * from  test  where name like  ‘a%’;
    Select name from  test  where name =  ‘a%’;

        当name上有非聚集索引时上述两种情况的查询差异?

        当name上有聚集索引时上述两种情况的查询差异?

    背景:

    新建表myTestTable002、myTestTable003。建表Sql例如以下:

    create table myTestTable003 (
       ID      int identity(1,1)    not null,
       NAME01  varchar(20)          null,
       NAME02  varchar(20)          null,
       String  varchar(3000)        DEFAULT '所发生的冯绍峰的水果湖光和热过奖过奖个梵蒂冈'
       )
    预制測试数据例如以下:

    USE [master]
    GO
    /****** Object:  StoredProcedure [dbo].[USP_SRZCHMX]    Script Date: 07/15/2014 13:13:43 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].[USP_SRZCHMX]      
    (      @Number VARCHAR(70),      
           @NAME varchar(70)      
    )      
    AS            
    DECLARE       
            @num int ;   
    set @num=0  
    while @num<10000000
    begin          
    insert into myTestTable003(NAME01,NAME02)values(LEFT(NEWID(),10),LEFT(NEWID(),15));    
    insert into myTestTable002(NAME01,NAME02)values(LEFT(NEWID(),10),LEFT(NEWID(),15));   
    set @num=@num+1 
    end   
    GO
    建立索引:

    CREATE CLUSTERED INDEX IX_NAME01 
        ON myTestTable003 (NAME01); 
    CREATE NONCLUSTERED INDEX IX_NAME01 
        ON myTestTable002 (NAME01); 
    myTestTable002为非聚集索引、myTestTable003为聚集索引。測试查询的sql例如以下:

    name上有聚集索引的时:

    Select * from  myTestTable003  where NAME01 like 'a%'; 
    Select NAME01 from  myTestTable003  where NAME01 =  'a%'; 
    測试结果例如以下:04分35秒、 0秒

            name上有聚集索引时:

    Select * from  myTestTable002  where NAME01 like 'a%'; 
    Select NAME01 from  myTestTable002  where NAME01 =  'a%';  
    測试结果例如以下:03分35秒、 1秒

    7、sql怎样实现查询分页?


    详细能够參考:http://blog.csdn.net/jiankunking/article/details/43062729


    在网上搜到了这么几个。也測试了一下,的确能够实现查询分页

    第一个:

    CREATE  procedure XiaoZhengGe  
    @sqlstr nvarchar(4000), --查询字符串  
    @currentpage int, --第N页  
    @pagesize int --每页行数  
    as  
    set nocount on  
    declare @P1 int, --P1是游标的id  
     @rowcount int  
    exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output  
    select ceiling(1.0*@rowcount/@pagesize) as 总页数,@rowcount as 总行数,@currentpage as 当前页   
    set @currentpage=(@currentpage-1)*@pagesize+1  
    exec sp_cursorfetch @P1,16,@currentpage,@pagesize   
    exec sp_cursorclose @P1  
    set nocount off
    第二个:

    -- 用法 EXEC PageShow 'MillionData M inner join MillDic D on M.id=D.nodeid','D.nodename,M.title,M.content','id',2,2,0,0,''
    CREATE  PROCEDURE PageShow
    (
    @tblName   varchar(255),       -- 表名
    @strGetFields varchar(1000) = '*', -- 须要返回的列 
    @fldName varchar(255)='',      -- 排序的字段名
    @PageSize   int = 10,          -- 页尺寸
    @PageIndex int = 1,          -- 页码
    @doCount bit = 0,   -- 返回记录总数, 非 0 值则返回
    @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
    @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
    )
    AS
    declare @strSQL   varchar(5000)       -- 主语句
    declare @strTmp   varchar(110)       -- 暂时变量
    declare @strOrder varchar(400)       -- 排序类型
    
    if @doCount != 0
    begin
        if @strWhere !=''
        set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
        else
        set @strSQL = 'select count(*) as Total from ' + @tblName + ''
    end 
    --以上代码的意思是假设@doCount传递过来的不是0,就运行总数统计。

    下面的全部代码都是@doCount为0的情况 else begin if @OrderType != 0 begin set @strTmp = '<(select min' set @strOrder = ' order by ' + @fldName +' desc' --假设@OrderType不是0,就运行降序,这句非常重要!

    end else begin set @strTmp = '>(select max' set @strOrder = ' order by ' + @fldName +' asc' end if @PageIndex = 1 begin if @strWhere != '' set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder else set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder --假设是第一页就运行以上代码,这样会加快运行速度 end else begin --下面代码赋予了@strSQL以真正运行的SQL代码 set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @fldName + ' ' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder if @strWhere != '' set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @fldName + ' ' + @strTmp + '(' + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' ' + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder end end exec (@strSQL)

    8、Sql查询


    查询性别男女依据id排序的前两条数据。

    解答:

    Oracle版:

    SELECT * 
    FROM 
    ( 
    SELECT ROW_NUMBER() OVER(PARTITION BY sex ORDER BY ID) AS rnk,NAME,sex
    FROM testsf 
    ) 
    WHERE rnk<=2

    效果例如以下:


    Sql Server版:

    select *
    from
    testsf a
    where a.id in(select top 2 id
       from testsf
       where SEX=a.SEX 
       --group by id
       order by id asc)

    效果例如以下:


    9、override与重载的差别?

            重载:同一个作用域内发生(比方一个类里面),定义一系列同名方法。可是方法的參数列表不同。

    这样才干通过传递不同的參数来决定究竟调用哪一个。而返回值类型不同是不能构成重载的。
            重写:继承时发生,在子类中又一次定义父类中的方法,子类中的方法和父类的方法是一样的。比如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

    理解:
            重载必须发生在一个类中,函数名同样。參数类型或者个数能够不同,返回值类型能够不同。依据參数选择调用方法。重载就是让类以统一的方式处理不同的数据,在同一个类中多个方法能够用同一个名字就叫做方法重载。
            重写override一般用于接口实现和继承类的方法改写,要注意:
                    覆盖的方法的标志必需要和被覆盖的方法的标志全然匹配,才干达到覆盖的效果;
                    覆盖的方法的返回值必须和被覆盖的方法的返回一致;
                    覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类。
                    被覆盖的方法不能为private,否则在其子类中仅仅是新定义了一个方法,并没有对其进行覆盖。


                    能够说,override是一个很智能的东西。它能够动态决定到底是採用父类还是子类的方法。


    10、Json与xml两个数据结构的优劣比較?

             知乎争论

    11、什么是HTTPS?

              百科解读

    12、假如让你做一个分页,须要注意哪些点?

    13、生产消费者模式的应用场景?

             生产者消费者模式浅析

    14、简述MVC开发的几个主要组成部分及作用?

             MVC框架

             MVC拓展

    15、简述cookie、session、application、静态字段的作用域差别?

             參考一

            參考二

    16、Webform是怎样做身份认证的?

            參考一

    17、什么是Sql注入?怎样防止?

            sql注入百科

            怎样防止參考一

    18、对称加密、非对称加密、MD5差别是什么?哪个适合做URL安全验证,怎样使用?

            对称加密

            非对称加密

            MD5

    19、当使用new b()创建b的实例的时候,产生输出什么?

    using system;
    class a 
    {
    	public a()
    	{
    		test();
    	}
    	public virtual  void test();
    }
    class b:a
    {
    	int x=1;
    	int y;
    	public b()
    	{
    		y=-1;
    	}
    	public override void test()
    	{
    		console.writeline("x={0},y={1}",x,y);
    	}
    }

    输出:x=1,y=0

    跟踪过程:


    问题19測试代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace VirtualTest
    {
        class Program
        {
            static void Main(string[] args)
            {
               B bb=new B();
            }
           
        }
        class A
        {
            public A()
            {
                Test();
            }
            public virtual void Test() { }
        }
        class B : A
        {
            int x = 1;
            int y;
            public B()
            {
                y = -1;
            }
            public override void Test()
            {
                Console.WriteLine("x={0},y={1}", x, y);
                Console.ReadLine();
            }
        }
    }

    小注:

            本人主要做WinForm开发,Web甚少涉及,有不正确的或者好的答案,希望大家留下言。谢谢。



  • 相关阅读:
    linux编程 给线程起名字
    c语言的__packed__
    LINUX 命令行编辑快捷键
    linux关于bashrc与profile的区别(转)
    linux查看和修改PATH环境变量的方法
    linux 线程 pthread_create 源码 剖析
    你真的了解【HashMap】么?-一
    Oracle 基础概念
    Java数据库连接池
    JVM内存模型与垃圾回收
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7294490.html
Copyright © 2011-2022 走看看