1、不使用数据库,如何通过程序实现快速的排重计算?
a、加载数据到集合中,然后使用Linq中的Distinct()进行去重。
b、如果明确是哪几列中重复的数据的话,可以通过将数据加载到table中,在过滤table的方式来进行去重。
2、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的哈希值是否会重复?同一个字符串,在不同的程序和两个不同的服务器中,哈希值是否一样?
全局唯一标识符,简称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开发的几个主要组成部分及作用?
15、简述cookie、session、application、静态字段的作用域区别?
16、Webform是如何做身份认证的?
17、什么是Sql注入?如何防止?
18、对称加密、非对称加密、MD5区别是什么?哪个适合做URL安全验证,如何使用?
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甚少涉及,有不对的或者好的答案,希望大家留下言,谢谢。