参数嗅探(Parameter Sniffing)(1/2)
原文:参数嗅探(Parameter Sniffing)(1/2)
这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2部分我们介绍下如何解决这个问题。
什么是参数嗅探(Parameter Sniffing)
在SQL Server里当你执行参数话的SQL查询时,查询优化器会基于第一个提供的参数值编译执行计划。然后生成的执行计划在计划缓存里缓存作为后期的重用。这就是说SQL Server后续会直接重用这个计划,而不管每次你提供的不同参数值。我们需要识别2类参数值:
参数编译值(Compile time values)
参数运行值(Runtime values)
参数编译值是用于查询优化器生成物理执行计划的值。参数运行值是提供给执行计划运行的值。对于第一次执行这些值是一致的,但接下来的执行,这些值就很可能不同了。这就会带来严重的性能问题,因为执行计划只为编译值而优化的,不是为你接下来提供的不同运行值而优化。
如果你在第一次查询执行的时候提供了一个特定值,然后查询优化器选择了非聚集索引查找和书签查找运算符从你表里来获取所有查询列。这样的执行计划只对特定值有意义,非特定值的话,你的逻辑读数就会很高,SQL Server会选择全表扫描,忽略定义的非聚集索引。SQL Server选择这2个计划的决定点就是所谓的临界点(Tipping Point) 。
如果书签查找的计划被缓存,SQL Server就不会理会输入值,盲目重用缓存的计划。这个情况下SQL Server的保护机制就失效了,只从计划缓存里执行缓存的计划。作为副作用,你的IO成本(逻辑都)就会爆表,查询的性能就会非常糟糕。我们来演示下这个情况,下面的脚本会创建一个简单的表,在表的第2列有不平均的数据分布(就第1条值是1,剩下的1499条值都是2)。
1 -- Create a test table
2 CREATE TABLE Table1
3 (
4 Column1 INT IDENTITY,
5 Column2 INT
6 )
7 GO
8
9 CREATE NONCLUSTERED INDEX idx_Test ON Table1(Column2)
10
11 -- Insert 1500 records into Table1
12 INSERT INTO Table1 (Column2) VALUES (1)
13
14 SELECT TOP 1499 IDENTITY(INT, 1, 1) AS n INTO #Nums
15 FROM
16 master.dbo.syscolumns sc1
17
18 INSERT INTO Table1 (Column2)
19 SELECT 2 FROM #nums
20 DROP TABLE #nums
21 GO
基于这个不平均的数据分布和临界点,对于同个逻辑查询会有2个不同的执行计划,点击工具栏的显示包含实际的执行计划:
1 SELECT * FROM dbo.Table1 WHERE Column2=1
2 SELECT * FROM dbo.Table1 WHERE Column2=2
现在当你创建一个存储过程时,查询优化器会根据第一次提供的参数值生成执行计划,然后在接下来的执行中就会盲目重用了。
1 -- Create a new stored procedure for data retrieval
2 CREATE PROCEDURE RetrieveData
3 (
4 @Col2Value INT
5 )
6 AS
7 SELECT * FROM Table1
8 WHERE Column2 = @Col2Value
9 GO
1 SET STATISTICS IO ON
2 EXEC dbo.RetrieveData @Col2Value = 1 -- int
3 EXEC dbo.RetrieveData @Col2Value = 2 -- int
现在当你用1值运行存储过程时,只返回1条记录,查询优化器在执行计划里选择书签查找。查询只产生3个逻辑读。但是当你用2值运行存储过程时,缓存的计划被重用,书签查找反复执行1499次。每条记录上都执行!查询现在产生了1505个逻辑读。这和刚才的执行完全不同。当你看查看2值里执行计划里,SELECT运算符的属性时,在参数列表里你可以看到:
如你所见它们是不一样的,参数编译值是1,参数运行值是2。这就是说在你面前的执行都是基于参数值1而优化的,但实际上你传给存储过程的参数值是2。这就是SQL Server里的参数嗅探(Parameter Sniffing)问题。
小结
如你所见,在SQL Server里很容易碰到这个问题。每次你使用参数话的SQL查询(像在存储过程里),当表数据分布不平均,提供的非聚集索引没有覆盖到查询列时,你就会碰到这个问题。这里我们只介绍了这个问题,下篇文章我会向你展示如何处理这个问题,即SQL Server向你提供了哪些方案来解决这个问题。
殊途同归,ado.net快速实现MySql的CRUD
正在学习MySql编程,安装了官方的C#客户端,在自己的机器上写了个demo,将可能常见且容易出现的问题或错误温故知新一遍,写下来以备日后再用。
一、MySql的连接字符串
连接字符串无比简单,但是这是必须的。我们需要关心的是,通过.net客户端程序,mysql的连接字符串可以像sql server一样,利用连接池高效管理连接。简单配置如下:
1
2
3
<connectionStrings>
<add name="MySqlConnString" connectionString="Server =localhost; Database =test; Uid =***; Pwd =***;Pooling=true; Max Pool Size=20;Min Pool Size=10;Allow Batch=true;" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>
更多参数,请参考:
http://dev.mysql.com/doc/refman/5.6/en/connector-net-connection-options.html
http://www.connectionstrings.com/mysql
二、实现简单的CRUD
毫无疑问,快速上手CRUD的前提是必须熟悉基础的sql,然后再对照mysql的特定语法做特定操作。不要小看了这简单的crud,普通应用系统中这部分的工作占了很大一部分,笔者才疏学浅,为这部分工作也花过不少时间。还好我们现在有了各种优秀的orm,相对而言实现起来比较轻松。
1、插入记录
最简单的方式,当然是传入参数一条一条插入:
addperson
经测试,插入数据的存储过程里的变量定义可以和列名一模一样。基于mysql的特殊语法,建议参数变量不要和列名一模一样,最好给个别名,这里不是介绍的重点,略过。
和插入记录比较类似的一个功能就是复制表定义及复制数据行,曾经简单总结过,不再赘述。
插入记录还有一个比较常用的功能,就是批量插入。
记得在向Sql Server批量插入的时候,可以通过SqlBulkCopy实现批量快速插入。先使用SqlBulkCopy测试了下MySql的批量插入,执行的结果就是直接如下抛出异常:
“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接)”
在配置文件中将连接字符串加上providerName(providerName="MySql.Data.MySqlClient")依然如故。看到这个结果忍不住哀号一句,老子tmd是要向mysql插入数据啊。
无奈打开msdn,看到SqlBulkCopy类的功能介绍直接崩溃:“lets you efficiently bulk load a SQL Server table with data from another source.”。原来SqlBulkCopy只对SQL Server有效啊,这点从它的命名空间(System.Data.SqlClient)大致可以猜到,MS真不厚道。
那么到底怎么实现批量插入的功能呢?
利用ILSpy查看了一下C#客户端的源码,发现有个MySqlBulkLoader,查看示例竟然是从文件中批量操作数据的,这个明显不满足我们的开发要求。话说不就是一次多插入几条数据吗?至于真的要先写入文件吗?
最后在网上搜索了一下,看到iteye上的一篇Java 批量插入数据库(MySQL)数据,仔细分析这篇文章,个人认为Java下实现批量插入无非就是通过JDBC API或者PreparedStatement批处理方式,实现思想还是比较简单的。其实.net也有自己的api实现批量插入(SqlBulkCopy),只是不支持mysql而已;而批处理命令(PreparedStatement)我怎么看上去都像是拼接字符串呢?得知mysql和db2支持下面这种多行插入(multi row insert):
insert2persons
我立刻想到实现批量插入的一种简单方式(也就是他的文章里提到的伪批处理命令),需要拼接sql字符串。贴一下有sql注入风险的示例代码:
batchinsert1
调用如下:
testbatchinsert1
通过上面代码可以看到,拼接字符串的地方没有进行特殊字符串处理,很容易造成sql注入。虽然实际开发的时候可以通过一个字符串处理函数进行sql敏感字符串处理,但显然这不是最优的方式。我们完全可以参数化传参再插入,重新改进代码如下:
batchinsert2
调用方式如下:
testbatchinsert2
还是免不了拼接,而且可读性较差,参数较多,调用不够简洁。
那如何更好地批量插入呢?老实说,直到现在我也还是不知道。实际开发中,批量插入的方式通常都是按照实体列表进行插入(或者使用datatable批量插入)的。于是,我又重写了一个泛型方法,用来实现参数化的批量插入,当然,原理还是拼接字符串,对于常见数据库批量插入操作,我推荐你使用下面这种方式:
BATCHINSERT
调用方式也比较简洁,如下所示:
TestBatchInsertModels
经测试,构造插入字符串的地方,参数前面必须加个“@”符号,如果不加,则抛出异常,这一点很奇怪。
必须指出,sql拼接执行插入的长度是有限制的。在我的电脑上测试插入3000个实体一点问题没有,当插入1万条记录的时候也还行,当插入10万条的时候……虽然我没有测试过可以执行的sql长度最长是多少,但是根据经验,这个sql总长度应该不会超过8k+的长度限制吧(存疑??),所以开发中可以按照策略对需要批量操作的数据再分批量插入。
如果您有好的批量插入数据的思路和解决方案,请不吝赐教。
2、查询
数据库的两大作用,一个是存储,另一个就是各种查询了。所以必须重视查询,重视查询的形式当然是从熟悉查询语法开始,这里不做过分说明,大家可以参考官方说明文档。
简单查询如利用组合条件或者id主键查询记录,很简单:
querypersons
在程序中调用非常简单,正确传参即可:
querypersons
注:mysql的字符串函数不同于sql server,最简单的字符串连接,mysql通常都是通过CONCAT函数,而sql server则用+号即可。
CONCAT函数在mysql编程中出现频率极高,它的用法如下:
1
CONCAT(str1,str2,…)
连接的字符串参数个数看上去原则上是无限制的,返回结果为连接参数产生的字符串。
它还有两个特性,记录一下:
(1)、如有任何一个参数为NULL ,则返回值为 NULL。
1
2
3
mysql> SELECT CONCAT('My', NULL, 'Sql');
-> NULL
(2)、CONCAT一个或多个参数,如果所有参数均为非二进制字符串,则结果为非二进制字符串;如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式。
1
2
3
mysql> SELECT CONCAT('My', 'Sql',2011);
-> BLOB
下面重点讨论一下分页查询的实现:
mysql的取前top n条记录有自己的语法,即limit n,这个在这一篇里曾经提及。limit还有一个偏移区间的写法:limit offset,n,第一个参数offset指定第一个返回记录行的偏移量,第二个参数n指定返回记录行的最大数目,举例来说:
1
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
还有一种方式就是指定第二个数字n为-1,那么它表示的意思就是查询从某一个偏移量到记录集结束的所有记录数:
1
mysql> SELECT * FROM table LIMIT 5,-1; // 检索记录行 6-last.
这种特性相当适合分页。关于分页,技术社区和论坛里讨论的非常多,下面就再简单说说利用mysql的limit的特性按照主键ID逆序分页取记录的功能实现。常见的分页处理方式是通过如下这种分页存储过程:
getpagerperson1
我们稍微分析一下就可以发现,对于数据量较大的查询,越往后面效率应该越低,因为越往后检索的记录行越多,这一点在高效的MySql分页介绍里已经得到验证。
和传入当前页码和每页记录数类似的是传入开始记录和结束记录这种方式,本质上和上面是没有区别的:
getpagerperson2
真正可以高效的查询,当然是记住上一次查询结果的最小(或者最大)主键,这取决于查询是逆序还是升序排序。像下面这样实现的查询越往后翻页则可以省却查询很多记录行:
quickpagergetpersons
也就是说对于>1以后的查询都需要记住上次查询的一个“临界值”(通常情况下:如按Id逆序,最小Id;按照Id降序,最大Id)。园子里流传甚广的一篇博客高效的MySql分页讲的也是这个原理。记得早就有很多人总结过sql server下的分页方式,其中经典的二次top我感觉和limit的方式非常相似,只不过limit的效率可能更高一些。
注:在存储过程中LIMIT后面只能是常量而不能是变量,所以只好用字符串拼接生成SQL语句,然后动态执行即可。
【UPDATE】:经同事提醒,是MySql版本问题,本地的测试环境是MySql5.0,换成MySql5.5,MySql引擎已支持LIMIT后面使用变量。
同时还要切记,分页查询尽量按照主键正序或者逆序查询,否则按其他有可能重复的字段分页,查询的结果可能不准确(想想为什么?),实际开发经验中这一点已经得到了验证。
最后不能免俗,重新发布一个mysql通用分页存储过程,类似于sql server下的通用分页存储过程,核心思想当然是动态拼接字符串:
sp_pager
调用方式如下:
1
CALL test.sp_Pager(2,10,'Id,FirstName,LastName,CreateDate,UpdateDate,State','test.Person','ORDER BY ID DESC');
3、修改
通常情况下,按照主键修改一条记录信息相对而言比较简单,只要sql正确、传参无误,功能实现基本和sql server一模一样。
有时候我们需要进行跨表多数据量更新,比如sql server下可以通过update from的方式进行两张表或多张表数据更新,在mysql下如何实现update from方式的更新呢?
举例:有两张表Person和People,表结构完全一样。现在要实现sql server如下的功能:
updatefrom
对于sql server再简单不过的功能,mysql下需要稍微绕点弯,
mysqlupdatefrom
虽然看上去也还算简单,可是毕竟需要join查询。而对于数据量较大的表,我曾经得到过的一个重大教训就是减少连接查询。
关于修改的功能,还有一个地方需要注意,就是在原来对应列的数据基础上更新数据,比如将所有人的Age都更新为原来的数据加1,备注修改为全名:
1
UPDATE test.Person SET Age=Age+1,Remark=CONCAT(FirstName,LastName);
上面的sql语句执行是没有问题的。除非需要更新的列指定不明,执行的时候,sql编辑器会给出警告: Column '***' in field list is ambiguous。这就说明某一列指代不明。
4、删除
删除的功能和sql server非常相似,一条一条删除(DELETE FROM *** WHERE ***)无疑是最基础最常用的,这里不做示例展示。
和删除相关的就是清空表数据,sql server下的TRUNCATE TABLE *** 对mysql同样适用。
下面着重介绍删除重复记录的实现。
在sql server下,我们需要删除某列的重复记录(示例是FirstName相同,保留的列是ID最小的记录)很简单:
deleteduplicate
ps:要找出表中某个字段的重复值,记得曾经在这篇随笔里提及过。原理就是count+分组:
select 字段名,count(字段名) from 表名 group by 字段名 having count(字段名)>1
如果将上面的sql语句放在mysql下面执行,会给出错误警告:Error Code: 1093. You can't specify target table 'Person' for update in FROM clause。
同样的功能,在mysql里的实现如下:
mysqldeleteduplicate
感觉mysql的这种写法比较迂回一点,好坏不做评价。
三、需要注意的几点
1、插入的记录不合法
在插入的时候,比如插入FirstName的值超过了varchar(16)的长度,则抛出mysqlexception,并提示:Data too long for column 'FirstName' at row 1。这点类似于sql server下的二进制字节流截断的异常。
2、mysql语句的参数传递
经测试,在mysql的存储过程中传递一个和列名Id完全一样的叫Id的参数是相当危险的。在我的测试中,删除存储过程DeletePerson如下:
DeletePerson
获取一条的存储过程如下:
GetPersonByID
更新一条记录的存储过程如下:
updateperson
但是执行的效果远不是期望的那样,真正的效果依次是删除所有记录、选取出所有记录和更新所有记录。这样很容易造成误删除或者误读取或者错误更新。解决的方法相当简单,给参数起个不是Id的别名即可。
那么通过sql语句而不是存储过程实现增删改查的参数传递如何呢?
我们不妨以update方法一试:
updateperson
实际效果果然非常诡异。
这里我大胆推测,官方提供的MySql 的C#客户端沿袭了Sql Server下的某些写法,所以,直接执行sql语句的时候,建议传递的参数必须带上“@”符号(经本地测试,增删改查都可以这么写;虽然@在存储过程里是个敏感字符,但是c#程序里调用存储过程传参也是可以使用@符号的),这个和前面拼接sql批量插入的地方有某种程度的巧合,而实际上人家可能就是这么设计传参的。
PS:我的一个牛人同事告诉我mysql存储过程传参的一些基本用法,其中着重强调的就是参数传递尽量按照mysql的标准来写,而不要沿袭sql server的写法,否则可能会造成不小困扰。他有非常丰富的开发经历,虽为经验之谈,经测试验证果然非常正确,今后必须汲取。
3、mysql的特殊语法和函数
我们知道,主流关系型数据库有多种,它们都有各自的特点和适用环境。所以如果一个人哪怕是多么了不起的dba,他也不太可能轻易地将各个平台的数据库知识都了然如胸。从这个层面来讲,学习通用而基础的sql原理和知识显得尤为重要,CSDN和博客园有很多优秀文章值得细细品读和学习。
对于像我一样的新手,我认为学好基础的sql,再深入熟练使用不同厂商的特殊语法和内置函数方能游刃有余,mysql的特殊语法和函数当然是一个重要的补充。这几天学到了不少mysql的“独特”写法,这里说它独特,主要还是先入为主,毕竟我个人使用sql server的开发经验远远高于mysql。准备将mysql和sql server的一些常见用法做个对比,这里不再一一列举。
四、打造自己的简易ORM
在之前介绍ado.net的几篇文章中,自己动手实现了一些类似orm的帮助类库(曾经改进了几次,但是不太令人满意),针对sql server的实现相对比较简单,而对mysql和oracle的一直没有动手。在文章最后的下载demo中,我参考了sql server的风格封又重新实现封装了个MySqlHelper(不是官方的那个MySqlHelper),感觉还不错。精力有限,有时间我可能也会把mysql的功能和sqlserver的实现整合在一起,当然还是等用熟了MySql再动手。
最后,求推荐一款简单易用的针对MySQL的ORM。
本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2011/09/13/2173696.html,如需转载请自行联系原作者
参数嗅探(Parameter Sniffing)(1/2)
这个问题会在参数话的SQL语句(例如存储过程)与SQL Server里的计划缓存机制结合的时候会出现。这个文章分为2个部分,第1部分会介绍下参数嗅探(Parameter Sniffing)的概况,第2部分我们介绍下如何解决这个问题。
什么是参数嗅探(Parameter Sniffing)
在SQL Server里当你执行参数话的SQL查询时,查询优化器会基于第一个提供的参数值编译执行计划。然后生成的执行计划在计划缓存里缓存作为后期的重用。这就是说SQL Server后续会直接重用这个计划,而不管每次你提供的不同参数值。我们需要识别2类参数值:
参数编译值(Compile time values)
参数运行值(Runtime values)
参数编译值是用于查询优化器生成物理执行计划的值。参数运行值是提供给执行计划运行的值。对于第一次执行这些值是一致的,但接下来的执行,这些值就很可能不同了。这就会带来严重的性能问题,因为执行计划只为编译值而优化的,不是为你接下来提供的不同运行值而优化。
如果你在第一次查询执行的时候提供了一个特定值,然后查询优化器选择了非聚集索引查找和书签查找运算符从你表里来获取所有查询列。这样的执行计划只对特定值有意义,非特定值的话,你的逻辑读数就会很高,SQL Server会选择全表扫描,忽略定义的非聚集索引。SQL Server选择这2个计划的决定点就是所谓的临界点(Tipping Point) 。
如果书签查找的计划被缓存,SQL Server就不会理会输入值,盲目重用缓存的计划。这个情况下SQL Server的保护机制就失效了,只从计划缓存里执行缓存的计划。作为副作用,你的IO成本(逻辑都)就会爆表,查询的性能就会非常糟糕。我们来演示下这个情况,下面的脚本会创建一个简单的表,在表的第2列有不平均的数据分布(就第1条值是1,剩下的1499条值都是2)。
1 -- Create a test table
2 CREATE TABLE Table1
3 (
4 Column1 INT IDENTITY,
5 Column2 INT
6 )
7 GO
8
9 CREATE NONCLUSTERED INDEX idx_Test ON Table1(Column2)
10
11 -- Insert 1500 records into Table1
12 INSERT INTO Table1 (Column2) VALUES (1)
13
14 SELECT TOP 1499 IDENTITY(INT, 1, 1) AS n INTO #Nums
15 FROM
16 master.dbo.syscolumns sc1
17
18 INSERT INTO Table1 (Column2)
19 SELECT 2 FROM #nums
20 DROP TABLE #nums
21 GO
基于这个不平均的数据分布和临界点,对于同个逻辑查询会有2个不同的执行计划,点击工具栏的显示包含实际的执行计划:
1 SELECT * FROM dbo.Table1 WHERE Column2=1
2 SELECT * FROM dbo.Table1 WHERE Column2=2
现在当你创建一个存储过程时,查询优化器会根据第一次提供的参数值生成执行计划,然后在接下来的执行中就会盲目重用了。
1 -- Create a new stored procedure for data retrieval
2 CREATE PROCEDURE RetrieveData
3 (
4 @Col2Value INT
5 )
6 AS
7 SELECT * FROM Table1
8 WHERE Column2 = @Col2Value
9 GO
1 SET STATISTICS IO ON
2 EXEC dbo.RetrieveData @Col2Value = 1 -- int
3 EXEC dbo.RetrieveData @Col2Value = 2 -- int
现在当你用1值运行存储过程时,只返回1条记录,查询优化器在执行计划里选择书签查找。查询只产生3个逻辑读。但是当你用2值运行存储过程时,缓存的计划被重用,书签查找反复执行1499次。每条记录上都执行!查询现在产生了1505个逻辑读。这和刚才的执行完全不同。当你看查看2值里执行计划里,SELECT运算符的属性时,在参数列表里你可以看到:
如你所见它们是不一样的,参数编译值是1,参数运行值是2。这就是说在你面前的执行都是基于参数值1而优化的,但实际上你传给存储过程的参数值是2。这就是SQL Server里的参数嗅探(Parameter Sniffing)问题。
小结
如你所见,在SQL Server里很容易碰到这个问题。每次你使用参数话的SQL查询(像在存储过程里),当表数据分布不平均,提供的非聚集索引没有覆盖到查询列时,你就会碰到这个问题。这里我们只介绍了这个问题
本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4551004.html,如需转载请自行联系原作者
SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
原文:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)
前言
前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块。
第一个模块注重基础内容的掌握,共分6篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划、掌握执行计划优化点,并一一列举了日常我们平常所写的T-SQL语句所会应用的运算符。我相信你平常所写的T-SQL语句在这几篇文章中都能找到相应的分解运算符。
第二个模块注重SQL Server执行T-SQL语句的时候一些内幕解析,共分为5篇文章完成,其中包括:查询优化器的运行方式、运行时几个优化指标值检测,统计信息、利用索引等一系列内容。通过这块内容让我们了解SQL Server为我们所写的T-SQL语句如何进行优化及运行的。
从本篇进入第三个模块的内容,该篇为第一篇,该模块主要让我们来指导SQL Server进行定向调整,达到优化的目的。本模块的内容是以前面一系列内容为前提的,希望充分掌握了前面基础内容,方能进入本模块内容。
技术准备
数据库版本为SQL Server2012,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks。
相信了解SQL Server的朋友,对这两个库都不会太陌生。
概念理解
谈到hint,其实概念很简单,正如词义理解:提示,也就是说让我们通过给予SQL Server提示(hint)让数据库运行时按照我们的思路进行,我估计很多不怎么了解SQL Server的童鞋都不怎么知道,因为一般应用的不多。
其实,SQL Server本身的查询优化器已经做到很好了,所以大部分情况下不需要我们人工干预,自己就能运行的很好,并且最大限度的优化运行项。但是,俗话说:老虎也有打盹的时候,所以,在有些场景下,就需要我们来给数据库指导一个方向,让其运行的更流畅。
但是,记住了:你所应用的hint是在现在的场景中给予现有的环境下,相对是一个好的方式,不能确保你所给予的提示(Hint)永久有效,并且随着时间推移,数据量的变更,你所发出的提示(Hint)有可能会成为数据库优化的绊脚石。所以没有充分的把握不要轻易使用Hint,并且最好采用目标导向Hint。
Hint主要分为三类应用:查询Hint、表Hint、连接Hint。查询Hint影响整个查询,主要应用于查询语句优化,本篇主要分析查询Hint。
表Hint影响查询引用的单个表,而连接Hint影响一个单独的连接。
Hint应用方式分为两类:目标导向Hint和物理运算符Hint。
目标导向Hint传递逻辑的目标给优化器,而不会具体指定优化器应该如何达到这个目标,应该使用什么物理运算符,或者如何排列这些运算符。所以这种运算符使我们所推荐的,原因很简单:我告诉丫按照这个思路执行就可以,至于怎么达到,自己想办法!这种方式从长期看对于数据库的影响会小很多。
另外一个就是物理运算符,此方式就更直接了:直接告诉丫的步骤,你按照这个去做就行。这种方式不推荐,原因很简单:你的思路暂时会是好的,但是过段时间就不好了。
一、查询提示(Hint)
首先,查询提示(Hint)是我们在调优中应用最广泛的,因为大部分时间我们是在调整查询的性能。
关于查询中的优化选项就是在指导SQL Server的连接类型、聚合类型、联合类型等物理连接运算符。关于此块的详细解析,可以参照我调优系列中前几篇文章,分析的相当的详细。
a、FAST N Hint提示
关于此方式的提示,我在前面的文章中已经有使用到,在介绍索引那篇文章中,可以点击这里查看。
首先,这个Hint是一个目标导向hint。提示目标很简单:告诉数据库给我速度出前N行数据就可以,而其它的数据你爱咋地咋地。
这个提示最优的应用环境就是:应用系统中的分页查询,当然其它环境可以用。有点类似于SELECT TOP N....
其次,在我们的应用环境中,尤其数据量多的情况下,如果这时候我们的场景是:我想速度的看到前面的部分数据,其它的数据你可以稍后再显示,但是在执行T-SQL的时候,SQL Server会多方面的考虑耗费(cost),然后再平衡各种利弊选择出它认为相对好的执行计划去执行,显然这种方式获取数据的方式是很浪费的,并且速度就会相对慢很多。
所以,我们利用FAST N Hint提示,这样,SQL Server会阻止优化器使用哈希连接、哈希聚合、排序、甚至是并行这些大消耗的动作,而转变成为这N条数据做快速的优化并输出。这在大数据量的情况下,是一种非常高明的方式。
来个例子:
SELECT OrderID,CustomerID,OrderDate
FROM Orders
ORDER BY OrderDate
简单的查询,并且按照OrderDate排序,不看执行计划,我们就已经推测出这个执行计划中最耗损的就是这个OrderDate了,排序永远是高耗损,这也是为什么各种类型的索引都要提前排序的原因。
然后,我们再来看一下加上这个FAST N Hint提示的执行
SELECT OrderID,CustomerID,OrderDate
FROM Orders
ORDER BY OrderDate
OPTION(FAST 1)
为了快速获取这一行数据,利用HINT后,改为了索引扫描+书签查找,因为这是获取一条数据的最优的一种方式。
因为数据量的关系,所以我上述演示没能很好的表现出FAST 提示的优越性来,其实在实际生产中,在面临庞大的数据量的时候,一般利用FAST N提示获取出部分数据之后,就不再继续运行了,因为我们关注的就是这一部分数据。
当然,此HINT也有弊端:在快速获取前N行结果之后,可能会延迟整个查询的总体相应时间。也就是说,尽管FAST N HINT可能会使优化器快速产生前N个输出计划。但是它会使优化器产生一个在结束最后一行前花费更多时间,消耗更多CPU,甚至于更多IO。
b、OPTIMIZE FOR Hint提示
此HINT是一种非常有用的提示,也是我们在日常中经常使用的。
这个HINT目标很简单:告诉优化器目标以Hint值进行分配或者执行。此Hint提示是从SQL Server2005版本以上开始支持,能够根据指定的参数值产生一个计划,尤其适用于非对称数据集中,因为这种数据集中数据分布不均匀,不同的参数值可能导致不同的基数评估和不同的查询计划,我们可以从不同的参数中选择一个最优的执行计划,作为后续不同参数的执行计划,避免了SQL Server的重新评估和重编译的耗费的动作。
来个例子:
SELECT OrderID,OrderDate
FROM Orders
WHERE ShipPostalCode=N'51100'
此语句很简单,就是通过查询邮政编码(ShipPostalCode),获取出订单ID和订单日期。
来看这个查询语句,最理想的情况就是直接通过索引查找(index seek)动作获取出数据。其实最好的方式也是通过INCLUDE将两列值包含进去。
我们来看一下实际的执行计划:
SQL Server通过了索引查找+书签查找方式获取,这种方式也凑合吧,其实我们还可以继续优化。
但是,这不是问题重点,问题重点是该段T-SQL一般我们会利用参数进行查询或者包装成存储过程通过传参调用。是吧??不会你永远只查询一个固定值吧....来看语句
DECLARE @ShipPostalCode NVARCHAR(50)
SET @ShipPostalCode=N'51100'
SELECT OrderID,OrderDate
FROM Orders
WHERE ShipPostalCode=@ShipPostalCode
是吧,这种方式才能做到重用嘛,不过包装成一个存储过程或者一个函数等,估计核心代码肯定就这样子了。
来看看生成的执行计划:
本来很爽的非聚集索引查找(Seek),通过我加了一个参数之后变成了聚集索引扫描(Scan)了,聚集索引扫描的性能跟表扫描基本一样,没有啥质的提高!
如果该表数据量特别大的话,我们为该语句设计的非聚集索引就失效了。只能通过依次扫描获取数据了。有意思吗???没意思!!!
怎么解决呢?这就是我们此处提到Hint出场的时候了,告诉数据库:丫就按照执行 “51100” 的查询一样去执行我传过来的参数。
DECLARE @ShipPostalCode NVARCHAR(50)
SET @ShipPostalCode=N'51100'
SELECT OrderID,OrderDate
FROM Orders
WHERE ShipPostalCode=@ShipPostalCode
OPTION(OPTIMIZE FOR( @ShipPostalCode=N'51100'))
看到了,这里又回归了快速的非聚集索引查找(Seek)状态,并且不受限制于传过来的参数是啥。
这个提示只是告诉SQL Server查询按照这个目标值进行操作,并不会实际影响结果值。
当然上面的问题,如果封装成存储过程的时候,可以采用重编译的方式解决,但是相比利用Hint的方式,重编译带来的消耗远大的多。尤其高并发的环境下重编译所带来CPU消耗是非常高的。
c、物理连接提示(Hint)
关于物理连接我们在前面的文章中已经详细的分析了,在SQL Server中共分为三种物理连接方式:嵌套循环、合并、哈希连接。
详细的内容可以参照我的基础篇中的链接:SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
文章中对三种连接的利弊进行了详细的对比,并且对三种连接的使用环境进行了详细的介绍。但是,有时候SQL Server为我们评估的连接并不是最优的,或者说并不是符合我们的要求,这时候,就要利用我们的物理连接提示进行指导。
总共分为三种查询级别的连接Hint,正好对应三种物理连接运算符,依次是:LOOP JOIN、MERGE JOIN 和 HASH JOIN
在应用时候,可以指定一个或者多个,如果指定一个,那么查询计划中的全部连接使用指定的连接类型,如果指定两个,SQL Server会在这两个连接类型中选择最好的一个,也就是毙掉了第三个。
应用场景蛮多的,根据三种连接的特性,我们可以有选择的进行提示,比如我们想一个查询不消耗内存,那么就可以指定OPTION(LOOP JOIN,MERGER JOIN),这样就去掉消耗内存的哈希连接,当然这是减小内存消耗但会增加执行时间。如果采用了合并连接(MERGER JOIN)方式不会消耗内存,但是合并连接需要提前排序(sort),排序会消耗大量的内存。
当然,有时候嵌套循环连接执行的时间不理想,就可以指定为哈希连接(hash join)进行连接。
来看个例子:
SELECT o.OrderID
FROM Customers C JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City=N'London'
上面的查询计划采用了嵌套循环的连接方式,两张表依次进行循环嵌套执行。
如果,经过测试这里发现采用合并连接的方式更好一点,我们可以采用如下Hint进行提示操作
SELECT o.OrderID
FROM Customers C JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City=N'London'
OPTION(MERGE JOIN)
经过调整之后,这时候该语句就利用到了我们设计的非聚集索引,并且由原来的索引SCAN变成了索引Seek运算。
通过如下方式,可以指导SQL Server在哈希连接和合并连接之间做出选择,但是一定要放弃嵌套循环连接。
SELECT o.OrderID
FROM Customers C JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City=N'London'
OPTION(HASH JOIN,MERGE JOIN)
看以看到,经过评估SQL Server还是依然的选择了合并连接
其实,这个很正常,首先数据量不大,其次是在City列上存在非聚集索引,所以要充分利用,并且在两张表的CustomerID是都为索引所覆盖,这就保证了两张表在这列上都是预先排序(sort)了,这完全满足了合并连接的条件。当然,默认选择嵌套循环连接的原因,我估计的原因就一个:两张表数据量不大。
当然,出来上面的HINT方式可以指定连接的物理连接方式,还有另外更为粗暴的一种方式,强制执行。如下:
SELECT o.OrderID
FROM Customers C INNER MERGE JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City=N'London'
当然,这种方式也手动的达到了指定采用合并连接的方式。
但是,此种方式有严重的弊端:
1、通过采用这种方式貌似暂时解决问题了,但是经过一段时间,此连接方式可能会严重阻碍数据库的优化,而要解决此问题就不得不更改代码。
2、只能粗暴的指定一种物理连接方式,不能顺应SQL Server本身自己的优化策略。
上述的方式是非常不推荐的一种,大部分新手会选择这种方式。
当然,利用Hint的方式是并非一种万全之策,但在当前基本能解决问题,当运行到一段周期之后,如果当前的HINT干预了SQL Server数据库的正常运行,我们也可以采用适当的方式予以停用Hint。使数据库得到完美的平稳的正常运行。后续文章我们依次介绍。
关于Hint这块的使用,内容还是挺多的,其中一部分还包含锁提示等,后续文章我们依次介绍,有兴趣的童鞋提前关注。
其实Hint是平常我们调优时候一种重要的工具。但是,这个工具的正确的使用则要依靠牢靠的基础知识掌握和经验累积。正所谓:厚积薄发! 不要轻易的看到了使用场景就妄自的进行盲目的使用。如果使用不当,还会扰乱SQL Server数据库本身正常的生态环境,得不偿失,越调越乱。
所以:施主,三思而行呀......
参考文献
微软联机丛书逻辑运算符和物理运算符引用
参照书籍《SQL.Server.2005.技术内幕》系列
结语
此篇文章先到此吧,关于SQL Server调优工具Hint的使用还有很多内容,后续依次介绍,有兴趣的童鞋可以提前关注。
有问题可以留言或者私信,随时恭候有兴趣的童鞋加入SQL SERVER的深入研究。共同学习,一起进步。
文章最后给出前面几篇的连接,以下内容基本涵盖我们日常中所写的查询运算的分解以及调优内容项,皆为原创,看来有必要整理一篇目录了.....
SQL Server调优系列基础篇
SQL Server调优系列基础篇(常用运算符总结)
SQL Server调优系列基础篇(联合运算符总结)
SQL Server调优系列基础篇(并行运算总结)
SQL Server调优系列基础篇(并行运算总结篇二)
SQL Server调优系列基础篇(索引运算总结)
SQL Server调优系列基础篇(子查询运算总结)
-----------------以下进阶篇-------------------
SQL Server调优系列进阶篇(查询优化器的运行方式)
SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
SQL Server调优系列进阶篇(深入剖析统计信息)
SQL Server调优系列进阶篇(如何索引调优)
SQL Server调优系列进阶篇(如何维护数据库索引)
SSIS高级转换任务—执行SQL语句
下面的随笔中将讲述SSIS中的高级转换任务,和老旧的SQL Server 2000 DTS相比,我们会发现现在以前的dark-arrow,data-pump任务没有了。在转换任务中隐藏ActiveX脚本和嵌入连接字符的方法也被去除了。在将Package指向不同的数据库的时候也不会忘记修改转换对象,在修改对象连接的时候也一样。现在新建全局连接。转换任务可以被更加容易的管理,使用便捷界面可以浏览任务的设计界面并修改属性。
在使用SSIS package的时候,有些时候需要避免一些过度依赖的情况。没有必要在package中使用ActiveX脚本任务暴力的解决一些很复杂问题。事实上如果一开始就过度依赖脚本任务,就需要停下来想一想,有没有可以替代的任务。SSIS中有许多任务可以解决譬如去掉平面文件中的无用数据,分隔数据输入内容,循环执行几个任务。我们还是可能遇到SSIS不能解决的问题,如果遇到了就需要使用灵活的.net脚本任务来解决。
这里我们将使用这些新的工具来解决生产环境的遇到的问题,我们需要重新来设置存储过程的输出参数吗?根据行数来有条件地设置分支?使用模糊逻辑任务来代替在表中查找数据如何?我们将看到更加复杂的转换任务。假定大家已经熟悉了BIDS的常见环境设置,所以在这下面的随笔中我们将不再详细解释每一个例子的具体操作步骤,而只说明重要的属性设置。
执行SQL语句任务
执行SQL任务算不上是一种高级的SSIS任务,但是在SQL Server 2000中它是一种最常用的任务。可以把它作为一个出发点来学习变量,表达式和其他SSIS中的高级属性设置。
在做一些测试的时候经常使用执行SQL任务常用来删除存储表中的数据。另一种用来调用存储过程来完成DTS中不能完成的任务。SSIS还提供一种的工具,现在使用配置管理可以编辑存储过程的需要使用的参数数据,或者保存输出参数数据。
新建一个Package,在Control Flow中拖放一个执行SQL任务。这个任务会显示一个红色的标志,一个错误信息显示提示这个任务没有连接到一个数据连接上。为了解决这个错误,双击打开编辑界面如图6-1。
图6-1
这个任务有四个标签界面:
General:设置任务的名字,描述,和数据连接相关的设置,和如何执行SQL语句相关的设置,以及要执行的SQL语句
Parameter Mapping:包含Package级或容器级的变量集合。变量为SQL语句或者存储过程提供变量输入值
Result Set:包含执行SQL语句或存储过程之后得到的数据集
Expressions:包含设置这个任务的属性的表达式,这个是需要动态设置属性的
这个任务中的主要的属性设置如下:
ConnectionType,Connection:这些属性用来设置数据连接,如类型,名字。
SQL Statement:为task提供要执行的SQL语句。这里的SQL语句可以是一个简单的SELECT语句,一个复杂的带GO语句的,或者调用一个存储过程
SQL Source Type:这个属性是新添加的一个属性。它提供属性配置SQLStatement放置在一个变量,文件,或者直接输入SQL语句
ResultSet property:这个属性可以设置为执行SQL语句之后得到的一个单一结果,多行多列的结果,或者一个XML数据。如果在General标签内将ResultSet设置为NONE,在Result Set标签界面内的表格将不可用
在使用这个task之前需要理解SSIS如何处理变量,还有一个很重要的属性expressions。
变量
在SSIS中变量时有范围的,Package范围内的只能在整个Package内使用,就相当于全局变量。变量可以由不同的分离的范围如图6-2.默认的名称空间是User。变量名是区分大小写的,这些细节会导致错误的Package逻辑。图6-2显示在同一个Package中存在的两个同名的但是作用范围不同的两个变量sSQL。在SSIS中可以方便地使用变量,首先,配置工具允许使用XML文件,环境变量,甚至注册设置来配置Package。当Package设置是静态的,在运行之前配置的,这些技术对于多环境开发更加容易管理。当从输入流中获得设置信息,或者需要在运行时修改属性,这种技术就不太容易了。三种使用非静态配置的例子是调用带参数的Package,按照命名规范规范修改输出文件名,在运行时修改连接属性。
图6-2
变量可以存储一个任务中的值并传递到另外一个任务中。变量可以通过SSIS中的属性表达式设置IS(Integrated Service)组件的属性。可以使用变量设置任务中的信息:标记,计数器,或者控制Package的字符串。由于变量的灵活性,可以使用更多的变量设置。
表达式
大多数的任务,转换,容器都有一个属性是表达式,Package本身也有这种属性。表达式集合使用逻辑表达式来显示容器等的属性。执行SQL语句任务中可以使用表达式设置的属性是SQL StatementSource,就是将要执行的SQL语句或存储过程的源。另外一个属性ConnectionString为OLE DB连接设置连接字符串。在任务中右击选择属性,在表达式这一栏点击表达式傍边的按钮打开编辑表达式对话框。
如图6-3显示的是执行SQL任务的属性编辑对话框,点击Property下拉列表框显示的是属性表达式。
图6-3
点击表达式栏傍边的按钮创建一个表达式。如图6-4,使用这个工具创建一个逻辑表达式,可以使用的选择项有字面值,系统,用户自定义变量,操作符,内建函数。表达式语言中的函数和操作符类似于C#,C和TSQL语言,但有区别。使用VB语言时==代表着判断相等,&&代表着逻辑和,TSQL语言中使用双引号包含字符串而不是单引号。表达式语言不是大小写敏感的,所以C#和C程序员可以不必在意变量名的大小写问题。花一点时间很快就会熟悉表达式语言。
图6-4
现在我们继续讨论如何在执行SQL任务中使用两种不同范围的变量。图6-4显示SQLStatementSource属性的表达式属性,展开的变量节点显示所有的变量值。点击变量User::sSQL并拖放到Expression文本框内,这样就创建了一个表达式。在运行时表达式的值将会替代SQLStatementSource属性的值。点击下方的Evaluate Expression按钮查看表达式的值。可以看到表达式的值是SELECT 2。在这例子中,两个变量的名字相同,范围不同。在执行任务时,属性的值将会是SELECT 2。
使用SQL 输出参数动态改变package设置
在这个例子中我们将导出AdventureWorks数据库中的[HumanResources].[Shift]中的数据到一个txt文件中,并在运行时修改属性的值。在执行SQL任务中使用输出表达式来修改导出路径。
假设客户要求将一个Package和一个包含系统配置信息的数据库整合起来,在这个数据库中分别存放着开发,测试和产品环境。在载入数据的时候,所有的设置需要在运行时使用存储过程从数据库中抽取。从开发环境迁移到测试环境的时候通过修改数据库中存放的配置信息实现修改迁移目的的功能。
因为需要在运行时获得属性设置,需要使用存储过程来重新获得设置,设置信息在Package中是不能获得的。这里使用表达式来解决这个问题。
新建Package,在Control flow界面类拖放一个执行SQL语句任务
在Control Flow设计界面右击添加一个变量,为变量命名为MyFile,值为c:\Execute SQL Sample.txt 注意这里不要使用引号将这个值包含起来。
新建一个存储过程,为简单起见,将存储过程放在同一个数据库中。这个存储过程用来模拟在AdventureWorks数据库中运行下面的语句,注意这个存储过程会修改传入的参数
USE adventureworksgoCREATE PROC dbo.usp_GetConfigParamValue (@ApplicationName Varchar(30), -- the name of the application.@ParameterName Varchar(50), -- the name of the parameter @ParameterTypeName Varchar(30), -- the name of the parameter type @ParameterValueVar Varchar(255) OUTPUT -- output buffer for value )ASSet NOCOUNT ON--Dummy proc to simulate the real usp_GetConfigParamValue --Always outputs 'c:\ Execute SQL Sample Changed.txt' SET @PARAMETERVALUEVAR='c:\Execute SQL Sample Changed.txt'Set NOCOUNT OFF
设置执行SQL任务的连接类型为ADO.NET,首先新建一个ADO.NET连接,在server name栏中输入”.”表示本地服务器,在下拉列表框中选择AdventureWorks数据库,保持默认访问机制NT Authentication。注意:在这个例子中使用OLE DB连接将不再适用,不同的连接中处理存储过程参数的方法不同
设置Execute SQL SQLStatemnet属性为以下的代码:EXEC usp_GetConfigParamValue 'MYAPP', 'MYPARM', 'STRING', @MYVALUE OUTPUT
在参数映射标标签界面添加一个映射MyFile,设置variable name为User::MyFile,direction为Output,数据类型为String,Parameter Name为MYVALUE,点击OK保存设置。这里要注意这个变量名字一定要和上面的SQL语句中的变量@MYVALUE一致,可以不加@
从工具栏中拖放一个Data Flow任务,然后将Execute SQL和Data Flow连接起来
在Data Flow 设计界面拖放一个ADO NET Source和一个Flat File Destination。注意:检查你拖放的是一个Flat File Destination而不是一个Flat File Source,这两个容易混淆
配置OLE DB Source选择AdventureWorks连接设置SQLCommand属性为:Select * from [HumanResources].[Shift]
把OLE DB Source和AdventureWorks连接起来
双击Flat File Destination打开编辑界面,新建一个delimited文件,暂时地设置文件名为c:\myfile.txt,点击Mapping标签查看列名,保持默认设置点击OK退出编辑界面
这里要演示的是在运行时修改task的属性,现在这个Package能完成的任务是将数据库中[HumanResources].[Shift]表中的数据导入到c:\Execute SQL Sample.txt 。现在想要在运行时修改文件名字,需要一个表达式修改连Flat File Connection的连接字符串,我们使用表达式来达到这个目的
右击Connection Managers中的Flat File Connection Manager选择属性,在属性栏中点击Expressions傍边的按钮,要修改的属性是ConnectionString,在Expression Builder界面内选择变量@[User::MyFile]。在运行时表达式将会被赋值为变量MyFile中的值
运行这个Package检查路径C:\SSISDemos下查看文件Execute SQL Sample Changed.txt,我们本来是要将数据导入到Execute SQL Sample.txt中的,现在修改了路径,数据将传到新的文件Execute SQL Sample Changed.txt中。这样就实现了动态修改Flat File Connection的属性值的目的,这样可以不用手动修改package的配置,直接修改存储过程中的这一句:SET @PARAMETERVALUEVAR='c:\Execute SQL Sample Changed.txt' ,这样每次都可以重新设置数据的存放地址。
执行完成之后的效果如图6-5
这个例子的应用情景是首选将数据输出到一个开发环境,然后再使用表达式将属性设置为输出到一个生产环境。这样做的好处是一旦设置被一直到一个不同的环境,不必修改所有的SSIS嵌入环境设置就可以修改Package的输出路径。这个例子也使用了SSIS表达式,使用ADO.NET演示了输出参数,有些地方需要注意:
如果数据提供者没有识别出输出参数的名字和次序,一个变通的方法是是存储过程返回一个结果集并映射到变量中。如果不能修改存储过程,也可以执行简单的SQL语句查询结果并返回。下面是SQLStatement设置的语句:DECLARE @MYVALUE AS VARCHAR(255)EXEC usp_GetConfigParamValue 'MYAPP', 'MYPARM', 'STRING', @MYVALUE OUTPUTSELECT @MYVALUE AS MyValue
这里IsQueryStoredProduced属性默认设置为false,看上去应该设置为true。但是设置为true会产生错误,显示找不到储存过程。
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com
联系我,非常感谢。
ASP.NET 实用资料[转]
使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时,维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧--内部控件权限的实现 图片滚动代码。 css——之三行三列等高布局 Datagird TemplateColumn类型列中如何设定日期格式为yyyy-MM-dd格式? SQL Server各种日期计算方法 在sqlserver中如何根据字段名查找字段所在的表 [CommunityServer]看RBAC的一方景象 七招制胜ASP.NET应用程序开发 企业库之数据访问的一个小应用 SQL查找某一条记录的方法 简介微软发布的Data Access Application Block 把Excel表中的数据导入数据库(存储过程、数据库作业) 通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转) 一个分组查询的SQL 常用算法(附源码可直接执行) 网络蜘蛛(crawlers) ,SEO,网络公关等相关资源与工具的收集与整理 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简解(提供博客园本地下载) 经典数据库记录分页代码 [GridView控件]自定义分页 Web C#2.0 DataSet和Reader封装组件实现自动多数据库切换(含组件源码和实例) 为GridView删除添加提示 扩展GridView(五)——固定表头、指定行或指定列 Asp.net 2.0 Treeview 无限级无刷新示例 运用JAVASCRIPT,写一个类,类名:student,他的属性:name,age,tall,他的方法:getName,getAge,getTall SQL IF..ELSE..在存储过程的使用规范 sql server日期时间函数 页面自动刷新 css的一些基础的东西 利用css和js实现firefox和IE都支持的页面局部打印 总结一些js自定义的函数 從無到有實現一個xml數據庫登錄驗証 图片保存到数据库和从数据库读取图片并显示(C#) [转]FreeTextBox使用详解 将上传图片打上防伪图片水印并写入数据库 asp.net 2.0中一次性更新所有GRIDVIEW的记录 VS2005 TreeView 的 CheckBox 被点击时的引发页面回发事件 扩展GridView(四)——每行复选框的全选与取消全选 [翻译]开发一个HTML在线编辑器(一) Castle ActiveRecord(一)概述 用sql 得到某表下的列名 一个二级域名转向类(转) sql 分页存储过程 sql2000下 分页存储过程 回归命令行 SQLServer的命令行工具们(2) – sqlcmd.exe(中篇) 分页及页码导航 用户控件 十分钟内学会:根据数据库生成站点导航 自己写的几个高效,简洁的字符处理函数 用一句SQL取出第 m 条到第 n 条记录的方法 老问题:js实现gridview中的全选和反选 js取得gridview中获取checkbox选中的值,郁闷了半天 JavaScript 经典代码大全:有 目录 及 编号 的哦 ! 深入DML JavaScript 網頁打印處理 HTML语言:经典笔记'800')this.width='800';if(this.height>'600')this.height='600';" border=0> 员工管理系统(数据库部分)--一个老师很久就布置的作业 CSS 实用笔记 数据仓库自动抽取:通过 SQL Server 企业管理器中的数据转换服务 (DTS) 设计器 创建 Analysis Services 处理任务 SQL Server各种日期计算方法 如何创建类型FreeTextBox的编辑器 MemberShip(图) 让你的ASP.NET虚拟主机也支持子网站 使用 SqlBulkCopy 大量复制文字文件之 C# 程序代码 Community Server 2.1 安装到远程虚拟主机上常见问题解决 (摘)开源AJAX开发框架 继续发布VS2005下DataGridView 的多种样式列控件 sql server作业用法 SQL2000 和 SQL2005 下 行列转换 示例 使用批处理产生日期(时间)文件、文件夹 ASP.NET 2.0 Security FAQs 效果直逼flash的Div+Css+Js菜单 一个二级域名转向类(转) ASP.NET分页系列转载 (转载)基于.net开发平台项目案例集锦 轻松学DIV教程(div+css布局) 如何让SELECT 查询结果额外增加自动递增序号 导出sql server 数据库为Excel的数据字典的小工具 使用Gridview和ObjectDataSource轻松实现自定义分页 在数据回发时,维护ASP.NET Tree控件的位置 除非迫不得已不要用游标 基于.NET的CMS软件的选择 搜索引挚项目(附源码) 重写GridView分页样式! 重写GridView 开源代码生成器:SmartCode 构建基于ListView(Win)的数据绑定对象 随心所欲的Web页面打印技术 扩展GridView控件(上) Gridview动态隐藏空字段 ASP.NET组件DataGrid的分页实用方法 基于角色-功能-资源的权限控制模型的设计与实现 asp.net 2.0 权限树的控制(多处转载) Castle ActiveRecord Hands On Lab(1):基本数据访问 如何在数据层分页以提高性能 为gridview添加删除提示。 解决ASP 2.0中GridView控件的删除、插入、编辑命令操作客户端确认问题的另一方法 基于.net开发平台项目案例集锦 EnterPrise应用(5) Security Application Block应用程序块 授权处理(VB.NET) Ajax实现无刷新三联动下拉框 ASP.NET 2.0打造购物车和支付系统之 一 ASP.NET 2.0打造购物车和支付系统之二 通过样式表实现固定表头和列 数字转换为大写人民币(附源码)_AX 使用RewritePath方法实现【不同路径+任意URL后缀重写到指定页面且URL地址不变】(附源码)_AX 基于.net开发平台项目案例集锦 效果直逼flash的Div+Css+Js菜单 一段非常简单的让图片自动切换js代码 ASP.NET弹出一个对话框 通过样式表实现固定表头和列 在VS2005中 GridView导入Excel的两点小技巧-附源码 asp.net 2.0 中GridView里设置日期格式 针对Enterprise Library 2.0的框架:OFrame预览(代码和工具全部开源) {asp.net2.0}##一个关于GridView的网站 障眼法--如何去掉动网新闻系统的版权信息 ASP.NET简单分页 NQL.NET 数据库对象查询语言简介 2 Asp.Net 学习资源列表 asp.net身份验证和授权 在VS2005中 GridView导入Excel的两点小技巧-附源码 [转载]Asp.Net 2.0 发布问题 权限树中Checkbox的操作[Asp.Net2.0] 如何于DataGridView控件中以跨数据行方式显示数据 asp.net2.0中,实现treeview中选择父级checkbox时,子级连动 整理转载 自定义DataGrid控件开源 [视频讲解]GridView里做链接实现新闻列表到详细内容页的跳转 『原创』以学论道之ASP.NET中的文件流操作 GridView控件自定义分页详解 3-tier Architecture with ASP.NET 2.0 : Tutorial By Scott Mitchell TreeViewVisitor: 一个快捷访问 TreeView 控件节点的帮助类 基于功能(代码)的权限管理 一步一步学习ObjectDataSource控件--自定义分页排序 自己编写的操作实体类的分页控件, 实现页码层与数据库的具体的信息隔离 Alexa世界排名原理+作弊源码,为网站赢得好排名 Ajax实现无刷新树 GridView 批量删除,自定义分页,定位页码 关于GridView中自定义分页、单选、多选、排序、自增列的简单应用 Ajax实现无刷新三联动下拉框 GridView模版列嵌套GirdView显示主从表数据 Ajax无刷新实现图片切换特效 asp.net 2.0 用户管理功能结构 Asp.Net2.0权限树中Checkbox的操作 Membership学习(二)membership入门[xgluxv] Membership学习(三)Membership Providers介绍[xgluxv] Membership学习(一) Membership介绍[xgluxv] Membership学习(四)-自定义MembershipProvider Gridview中当设置自动生成列时对列中字段使用 html代码显示 一点一点学ASP.NET之示例——HttpModule 示例 一个三层架构的WinForms程序的完整范例(.NET 1.1/Northwind) 发布XenoCode 2006 for DotNet 2.0破解程序 一个简单的存储过程 Css2快速参考 在b/s开发中经常用到的javaScript技术 NHibernate的灵活配置 搭建基于ASP.NET 2.0的DNN 4.X模块开发环境及模块实例(2) 搭建基于ASP.NET 2.0的DNN 4.X模块开发环境及模块实例(1) 发布一个支持大量文本打印的PrintDocument派生对象,公开源代码。 史上最全的Windows进程详解! PetShop4.0学习第一天 删除前的确认窗口 我对图形变换滤镜的收集(CSS渐变滤镜大全) 2006年it人士必去的10个网站 DataReader应用小示例(数据库访问操作的基本过程2.0通过) (收藏)抓取Web网页数据分析 GridView/DataGrid单元格不换行的问题 如何在GridView中使用DataFromatString VS2005新控件之GridView 使用高级技巧系列[一][视频] VS2005新控件之GridView 使用高级技巧 几个.Net开源的CMS、Portal系统 gridview中加弹出窗口用例 GridView&DetailsView对XML文件增删改 [译]Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化 初谈ADO.NET中利用DataAdapter进行数据操作 单一登录 Web 应用程序的企业级安全系统 发布XenoCode 2006 for DotNet 2.0破解程序 IBatisNet+Castle构架开发指南 IBatisNet+Castle构架开发指南 (续) 附代码生成模板 GridView根据值的变化改变行列样式 使用ASP.NET 2.0中的GridView控件 我积累的数据库操作类(ASP.NET) 我积累的数据库操作类(ASP.NET) 我积累的数据库操作类(ASP.NET) GridView 控件编程的事件 css+div布局总结--新手入门 15分钟内快速构建数据访问层(翻译) Transact_SQL小手册(各种sql语句大集合) Exports datatable to CSV or Excel format [转贴]开发VS2005下ComboBoxTreeView(下拉列表框弹出树) 与ToolStripComboBoxTreeView(下拉列表框工具条弹出树) 使用配制文件定制身份验证和基于角色的安全 一句SQL得出表中重复的数据(TMP) SQL精妙语句 Asp.net2.0:如何使用ObjectDataSource(配合ORM) Sql Server数据库的备份和恢复措施 SQL Server2000数据库文件损坏时如何恢复 存储过程编写经验和优化措施 (转) 征集佳句-精妙SQL语句收集 利用WebBrowser彻底解决Web打印问题 各种sql语句大集合 自定义用户访问权限 DataGrid导出excel和word的例子 具有滚动条的div SQL Server 2005 Express 附加的数据库为“只读”的解决方法 Sql 导入/导出Excel 不走寻常路 设计ASP.NET应用程序的七大绝招 ASP.NET性能优化 ASP.NET性能优化 对数据库Sql Server常用操作类库SQLHelper 如何取出treeview中checkbox的值 海量数据库的查询优化及分页算法方案 使用配制文件定制身份验证和基于角色的安全 VS2005新控件之GridView 使用高级技巧系列[二][视频] 一条经典的汇总的sql sql Server 索引优化 (转) Log4Net使用指南 一些有用的sql语句实例 Enterprise Library 2.0 -- Data Access Application Block 在Excel中将连续多列相同数据项合并 执行SQL存储过程事事例 SQL宝典 SQL语句导入导出大全(轉,收藏用)
gridview中手工排序 Asp.net 项目中引入Nhibernate 入门(一) 利用asp.net 2.0的客户端回调功能制作下拉框无限级联动 一个 NHIBERNATE+GRIDVIEW 添加删除修改的例子(单表) IBatisNet基础组件 用javascript将数字转换为中文大写 asp.net的TextBox回车触发事件 利用Sql作业在asp.net 里面实现异步调用存储过程. 抓取Web网页数据分析 VS2005中如何动态设置数据库连接信息? GridView控件修改、删除示例(修改含有DropDownList控件) JavaScript有用的代码,摘抄自:http://bbs.tech.163.com/board/rep.jsp?b=tech10&i=1296&p=0[转] 一些sql语句的详细解释 DataGrid使用心得(附大量代码) [转] SQL Server中各个系统表的作用 使用 Web Services Enhancements 2.0 的基于角色的安全性 Flash+asp.net打造FLASH首页新闻发布 SQL存储过程事务和优化方法(包括查询方式语句结合) 小记存储过程中经常用到的本周,本月,本年函数 GridView Css ASP.NET 2.0 Language Swithcer and Theme Swiche ASP.net2.0学习资料汇总 触发器与约束的适用条件 GRIDVIEW 中当数据行数未满时,填充空白行 ComponentArt Web.UI for ASP.NET 2.X序列号 创建用于监视对student表进行插入和更新操作的触发器 20060516: 实现圆角div效果 .net绝对技术资料 sql server2000中使用convert来取得datetime数据类型样式(全) 一些sql 语句(行列转换等) [转载] Owc的使用---自己封装好的类可以实现14种分析图 非常經典的WEB列印方案 CuteEditor 5.0 的使用 ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) MD5算法的T-SQL实现 ASP.NET2.0中数据源控件之异步数据访问 DotNetGrid 控件下载 DotNetGrid 介绍 WEB打印-------我的搜集 在校生数据导入范例 关于多极分类的几个存储过程 一个 NHIBERNATE+GRIDVIEW 添加删除修改的例子(单表) 树形数据查询示例 转 SQL Server 数据库管理常用的SQL和T-SQL语句 IIS状态代码的含义 .NET平台下带权限控制的TreeView控件节点生成算法(转载) 实现HTTP内容的抓取 给SQL Server存储过程,传送数组参数的变通办法 在.net中使用Fckeditor [转] SQL的3种连接查询 海量数据库的查询优化及分页算法方案 [转] transact---sql高级查询(下) [转] transact---sql高级查询(上) SQL Server数据库开发的二十一条军规 Excel编程 存储过程语法 SQL 语法参考手册 ASP.NET之精通弹出窗口 在网页中插入视频播放代码全集 无限级分类的实现 资源名称资源名称取得汉字字符串的拼音首字母的mssql函数 树_ajax 树_ajax GridView与DataGrid中的数据项访问差别 Gridview中onmouseover的效果 ASP.NET2.0+SQL Server2005构建多层应用(转载) 修正过的通用分页存储过程 [推荐]网络上通用的调查答卷系统-XML做数据库(将DataSet转化成字符串) MS-SQL数据库开发常用汇总 在visualStudio里面使用SqlServer2000作为数据源 获取影响行数和ID的存储过程 C# .Net中的类型转换 C#.net常用函数 SQL注入 FCKeditor2.2+ASP.NET2.0不完全攻略 FCKeditor2.2+ASP.NET2.0不完全攻略 【转贴】datagrid数据导出到excel文件给客户端下载的几种方法 GridView动态生成模板列 关于树形控件 asp.net 备份和恢复SQL SERVER 数据库 Asp.net(C#)实现验证码功能 Asp.NET程序中常用的三十三种代码 分割以逗号作为分割符号的字符串并插入到表中 列出一个表中的某个字段重复的记录 DataGrid系列技巧(导出excel,事件,多种方式呈现数据,全选全删)等等等 把以"文本文件(制表符分割)"保存的EXCEL文件导进SQLSERVER2000的DEMO! 总结:ADO.NET在开发中的部分使用方法和技巧 (转贴) DATAGRID的全选/取消全选控制(CHECKBOX) 使用SqlBulkCopy类加载其他源数据到SQL表 使用SqlBulkCopy类加载其他源数据到SQL表 使用SqlBulkCopy类加载其他源数据到SQL表 一个调查实例<主要训练向panel中添加控件>包括全部代码 ASP.NET 2.0客户端回调的实现分析(3)[ZT] [原创]把SQL的动态查询改成SQL查询 SQL Server实用经验技巧集 使用 DataAdapter 执行批量更新 treeview的建立,更新,删除 C#实现web信息自动抓取 [收藏].net关于企业Excel报表的生成 将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005(转) .NET进销存系统开发笔记------之Gridview应用 .net 2.0中GridView无限级嵌套的实现 导入Excel电子表格数据到SQLSever数据库的另一种方法 一个购物车的简单实现(多层开发) ASP.NET2.0中 TreeView 和ORACLE 数据绑定的一种方法 ASP.NET2.0 ObjectDataSource的使用详解(2) ASP.NET2.0 ObjectDataSource的使用详解(1) 将DataSet更新自动提交到数据库工具类实现 超强扩展性的DNN-DotNetNuke模块功能分类列表(from 中国DNN) 世界上主要的一些搜索引擎 Survey Admin 示例:实现 Microsoft .NET 基于角色的安全性(转) NHibernate Step by Step (四)Session、Query及HQL NHibernate Step by Step (三) Configuration和Sessionfactory Microsoft .NET Pet Shop 4 架构与技术分析 PetShop的系统架构设计 Asp.Net 2.0 TreeView的Checkbox级联操作 无废话-SQL Server 2005新功能(1) - TSQL 导出导入Excel(DataSet,DataGrid) DNN开发中的一些细节(1) DNN开发中的一些细节(2) ASP.NET2.0: Ilungasoft.Framework.Web之基于Callback的无刷新上传进度条控件[带源码] TreeView 爱恨之间 Transact SQL 常用语句以及函数 Transact SQL 常用语句以及函数 ASP.NET 2.0 正式版中无刷新页面的开发 DNN开发中的一些细节(1) ASP.NET2.0快速入门--高级数据方案(3) 结合CodeSmith开发和调试DNN3模块 SqlDataSource WEB控件:当DeleteCommandType="storedProcedure"时 关于TreeView控件专题 利用Treeview做权限树的一种方法 利用Treeview做权限树的一种方法 (新)在ASP.NET中调用存储过程传参数 ASP.NET2.0快速入门系列--高级数据方案(上) ASP.NET2.0快速入门--高级数据方案(中) asp/asp.net中遍历树型结构. ASP.NET 2.0中使用multiview控件 ASP.NET2.0快速入门系列--高级数据方案(上) DataGrid,GridView和DetailsView中添加删除确认提示 VS2005中用Code Snippets提高开发效率 IIS和ASP.NET2.0 关于vs 2005的一个问题, 解决The path "xxxx' maps to a directory outside this application, which is not supported. VS2005第一天 Failed to access IIS metabase 无ASPX文件部署(续) ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署 对vs2005生成dll文件的一点疑惑 ASP.NET 2.0 新特性 WEB Service 下实现大数据量的传输 switch your web application project to use development machine's IIS server [ASP.NET 2.0 Security FAQs]如何设置SQL Server或SQL Express数据库,使其支持Membership、Profiles和Role 将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005(转载) GridView 控件使用不完全指南! 【原创】asp/asp.net中遍历树型结构. .NET Pet Shop 4.0案例研究预览篇 关于树形结构的研究的资料收集 单点登录(SSO)的核心--kerberos身份认证协议技术参考(三) Gridview:在进入编辑模式后动态添加控件 ASP.NET中大结果集的分页[翻译] Asp.Net Forums研究文章集合(收藏) ASP.NET2.0中Gridview中数据操作技巧 SQL Server中利用存储过程来高性能地进行分页 关于二级域名Cookie的问题及解决方法 一步一步建网-2-DotNetNuke4-5/6-杂项/感! 通过系统配置来提高ASP.NET应用程序的稳定性 GridView 控件使用不完全指南!(续一) ASP.NET应用程序的部署--兼谈aspnet_compiler.exe命令 RDLC报表(一) RDLC报表(七) GridView 控件使用不完全指南! DNN皮肤制作 一个登陆页面,包含了初始化用户,输入检测,错误处理等 DNN皮肤制作 基于dotnetnuke的网站全新上线! [导入]DotNetNuke Skin 與 Container 設計介紹 CodeSmith3.0开发资料下载 CodeSmith开发系列资料总结 提高SQL执行性能方案:如何让你的SQL运行得更快zt Visual Studio 2005 的101个示例下载 网络数据库挖掘程序的设计 对联广告代码效果大全 网站生成静态页面,及网站数据采集的攻、防原理和策略 [原创]终极防范SQL注入漏洞! 【先锋海盗类】Ver2005 完美版 拿别人的新闻来用,虽然我知道这样不好,还是用了。。。 网页小偷程序ASP.net 数据采集程序(网页小偷)点滴心得 部署安装时写入SQL SERVER和Web.config 将博客园程序从Visual Studio 2003迁移到Visual Studio 2005的尝试 开篇:Nhibernat.Test项目分析之:ConfigurationTest 基于NHibernate的三层结构应用程序开发初步 15分钟内快速构建数据访问层(翻译) Asp.net 2.0专题二:本地化(Localization) 数据库应用基础系列 深入了解 SQL Server 2000 与 ADO.NET 中的事务隔离及数据锁定 第2章 并发操作的一致性问题 (2) 在asp.net 2.0中使用SqlBulkCopy类迁移数据 使用asp.net 2.0和SQL SERVER 2005构建多层应用 推荐个关于 team system教学的好站点 推荐个关于 team system教学的好站点 DataList控件也玩分页- - SQL Server 两个触发器例子,大家看看怎么样? 发布一个原创的基于Ajax的通用(组合)查询(续) 在IIS6.0下ASP .NET 的版本冲突问题 FCKeditor应用小记--起步篇 WEB Service 下实现大数据量的传输 55种网页常用小技巧(转载) [转]Microsoft PetShop 3.0 [转载]用WSE在Web服务中验证用户身份 一次SQL Server 2000修复实践的说明 新数据网格DataGridView简介(转自MSDN) [转贴]Visual Studio 2005常用插件搜罗 第 4 章 构建以数据为中心的应用程序 网 站 策 划 [转载] 在.net安装程序部署SQL Server数据库 [转载] 在.net安装程序部署SQL Server数据库 ASP.NET程序中常用代码汇总(一)(转载) ASP.NET程序中常用代码汇总(二)(转载) ASP.NET程序中常用代码汇总(三)(转载) ASP.NET程序中常用代码汇总(四)(转载) ASP.NET程序中常用代码汇总(五)(转载) 露雨资源库(第一个.net2.0软件)二 ADO.NET 2.0 大批量数据操作和多个动态的结果集 继续发布VS2005下DataGridView 的多种样式列控件 一个支持asp.net2.0和Sql server及Access的免费空间 FAQ:关于aspspider.net的申请与使用(逐渐整理中) ASP.NET 2.0中的成员管理与角色管理 ASP.NET中用哪种方式表格化数据 DotNet软件开发框架 知识管理系统分析之一:网络蜘蛛的分析 如何实现在Asp.net下XP风格的下拉菜单 CodeSmith基础(二) CodeSmith开发系列资料总结 利用 SharpZipLib方便地压缩和解压缩文件 GridView控件使用经验 一个支持asp.net2.0和Sql server及Access的免费空间 新版XNet.SqlHelper 使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200 FreeTextBox使用详解 (版本3.1.1) Web Services的身份验证 [小结]关于asp.net个性化站点的设置 网络数据库挖掘程序的设计 使用企业程序库的两点体会 ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu ) 如何使网站基于CA认证访问 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 一完美的关于请求的目录不存在而需要url重写的解决方案! 如何建立有效的.Net软件注册保护机制 常用CSS ASP.NET程序中常用代码汇总(五) ADO.NET 2.0 大批量数据操作和多个动态的结果集 在Apache环境下成功的运行ASP.NET 使用ADO.net转换数据到Excel格式并提供下载 打开一个Excel模板文件填充数据另存为一个文件 一个关于DataGrid的打印类,分享,感谢作者 把excel 数据导入数据库 NHibernate文档翻译 第5章 集合类(Collections)映射 NHibernate文档翻译 第4 章 O/R Mapping基础 关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 自动代码生成器 Enterprise Library Step By Step系列(十一):异常处理应用程序块——入门篇 Enterprise Library Step By Step系列(十):缓冲应用程序块——进阶篇 Asp.net中DataGrid利用DataRelation显示主从表信息(可控制从表信息隐藏和显示). Cookie 支持二级域名和FormsAuthentication 加强版 aspx->cs->dll 无aspx文件部署 无ASPX文件部署(续) asp.net报表解决方法(第一次使用cnblogs的blog) NHibernate文档翻译 第3章 持久化类(Persistent Classes) 《ASP.NET办公自动化系统开发实例导航》笔记三 人事管理模块 [转]Microsoft PetShop 3.0
《ASP.NET办公自动化系统开发实例导航》笔记二 系统管理模块设计 《ASP.NET办公自动化系统开发实例导航》笔记一 NHibernate文档翻译 第2章 ISessionFactory配置 TreeView常用操作 NHibernate文档翻译 第1章 体系结构 关于ASP.NET中调用Excel组件不能结束进程的解决方法 用ActiveX控件和JavaScript脚本实现基于Web的票据套打(源码下载) 搜索引擎, 请手下留情 我写的Asp.net操作Excel的一个类库ExcelHelper(源码下载) Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇 一个经典的ADO.NET入门例子(CSDN博客迁移) [源代码]系统框架NickLee.Framework.V1.X for asp.net asp.net利用OWC生成分析報表 把aspx文件编译成DLL文件 ADO.NET 2.0 大批量数据操作和多个动态的结果集 让.Text的搜索引擎支持二级域名 微软技术大会 Tech.Ed2005 所有讲义(ppt格式)下载地址 应用系统架构设计 应用系统架构设计-补全篇 简单实用的DATAGRID组件 .Text 支持二级域名之二 Cuyahoga的安装及结构 也nhibernate会遇到问题,还好找到原因了 [C#]NHibernate处理多帐套问题 滚动DataGrid 蛙蛙推荐:迎接web2.0:写一个RSS.HTC组件 分享:微软提供的一个开源控件treeview 的一小个用法 发布一个原创的基于Ajax的通用(组合)查询(续) 在ASP.NET页面中冻结DataGrid的列或头部 Cuyahoga代码的研究之一:Cuyahoga.Corel项目 Cuyahoga研究三:用户配置数据的处理 Cuyahoga研究之二:利用MD5CryptoServiceProvider返回字符串的MD5 Hash值 [精华&原创]可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) Asp.net中把DataTable或DataGrid导出为Excel 技巧百问(5):打造超级浮动广告(不受屏幕限制) 使用HttpModule实现多个域名分别“绑定”到子目录 利用XML实现通用WEB报表打印 续:利用XML实现通用WEB报表打印(实现篇) 昨天的性能优化与今天的网站故障 一个关于DataGrid的打印类,分享,感谢作者 把文件上载到数据库中 .Text分页技术(1)分页的存储过程分析 Community Server专题十:MemberRole之RoleManager 构建动态导航的Web应用程序 SQL Server 用触发器实现表的历史记录 SQL Server 用触发器实现表的历史记录 WEB打印大全 asp.net操作Excel总结 VC++开发BHO插件——定制你的浏览器 作者 陆其明 如何实现在Asp.net下XP风格的下拉菜单 使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同(很久没来了 作为国庆礼物给大家了) Js控制ASPX页面刷新的土办法 代码生成工具之MyGeneration 初次体验.net Ajax无刷新技术 Community Server专题八:MemberRole之Membership 应用IBatisNet+Castle进行项目的开发 .Net PetShop3.0的数据访问技术及其改进 Community Server专题七: Job & Timer 使用企业库在某些站点会报试图执行安全策略不允许的操作异常的解决方法。 刚注册,先转发一片文章:在 ASP.NET 中执行 URL 重写 利用asp.net 2.0构建企业级门户平台(1、设计思想) 利用asp.net 2.0构建企业级门户平台(2、实现页面请求的调度) 报表的开发利器-ExcelQuicker ExcelQuicker模板功能的高级应用示例——薪资报表 SQL Server未公开的两个存储过程 WSE--简介(一) .net WebControl 处女作,用于导航的Tree控件(不敢说用起来最简单也算得上非常简单,呵呵) xml数据岛,xsl,javascript,asp.net 的结合使用 web 程序模仿 windows 资源管理器 用CodeSmith生成数据库实体类的代码 .NET中统一的存储过程调用方法(收藏) TreeView常用操作 NHibernate学习 NHibernate学习 给SQL Server存储过程,传送数组参数的变通办法 Community Server专题二:体系结构 权限设计(二) 通用分页存储过程 N-Tier Server/(Smart)Client 应用程序的设计和开发 基于身份验证票据的权限系统的实现之源代码篇 Enterprise LibraryV1.0-数据应用程序块 共享自动生成DTO/DataAccess/BizObject的CodeSmith模板 一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字 Forms验证中的roles 跨页面的多选功能实现 简单说一下我对这个CRM系统的设计方案哦 把你的Access数据库嵌入到资源中发布 对象界面映射(UI Mapping)——Mustang1.0.0.0写完了!!! 蛙蛙推荐:利用OWC创建图表的完美解决方案 SQLServer 工具箱v1.3(SQL脚本排序,日志清除,数据导入导出)附完整源代码 从WEB SERVICE 上返回大数据量的DATASET 批量字符串替换程序 install shield X 打包 .net Framework ASP.NET直接下载一个文件,而不是在IE中打开它 实现GridView控件的删除多条记录功能系列(1) ComponentArt WebUI For asp.nET 2.1,So Good Asp.nET UI Control! 实现GridView控件的删除多条记录功能系列(2) 博客园 Google广告 开源项目 实现GridView控件的删除多条记录功能系列(3) ICSharpCode的SharpZipLib最新0.84版本 SmartDBForge-智能数据库工厂 2005预览版:自动化生成数据库文档、SQL脚本、实体类等,支持多种数据库 提供一个实体类生成工具. T-SQL 存储过程: (20050802修订版) 根据基本表结构及其数据生成 INSERT INTO ... 的 SQL 关于单点登陆的一些问题 蛙蛙推荐:微软MSDN导航菜单演示(Javascript+CSS2) 蛙蛙推荐:远程抓取网页到本地数据库.doc CuteEditor破解手记 [分享]FCKEDITOR范例及中文使用说明 [DNN模块开发]模块的文件结构及命名方法 用好CodeSmith,提高生产力,CodeSmith技术原理初探. Smart Client学习体会(一) 优秀.net 控件包介绍 应用系统架构设计 如何在删除并重新安装 IIS 之后修复 IIS 映射 五种常见的ASP.NET安全缺陷 “他说,你那样做,太累,而且如果字段变了,还要维护” 纯脚本搞掂DataGrid表表头不动,表身滚动。 DataGrid分页中文效果,与大家共享,顺便有能者把DropDownList的触发找到。我是放在呈现上。 基于文件格式的DataGrid多媒体播放示例(带表头自动排序,动态播放列表功能) Office自动化开发中的事件编程 ExcelQuicker模板功能的高级应用示例——薪资报表 抄:JavaScript实用技巧集锦 [分享]新封装的一个实现无刷新连动下拉列表类(最新版本) 新鲜出炉,几分钟以前刚刚完成,一个带自定义分页,排序功能的DATAGRID控件(公开源码) C#操作Excel,套用模板并对数据进行分页 Asp.Net Forums与现有系统整合方案示例 存储过程中的事务实现 基于Active Directory的用户验证 Sql server数据库记录修改追踪和恢复的解决方案 SQL Server最新补丁与工具大全--数据库管理员必看 介绍一种Web上打印技术 表单验证代码(转载) 在Webpart中以Post方式提交数据到SharePoint站点 ASP.NET2.0中用Gridview控件操作数据 一个有用的oracle数据库访问封装类 【经验分享】海量数据高性能分页新法 MSDN: 设计数据层组件并在层间传递数据 真的需要在.NET中使用WIN32 API的朋友,这里是你的宝库 服务器升级安装操作备忘[原创] WEB柱状图和折线图控件,大家应急时可以用用 RapidTier 1.0 beta2 发布 关于设置WebControls里的treeview控件的图片路径 两分钟让你明白什么是ERP! 权限控制理论及实现 纯脚本搞掂DataGrid表表头不动,表身滚动。 NHibernate 使用手迹(2nd) ASP.NET服务器控件开发简介: ComboBox [开放源代码] 用存储过程生成单据号 [开源论坛]StellaForum v 2.0 公开 NHibernate使用的问题 使用NHibernate时需要考虑的另一个问题 使用 DataAdapter 和 DataSet 更新数据库 绝对适合您的DataPropertyGrid! 关于BI Portal(一) 也谈log4net 1.2.9 beta的使用(web 项目) datagrid(webform)批量操作的一些思路。 将TreeView存储、写入数据库的扩展类TreeViewEx 一句SQL语句解决倒序数据分页提取 一个 TreeView 的派生类: TreeViewEx 实现 NodeShowToolTip、NodeDoubleClick 事件 解放程序员的验证输入(II) 用好CodeSmith,提高生产力,CodeSmith技术原理初探. 最近开发一个SQL server大数据量统计系统的经验总结 SQL语言高级技法演练 动态载入数据的无刷新TreeView控件(5) 动态载入数据的无刷新TreeView控件(4) 在ASP.Net中两种利用CSS实现多界面的方法. SQL Server数据汇总完全解析 asp.net学习资源列表 将TreeView存储、写入数据库的扩展类TreeViewEx .NET平台下WEB应用程序的部署(安装数据库和自动配置) 在sql语句中替换Not In 的方法 创建新的企业级模板 SQL Server游標應用技巧一例 送给所有还未买房的技术朋友们——住房按揭贷款计算器 基于Wiki的网络协作/知识积累试验平台 快过年回家了,发点实用的东西给大家 .NET商业应用架构所要解决的若干问题(原创) 企业设计模式读书笔记 Domain Model MAVERICK.NET初窥(原创) 再谈SQL Server表与Excel、Access数据互导 使用Singleton改善ASP.NET性能备注 石头.net [杨 云] 也来说说asp.net页面之间传递数据 Vs ColdFusion 一套可嵌入或独立使用的翻页控件: WebPager(附源码) Rainbow分页解决方案 我对多类型用户的设计想法...... 为什么叫“老师” 和 “学生” 生成工具-CodeSmith-享受编程的乐趣(三) 生成工具-CodeSmith-享受编程的乐趣(二) 生成工具-CodeSmith-享受编程的乐趣(一) 在ASP.NET中使用NHibernate 代码阅读总结之ASP.NET StartKit TimeTracker(角色权限之捉虫笔记) 一个NHibernate应用的实际例子(A good open source project to learn how to use NHibernate) 客户自行更改了aspnet用户权限,结果整个网站不能用。查找了资料记录下来 数据分页显示大搜索 CNBlogs引用第三方组(控)件明细^_^ 使用HttpContext的User属性来实现用户验证 近音搜索,比较输入Z就可以搜索到拼音Z开头的汉字,搜索"浙江",只要输入"ZJ"就可以了 看了下面那篇“Crack别人应用程序”的文章有感,简述.Net下的应用程序授权。 子查询基础知识 我用Rainbow做网站 将TreeView存储、写入数据库的扩展类TreeViewEx Dottext中的配置 提高ASP.NET应用程序性能的几招方法 一定要记住:Page.IsPostBack 不能忘。。。 log4net 配置与应用 浅析《ASP.Net Web 站点高级编程》的登录验证! 开源的数据库组件 代码阅读总结之ASP.NET StartKit TimeTracker(角色权限) 老猫的理想开源小范例 [精华&原创]可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) IEWebcontrol webctrl_client目录配置 FMStocks7 , 不错的一个.NET 示例程序 感受DataGrid给数据操作带来的便利(4) 感受DataGrid给数据操作带来的便利(5) 中国DNN 的邀请 感受DataGrid给数据操作带来的便利(6) DotNetNuke(DNN)从入门到进阶(1)-怎样写自己的模块 如何实现文本框焦点自动跳转及通过回车键提交表单 如何使用一个不错的图表组件WebChart(免费) .NET下,你采用的是哪种方式进行数据操作? 两种不同情况的分页实现 .NET下,你采用的是哪种方式进行数据操作? 常用SQL说明 可以动态分页的存储过程 [专题]O/R 实体关系映射 我的IBatisNet的Demo DNN官方说明2 Duwamish代码分析篇 SQL Server数据库备份还原 通用分页SQL SQL过程自动C#封装,支持从表到基本存储过程生成, DNN的白皮书(官方说明) SQL Server自动备份的SP, 只要加上数据库名, 和路径即可. Rainbow中的不过期分页的文章Module 点击一个Button,来看Duwamish7的总体层次 我在研究的一些.net开源项目 回头看.Net的优点与进步 方便好用的 ASP.Net 错误记录发布模块 ELMAH (Error Logging Modules And Handlers) 我用Rainbow做网站 实现千万级数据的分页显示--整理资料并测试 小技巧之——服务器端变量与客户端JScript脚本变量的互操作。 Asp.net(C#)实现验证码功能 SQL 2000中的触发器使用 NHibernate 空气是哪么的清新,世界是多么的美好 NHibernate 做个小项目来试一下吧 三 NHibernate 做个小项目来试一下吧 四 (我们继续) 博客园的开源项目: Aop.NET DotNetAOP ibatis介绍[转贴] 使用open source产品组装你的web应用架构[转贴,只作为收藏,非本人原创] 发现不少免费、酷、强大组件(Win/Web) NHibernate 做个小项目来试一下吧 一 NHibernate 做个小项目来试一下吧 一 NHibernate 空气是哪么的清新,世界是多么的美好 用Nhibernate怎么实现数据的添加、删除、修改简单程序 利用webService做系统间数据整合 Rainbow的安装 我想问一下NHibernate的问题??? NHibernate学习第二天(在nhibernate中执行SQL语句 ) NHibernate学习第一天(数据的写入 Insert) 好久没有见到有人谈论代码生成器了 几个开源项目实体层实现方式比较 象使用DataGrid一样使用DataList(包含分页) 一个对众多CMS(内容管理系统)进行比较、评论的网站 在Windows下让不同用户使用不同的分辨率(C# 2005) 数据分页 DotNetNuke:如何创建自己的模块(FlashPlayer Module) SharpDevelop代码分析 (一、序+基本概念) 发布Asp.Net Forums V2 中文官方 10.1 国庆版 号外!激动人心的DotNetNuke(DNN)2.2x新特性最新汇报! DotNetNuke:制作属于我们自己的Skin sql server中分页获取数据的存储过程 轻量级的数据库访问类 DotNetNuke:自动升级功能(一) DNN第三方贡献 CodeProject上最近(2004-09-24)发现的几个好代码 使用Reflector工具解决问题 关于Rainbow的一些思考 FreeTextBox的ToolbarButton整理 web的用户验证方式 SqlServer通用存储过程的编写 我将msdn上一篇关于数据库打包的文章由vb改为cs拉,好久没发言了,希望这个东西对大家有用! DotNet(.Net)下构建高适应性的三层架构 DotNetNuke:自动升级功能(序) 关于PagedDataSource,非常好用的一个分页属性! IronPython的第一块鳞片 关于Rainbow的一些思考 柱状图改进版 CN.Text开发笔记—利用反射将数据读入实体类 布局和配色(Rainbow的Design目录) 存储过程编写经验三 存储过程经验二 扩展AdRotator控件,让它支持.SWF广告 (源码) 描述 Machine.Config 和 Web.Config(转载) sqlserver 海量数据导入的最快方法 Community 学习(C#版) DataGrid使用<2> 绑定checkbox [百万级]通用存储过程.分页存储过程. 实现千万级数据的分页显示! 今天把最近看DotNetNuke的心得写一些,希望对别人有所帮助 DNN(DotNetNuke)研究手札系列2-背景、现状 win2003优化大全 (转载) DNN(DotNetNuke)研究手札系列1-资源 DotNetNuke 2.1.2安装指南 DataGrid资料 DataGrid技巧大集合
asp.net速查手册
GridView/DataGrid单元格不换行的问题
如何在GridView中使用DataFromatString
VS2005新控件之GridView 使用高级技巧系列[一][视频]
VS2005新控件之GridView 使用高级技巧
几个.Net开源的CMS、Portal系统
gridview中加弹出窗口用例
GridView&DetailsView对XML文件增删改
[译]Scott Mitchell 的ASP.NET 2.0数据教程之十一: 基于数据的自定义格式化
初谈ADO.NET中利用DataAdapter进行数据操作
单一登录 Web 应用程序的企业级安全系统
发布XenoCode 2006 for DotNet 2.0破解程序
IBatisNet+Castle构架开发指南
IBatisNet+Castle构架开发指南 (续) 附代码生成模板
GridView根据值的变化改变行列样式
使用ASP.NET 2.0中的GridView控件
我积累的数据库操作类(ASP.NET)
我积累的数据库操作类(ASP.NET)
我积累的数据库操作类(ASP.NET)
GridView 控件编程的事件
css+div布局总结--新手入门
15分钟内快速构建数据访问层(翻译)
Transact_SQL小手册(各种sql语句大集合)
Exports datatable to CSV or Excel format
[转贴]开发VS2005下ComboBoxTreeView(下拉列表框弹出树) 与ToolStripComboBoxTreeView(下拉列表框工具条弹出树)
使用配制文件定制身份验证和基于角色的安全
一句SQL得出表中重复的数据(TMP)
SQL精妙语句
Asp.net2.0:如何使用ObjectDataSource(配合ORM)
Sql Server数据库的备份和恢复措施
SQL Server2000数据库文件损坏时如何恢复
存储过程编写经验和优化措施 (转)
征集佳句-精妙SQL语句收集
利用WebBrowser彻底解决Web打印问题
各种sql语句大集合
自定义用户访问权限
DataGrid导出excel和word的例子
具有滚动条的div
SQL Server 2005 Express 附加的数据库为“只读”的解决方法
Sql 导入/导出Excel
不走寻常路 设计ASP.NET应用程序的七大绝招
ASP.NET性能优化
ASP.NET性能优化
对数据库Sql Server常用操作类库SQLHelper
如何取出treeview中checkbox的值
海量数据库的查询优化及分页算法方案
使用配制文件定制身份验证和基于角色的安全
VS2005新控件之GridView 使用高级技巧系列[二][视频]
一条经典的汇总的sql
sql Server 索引优化 (转)
Log4Net使用指南
一些有用的sql语句实例
Enterprise Library 2.0 -- Data Access Application Block
在Excel中将连续多列相同数据项合并
执行SQL存储过程事事例
SQL宝典
SQL语句导入导出大全(轉,收藏用)
gridview中手工排序
Asp.net 项目中引入Nhibernate 入门(一)
利用asp.net 2.0的客户端回调功能制作下拉框无限级联动
给大家推荐一个我的开源项目: Permission Base
一个 NHIBERNATE+GRIDVIEW 添加删除修改的例子(单表)
IBatisNet基础组件
用javascript将数字转换为中文大写
asp.net的TextBox回车触发事件
利用Sql作业在asp.net 里面实现异步调用存储过程.
抓取Web网页数据分析
VS2005中如何动态设置数据库连接信息?
GridView控件修改、删除示例(修改含有DropDownList控件)
JavaScript有用的代码,摘抄自:http://bbs.tech.163.com/board/rep.jsp?b=tech10&i=1296&p=0
[转] 一些sql语句的详细解释
DataGrid使用心得(附大量代码)
[转] SQL Server中各个系统表的作用
使用 Web Services Enhancements 2.0 的基于角色的安全性
Flash+asp.net打造FLASH首页新闻发布
SQL存储过程事务和优化方法(包括查询方式语句结合)
小记存储过程中经常用到的本周,本月,本年函数
GridView Css
ASP.NET 2.0 Language Swithcer and Theme Swiche
ASP.net2.0学习资料汇总
触发器与约束的适用条件
GRIDVIEW 中当数据行数未满时,填充空白行
ComponentArt Web.UI for ASP.NET 2.X序列号
创建用于监视对student表进行插入和更新操作的触发器
20060516: 实现圆角div效果
.net绝对技术资料
sql server2000中使用convert来取得datetime数据类型样式(全)
一些sql 语句(行列转换等) [转载]
Owc的使用---自己封装好的类可以实现14种分析图
非常經典的WEB列印方案
CuteEditor 5.0 的使用
ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu )
MD5算法的T-SQL实现
ASP.NET2.0中数据源控件之异步数据访问
DotNetGrid 控件下载
DotNetGrid 介绍
WEB打印-------我的搜集
在校生数据导入范例
关于多极分类的几个存储过程
一个 NHIBERNATE+GRIDVIEW 添加删除修改的例子(单表)
树形数据查询示例
转 SQL Server 数据库管理常用的SQL和T-SQL语句
IIS状态代码的含义
.NET平台下带权限控制的TreeView控件节点生成算法(转载)
实现HTTP内容的抓取
给SQL Server存储过程,传送数组参数的变通办法
在.net中使用Fckeditor
[转] SQL的3种连接查询
海量数据库的查询优化及分页算法方案
[转] transact---sql高级查询(下)
[转] transact---sql高级查询(上)
SQL Server数据库开发的二十一条军规
Excel编程
存储过程语法
SQL 语法参考手册
ASP.NET之精通弹出窗口
在网页中插入视频播放代码全集
无限级分类的实现
资源名称资源名称取得汉字字符串的拼音首字母的mssql函数
树_ajax
树_ajax
GridView与DataGrid中的数据项访问差别
Gridview中onmouseover的效果
ASP.NET2.0+SQL Server2005构建多层应用(转载)
修正过的通用分页存储过程
[推荐]网络上通用的调查答卷系统-XML做数据库(将DataSet转化成字符串)
MS-SQL数据库开发常用汇总
在visualStudio里面使用SqlServer2000作为数据源
获取影响行数和ID的存储过程
C# .Net中的类型转换
C#.net常用函数
SQL注入
FCKeditor2.2+ASP.NET2.0不完全攻略
FCKeditor2.2+ASP.NET2.0不完全攻略
【转贴】datagrid数据导出到excel文件给客户端下载的几种方法
GridView动态生成模板列
关于树形控件
asp.net 备份和恢复SQL SERVER 数据库
Asp.net(C#)实现验证码功能
Asp.NET程序中常用的三十三种代码
分割以逗号作为分割符号的字符串并插入到表中
列出一个表中的某个字段重复的记录
DataGrid系列技巧(导出excel,事件,多种方式呈现数据,全选全删)等等等
把以"文本文件(制表符分割)"保存的EXCEL文件导进SQLSERVER2000的DEMO!
总结:ADO.NET在开发中的部分使用方法和技巧 (转贴)
DATAGRID的全选/取消全选控制(CHECKBOX)
使用SqlBulkCopy类加载其他源数据到SQL表
使用SqlBulkCopy类加载其他源数据到SQL表
使用SqlBulkCopy类加载其他源数据到SQL表
一个调查实例<主要训练向panel中添加控件>包括全部代码
ASP.NET 2.0客户端回调的实现分析(3)[ZT]
[原创]把SQL的动态查询改成SQL查询
SQL Server实用经验技巧集
使用 DataAdapter 执行批量更新
treeview的建立,更新,删除
C#实现web信息自动抓取
[收藏].net关于企业Excel报表的生成
将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005(转)
.NET进销存系统开发笔记------之Gridview应用
.net 2.0中GridView无限级嵌套的实现
导入Excel电子表格数据到SQLSever数据库的另一种方法
一个购物车的简单实现(多层开发)
ASP.NET2.0中 TreeView 和ORACLE 数据绑定的一种方法
ASP.NET2.0 ObjectDataSource的使用详解(2)
ASP.NET2.0 ObjectDataSource的使用详解(1)
将DataSet更新自动提交到数据库工具类实现
超强扩展性的DNN-DotNetNuke模块功能分类列表(from 中国DNN)
世界上主要的一些搜索引擎
SQL Server 数据库管理常用的SQL和T-SQL语句
Transact SQL 常用语句以及函数[个人推荐]
Survey Admin 示例:实现 Microsoft .NET 基于角色的安全性(转)
NHibernate Step by Step (四)Session、Query及HQL
NHibernate Step by Step (三) Configuration和Sessionfactory
Microsoft .NET Pet Shop 4 架构与技术分析
PetShop的系统架构设计
Asp.Net 2.0 TreeView的Checkbox级联操作
无废话-SQL Server 2005新功能(1) - TSQL
导出导入Excel(DataSet,DataGrid)
DNN开发中的一些细节(1)
DNN开发中的一些细节(2)
ASP.NET2.0: Ilungasoft.Framework.Web之基于Callback的无刷新上传进度条控件[带源码]
TreeView 爱恨之间
Transact SQL 常用语句以及函数
Transact SQL 常用语句以及函数
ASP.NET 2.0 正式版中无刷新页面的开发
DNN开发中的一些细节(1)
ASP.NET2.0快速入门--高级数据方案(3)
结合CodeSmith开发和调试DNN3模块
SqlDataSource WEB控件:当DeleteCommandType="storedProcedure"时
关于TreeView控件专题
利用Treeview做权限树的一种方法
利用Treeview做权限树的一种方法
(新)在ASP.NET中调用存储过程传参数
ASP.NET2.0快速入门系列--高级数据方案(上)
ASP.NET2.0快速入门--高级数据方案(中)
asp/asp.net中遍历树型结构.
ASP.NET 2.0中使用multiview控件
ASP.NET2.0快速入门系列--高级数据方案(上)
DataGrid,GridView和DetailsView中添加删除确认提示
VS2005中用Code Snippets提高开发效率
IIS和ASP.NET2.0
关于vs 2005的一个问题, 解决The path "xxxx' maps to a directory outside this application, which is not supported.
VS2005第一天 Failed to access IIS metabase
无ASPX文件部署(续)
ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu )
ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf部署
对vs2005生成dll文件的一点疑惑
ASP.NET 2.0 新特性
WEB Service 下实现大数据量的传输
switch your web application project to use development machine's IIS server
[ASP.NET 2.0 Security FAQs]如何设置SQL Server或SQL Express数据库,使其支持Membership、Profiles和Role
将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005(转载)
GridView 控件使用不完全指南!
【原创】asp/asp.net中遍历树型结构.
.NET Pet Shop 4.0案例研究预览篇
关于树形结构的研究的资料收集
单点登录(SSO)的核心--kerberos身份认证协议技术参考(三)
Gridview:在进入编辑模式后动态添加控件
ASP.NET中大结果集的分页[翻译]
Asp.Net Forums研究文章集合(收藏)
ASP.NET2.0中Gridview中数据操作技巧
SQL Server中利用存储过程来高性能地进行分页
关于二级域名Cookie的问题及解决方法
一步一步建网-2-DotNetNuke4-5/6-杂项/感!
通过系统配置来提高ASP.NET应用程序的稳定性
GridView 控件使用不完全指南!(续一)
ASP.NET应用程序的部署--兼谈aspnet_compiler.exe命令
RDLC报表(一)
RDLC报表(七)
GridView 控件使用不完全指南!
DNN皮肤制作
一个登陆页面,包含了初始化用户,输入检测,错误处理等
DNN皮肤制作
基于dotnetnuke的网站全新上线!
[导入]DotNetNuke Skin 與 Container 設計介紹
CodeSmith3.0开发资料下载
CodeSmith开发系列资料总结
提高SQL执行性能方案:如何让你的SQL运行得更快zt
Visual Studio 2005 的101个示例下载
网络数据库挖掘程序的设计
对联广告代码效果大全
网站生成静态页面,及网站数据采集的攻、防原理和策略
[原创]终极防范SQL注入漏洞!
【先锋海盗类】Ver2005 完美版
拿别人的新闻来用,虽然我知道这样不好,还是用了。。。
网页小偷程序ASP.net
数据采集程序(网页小偷)点滴心得
部署安装时写入SQL SERVER和Web.config
将博客园程序从Visual Studio 2003迁移到Visual Studio 2005的尝试
开篇:Nhibernat.Test项目分析之:ConfigurationTest
基于NHibernate的三层结构应用程序开发初步
15分钟内快速构建数据访问层(翻译)
Asp.net 2.0专题二:本地化(Localization)
数据库应用基础系列
深入了解 SQL Server 2000 与 ADO.NET 中的事务隔离及数据锁定
第2章 并发操作的一致性问题 (2)
在asp.net 2.0中使用SqlBulkCopy类迁移数据
使用asp.net 2.0和SQL SERVER 2005构建多层应用
推荐个关于 team system教学的好站点
推荐个关于 team system教学的好站点
DataList控件也玩分页- -
SQL Server 两个触发器例子,大家看看怎么样?
发布一个原创的基于Ajax的通用(组合)查询(续)
在IIS6.0下ASP .NET 的版本冲突问题
FCKeditor应用小记--起步篇
WEB Service 下实现大数据量的传输
菜单控件
55种网页常用小技巧(转载)
[转]Microsoft PetShop 3.0
[转载]用WSE在Web服务中验证用户身份
一次SQL Server 2000修复实践的说明
新数据网格DataGridView简介(转自MSDN)
[转贴]Visual Studio 2005常用插件搜罗
第 4 章 构建以数据为中心的应用程序
网 站 策 划
[转载] 在.net安装程序部署SQL Server数据库
[转载] 在.net安装程序部署SQL Server数据库
ASP.NET程序中常用代码汇总(一)(转载)
ASP.NET程序中常用代码汇总(二)(转载)
ASP.NET程序中常用代码汇总(三)(转载)
ASP.NET程序中常用代码汇总(四)(转载)
ASP.NET程序中常用代码汇总(五)(转载)
露雨资源库(第一个.net2.0软件)二
ADO.NET 2.0 大批量数据操作和多个动态的结果集
本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2008/01/20/1045957.html,如需转载请自行联系原作者
iBATIS In Action:执行非查询语句(二)
本章内容包括
iBATIS API的更多内容
插入数据
更新和删除数据
使用存储过程
5.3 更新和删除数据
至此,我们已经学习了如何向数据库插入数据以及获取相应记录的键值,再来看看如何更新和删除数据。
Insert方法返回的是object类型的值,而Update和Delete方法则返回int类型的值,该值指示了更新或删除语句所影响的记录数。
iBATIS框架允许使用单条语句操作一条或多条记录。这是它与大多数ORM工具不同的地方之一,后者一般只能修改单条记录。
5.3.1 并发更新处理
iBATIS目前尚未实现的一个功能是锁定记录以管理对相同数据的并发修改。有几种技术可用来处理并发更新,如在数据行上使用时间戳或者版本号。比如,有如下一个account表,定义为:
CREATE TABLE account (
accountid serial NOT NULL,
username varchar(10),
passwd varchar(10),
firstname varchar(30),
lastname varchar(30),
address1 varchar(30),
address2 varchar(30),
city varchar(30),
state varchar(5),
postalcode varchar(10),
country varchar(5),
version int8,CONSTRAINT account_pkey PRIMARY KEY (accountid)
)
我们可以在更新数据的时候增加version列,在update语句的where子句使用accountId和version两个字段。在执行更新操作时,如果要更新的记录未被其它用户修改,那么更新会得以成功地执行,因为版本号未被改变,映射语句也可返回期望的记录数。如果返回的是0,而且未抛出任何异常,那么您就该知道,其他人已经修改了记录。下一步如何处理就由您来决定了。
5.3.2 更新和删除子项记录
在一个对象模型系统中,不难找到一些包含子对象的组件(component)。例如,一个Order对象可能会包含一个OrderItem类型的列表(list)或数组(array),这些子对象表示订单的细项。
因为iBATIS主要是一个SQL映射工具,它不能在更新数据库时去管理这种关系。这样,这种功能就必须由您程序的数据访问层而不是iBATIS来处理了。而其实现代码相当简单:
public void SaveOrder(Order order)
{
if (null == order.OrderId)
{
sqlMapper.Insert("Order.insert", order);
}
else
{
sqlMapper.Update("Order.update", order);
}
sqlMapper.Delete("Order.deleteDetails", order);
for(int i = 0; i < order.OrderItems.Count; i++)
{
OrderItem oi = order.OrderItems[i];
sqlMapper.Insert("OrderItem.insert", oi);
}
}
这段代码能够实现功能,但它没有提供任何事务机制,因此如果最后一个OrderItem失败,那么所有的其它数据则处于不一致的状态,因为事务只能处理每一次插入和更新操作。此外,性能也是个问题,因为每条的执行都会立即提交。在下节中,您将了解如何使用批量更新技术来解决上述的两个问题(即事务和性能)。
5.4 执行批量更新
译注:在iBATIS.NET中并未提供与此等价的功能,不过园子里的Zealic提供了一种方法,可以借鉴一下。
5.5 使用存储过程
存储过程是在数据库服务器进程中执行的代码块。大部分存储过程都是以特定于数据库的语言(而这些语言一般基于SQL),一些数据库生产商还允许使用其它语言开发(例如,Oracle中可用Java,SQL Server 2005中可用C#,而PostgreSQL允许几乎任何语言)。
5.5.1 三思而行
存储过程往往被Java开发人员视为“敌人”,因为它们是平台相关的(数据库平台相关的, 不一定是操作系统相关的),而这是一些Java开发人员所不接受的。
相比于特定的解决方案,我们更注重于解决问题,我们发现存储过程在优化过程中值得考虑,它还可以解决那些复杂的以数据为中心的问题。
不要作极端主义者
在对存储过程的讨论中存在两个极端的观点。一方面,一些纯Java主义者认为永远不要使用存储过程(更有甚者,有人认为SQL本身也不能使用)。另一方面,一些纯数据库主义者认为与数据库间的任何交互都要通过存储过程来进行。
实际上,那则古老的谚语:“纯粹主义者都是错误的。”在这里也是适用的,两个极端的观点都是错误的。存储过程是一个工具,仅仅如此。考虑一个类似的情景:一位木匠,他有一把锤子,一个卷尺和一张锯。虽然他能够使用锤子来测量木板,但使用卷尺显然更好(使用锯来钉钉子的情况也是如此)。每一项工作都有最合适的工具,每个工具也都是为某种工作设计的。如果选择了错误的工具,它就不会发挥太好的作用。
选择正确的工具
我们可以选择的工具有SQL,存储过程和应用程序代码。一些操作用SQL实现起来不错,另一些可以选择存储过程,其它的则可以使用应用程序代码。
例如,考虑这种情况,我们要从几张表中查询以生成报表。使用应用程序代码,先从几张表中抓取所有数据,然后再进行过滤、连接,没什么意义。为一个简单的查询创建存储过程也会增加复杂性,却不会带来大的好处。将SQL放在iBATIS的映射语句中则是一种快速、简单、高效的解决方案。
现在,有一个更复杂的报表,需要进行多个子查询和左连接从百万级的记录中收集数据,存储过程会更好。使用存储过程,可以有更多选项进行优化。
在应用程序中,如果需要使用动态SQL,映射语句也非常有用。在第8章,我们会看到分别使用C#代码,存储过程和映射语句来实现动态SQL。我们不想吊您的胃口,如果您等不及了,直接跳到8.5节看一下吧。
在使用存储过程时需要考虑的一点是,它们可用来更新并返回数据,如果此时调用存储过程的方法不需要提交(比如仅用作读取数据),因而事务并未提交,那么就可能出现问题。在这种情况下,事务管理器需要完成提交,即使是读操作,或者您手工管理这些事务,就像下面的例子:
try
{
sqlMapper.BeginTransaction();
sqlMapper.QueryForObject("Account.insertAndReturn", a);
sqlMapper.CommitTransaction();
}
catch(Exception)
{
sqlMapper.RollBackTransaction();
}
关于事务的更多内容在第7章,因此要获得更多信息,去那里看看吧。
5.5.2 IN,OUT,INOUT参数
目前为止,我们看到的参数都是输入参数——将它们传给iBATIS,传入的数据保持不变(除了<selectKey>元素)。使用存储过程时,可以使用三种参数:IN,OUT和INOUT。
在iBATIS中使用存储过程时,IN参数用法很简单。将参数传给存储过程跟传给映射语句是一样的。这里是一个简单的存储过程,它接受两个IN参数并返回一个值:
CREATE OR REPLACE FUNCTION max_in_example
(a float4, b float4)RETURNS float4 ASBODYBODYBEGINif (a > b) thenreturn a;elsereturn b;end if;END;BODYBODY
LANGUAGE 'plpgsql' VOLATILE;
下面是相应的参数映射,映射语句以及C#代码:
<parameterMap id="pm_in_example" class="hashtable">
<parameter property="a" column="a" />
<parameter property="b" column="b" /></parameterMap><procedure id="in_example" parameterMap="pm_in_example" resultClass="int" >
max_in_example</procedure>
Hashtable condition = new Hashtable();
condition.Add("a", 7);
condition.Add("b", 5);return sqlMapper.QueryForObject<int>("Account.in_example", condition);
INOUT参数是指那些可以传给存储过程,可被存储过程修改的参数,就像在下面的例子中,存储过程接受两个数字,交换它们的值。看存储过程的代码(使用MS SQL的T-SQL):
CREATE PROCEDURE Swap
@a INT OUTPUT,
@b INT OUTPUTAS
DECLARE @temp INT
SET @temp = @a
SET @a = @b
SET @b = @temp
下面是相应的参数映射、映射语句和C#代码:
<parameterMap id="para_swap_numbers" class="hashtable">
<parameter property="a" column="a" direction="InputOutput" />
<parameter property="b" column="b" direction="InputOutput" /></parameterMap><procedure id="swap_numbers" parameterMap="para_swap_numbers">
Swap</procedure>
Hashtable condition = new Hashtable();
condition.Add("a", 7);
condition.Add("b", 5);
sqlMapper.Insert("swap_numbers", condition);
OUT参数较为少用。它类似于结果(就像resultMap中的那样),却像参数那样传入。传入的值会被忽略,然后在存储过程中被返回值替换掉。OUT参数可返回任意的单个值(见我们的下个例子)。 下面例子中的存储过程很简单,使用两个IN参数和一个OUT参数(MS SQL的T-SQL):
CREATE PROCEDURE Max
@a INT,
@b INT,
@c INT OUTPUTAS
IF @a > @b
SET @c = @a
ELSE
SET @c = @b
这个存储过程接收三个参数并返回void。但是,第三个参数仅用作输出,因此取决于另外两个参数的大小关系,它将被替换为较大的一个。要在iBATIS中使用它,需要如下代码:
<procedure id="max_number" parameterMap="para_max_number">
Max</procedure><parameterMap id="para_max_number" class="hashtable">
<parameter property="a" column="a" direction="Input" />
<parameter property="b" column="b" direction="Input" />
<parameter property="c" column="c" direction="Output" dbType="int" /></parameterMap>
Hashtable condition = new Hashtable();
condition.Add("a", a);
condition.Add("b", b);
ExecuteInsert("max_number", condition);//Convert.ToInt32(condition["c"]) is the maximum.
译注:参数c对应的parameter节点中有一个dbType特性,此处不能省略。如果省略,则会出现“String[2]: the Size property has an invalid size of 0.”的异常,原因时参数c被解析为varchar类型,此时OUT参数需要设定长度,故而引发上述异常。将dbType加上就不会有问题了。这个问题也说明parameter Map要尽量写得详细。
存储过程也可以返回多行记录。在对大量数据进行复杂的查询时,如果传统的SQL优化技术没有效果,使用存储过程可能会显著地改善性能。一些更为困难的情况是外连接(outer join)和需要计算的过滤。如果在这些情景中,您决定要使用存储过程,就需要确保对系统的瓶颈有良好的理解,否则不仅不能改善性能,还可能会变得更糟。
5.6 小结
在本章中,我们查看了使用iBATIS修改数据库数据的绝大多数选项。在读完第4章和本章后,您已经了解了使用iBATIS维护数据的所有信息。
在第6章中,我们将继续进行扩展。通过了解更为高级的查询技术,您能够更好地利用已掌握的数据库技能和平台。上一篇:iBATIS In Action:执行非查询语句(一);下一篇:iBATIS In Action:使用高级查询技术(一);
本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2007/12/11/executingnonquerystatement02.html,如需转载请自行联系原作者。
SQL Server调优系列基础篇(索引运算总结)
原文:SQL Server调优系列基础篇(索引运算总结)
前言
上几篇文章我们介绍了如何查看查询计划、常用运算符的介绍、并行运算的方式,有兴趣的可以点击查看。
本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方式可以指导我们如何建立索引、调整我们的查询语句,达到性能优化的目的。
闲言少叙,进入本篇的正题。
技术准备
基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析。
简介
所谓的索引应用就是在我们日常写的T-SQL语句中,如何利用现有的索引项,再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:
1、等于谓词:select ...where...column=@parameter
2、比较谓词:select ...where...column> or < or <> or <= or >= @parameter
3、范围谓词:select ...where...column in or not in or between and @parameter
4、逻辑谓词:select ...where...一个谓词 or、and 其它谓词 or、and 更多谓词....
我们就依次分析上面几种情况下,如何利用索引进行查询优化的
一、动态索引查找
所谓的动态索引查找就是SQL Server在执行语句的时候,才格式化查询条件,然后根据查询条件的不同自动的去匹配索引项,达到性能提升的目的。
来举个例子
SET SHOWPLAN_TEXT ON
GO
SELECT OrderID
FROM Orders
WHERE ShipPostalCode IN (N'05022',N'99362')
因为我们在表Orders的列ShipPostalCode列中建立了非聚集索引列,所以这里查询的计划利用了索引查找的方式。这也是需要建立索引的地方。
我们来利用文本的方式来查看该语句的详细的执行计划脚本,语句比较长,我用记事本换行,格式化查看
我们知道这张表的该列里存在一个非聚集索引,所以在查询的时候要尽量使用,如果通过索引扫描的方式消耗就比价大了,所以SQL Server尽量想采取索引查找的方式,其实IN关键字和OR关键字逻辑是一样的。
于是上面的查询条件就转换成了:
[Northwind].[dbo].[Orders].[ShipPostalCode]=N'05022' OR [Northwind].[dbo].[Orders].[ShipPostalCode]=N'99362'
这样就可以采用索引查找了,先查找第一个结果,然后再查找第二个,而这个过程在SQL Server中就被称为:动态索引查找。
是不是有点智能的感觉了....
所以有时候我们写语句的时候,尽量要使用SQL Server的这点智能了,让其能自动的查找到索引,提升性能。
有时候偏偏我们写的语句让SQL Server的智能消失,举个例子:
--参数化查询条件
DECLARE @Parameter1 NVARCHAR(20),@Parameter2 NVARCHAR(20)
SELECT @Parameter1=N'05022',@Parameter2=N'99362'
SELECT OrderID
FROM Orders
WHERE ShipPostalCode IN (@Parameter1,@Parameter2)
我们将这两个静态的筛序值改成参数,有时候我们写的存储过程灰常喜欢这么做!我们来看这种方式的生成的查询计划
本来很简单的一个非聚集索引查找搞定的执行计划,我们只是将这两个数值没有直接写入IN关键字中,而是利用了两个变量来代替。
看看上面SQL Server生成的查询计划!尼玛...这都是些啥???还用起来嵌套循环,我就查询了一个Orders表...你嵌套循环个啥....上面动态索引查找的能力去哪了???
好吧,我们用文本查询计划来查看下,这个简单的语句到底在干些啥...
|--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1009], [Expr1010], [Expr1011]))
|--Merge Interval
| |--Sort(TOP 2, ORDER BY:([Expr1012] DESC, [Expr1013] ASC, [Expr1009] ASC, [Expr1014] DESC))
| |--Compute Scalar(DEFINE:([Expr1012]=((4)&[Expr1011]) = (4) AND NULL = [Expr1009], [Expr1013]=(4)&[Expr1011], [Expr1014]=(16)&[Expr1011]))
| |--Concatenation
| |--Compute Scalar(DEFINE:([Expr1004]=[@Parameter2], [Expr1005]=[@Parameter2], [Expr1003]=(62)))
| | |--Constant Scan
| |--Compute Scalar(DEFINE:([Expr1007]=[@Parameter1], [Expr1008]=[@Parameter1], [Expr1006]=(62)))
| |--Constant Scan
|--Index Seek(OBJECT:([Northwind].[dbo].[Orders].[ShipPostalCode]), SEEK:([Northwind].[dbo].[Orders].[ShipPostalCode] > [Expr1009] AND [Northwind].[dbo].[Orders].[ShipPostalCode] < [Expr1010]) ORDERED FORWARD)
挺复杂的是吧,其实我分析了一下脚本,关于为什么会生成这个计划脚本的原因,是为了解决如下几个问题:
1、前面我们写的脚本在IN里面写的是两个常量值,并且是不同的值,所以形成了两个索引值的查找通过OR关键字组合,
这种方式貌似没问题,但是我们将这两个数值变成了参数,这就引来了新的问题,假如这两个参数我们输入的是相等的,那么利用前面的执行计划就会生成如下
[Northwind].[dbo].[Orders].[ShipPostalCode]=N'05022' OR [Northwind].[dbo].[Orders].[ShipPostalCode]=N'05022'
这样执行产生的输出结果就是2条一样的输出值!...但是表里面确实只有1条数据...所以这样输出结果不正确!
所以变成参数后首先解决的问题就是去重问题,2个一样的变成1个。
2、上面变成参数,还引入了另外一个问题,加入我们两个值有一个传入的为Null值,或者两个都为Null值,同样输出结果面临着这样的问题。所以这里还要解决的去Null值的问题。
为了解决上面的问题,我们来粗略的分析一下执行计划,看SQL Server如何解决这个问题的
简单点将就是通过扫描变量中的值,然后将内容进行汇总值,然后在进行排序,再将参数中的重复值去掉,这样获取的值就是一个正确的值,最后拿这些去重后的参数值参与到嵌套循环中,和表Orders进行索引查找。
但是分析的过程中,有一个问题我也没看明白,就是最好的经过去重之后的常量汇总值,用来嵌套循环连接的时候,在下面的索引查找的时候的过滤条件变成了 and 查找
我将上面的最后的索引查找条件,整理如下:
|--Index Seek(OBJECT:([Northwind].[dbo].[Orders].[ShipPostalCode]), SEEK: ( [Northwind].[dbo].[Orders].[ShipPostalCode] > [Expr1009] AND [Northwind].[dbo].[Orders].[ShipPostalCode] < [Expr1010]
) ORDERED FORWARD)
这个地方怎么搞的?我也没弄清楚,还望有看明白童鞋的稍加指导下....
好了,我们继续
上面的执行计划中,提到了一个新的运算符:合并间隔(merge interval operator)
我们来分析下这个运算符的作用,其实在上面我们已经在执行计划的图中标示出该运算符的作用了,去掉重复值。
其实关于去重的操作有很多的,比如前面文章中我们提到的各种去重操作。
这里怎么又冒出个合并间隔去重?其实原因很简单,因为我们在使用这个运算符之前已经对结果进行了排序操作,排序后的结果项重复值是紧紧靠在一起的,所以就引入了合并间隔的方式去处理,这样性能是最好的。
更重要的是合并间隔这种运算符应用场景不仅仅局限于重复值的去除,更重要的是还应用于重复区间的去除。
来看下面的例子
--参数化查询条件
DECLARE @Parameter1 DATETIME,@Parameter2 DATETIME
SELECT @Parameter1='1998-01-01',@Parameter2='1998-01-04'
SELECT OrderID
FROM ORDERS
WHERE OrderDate BETWEEN @Parameter1 AND DATEADD(DAY,6,@Parameter1)
OR OrderDate BETWEEN @Parameter2 AND DATEADD(DAY,6,@Parameter2)
我们看看这个生成的查询计划项
可以看到,SQL Server为我们生成的查询计划,和前面我们写的语句是一模一样的,当然我们的语句也没做多少改动,改动的地方就是查询条件上。
我们来分析下这个查询条件:
WHERE OrderDate BETWEEN @Parameter1 AND DATEADD(DAY,6,@Parameter1)OR OrderDate BETWEEN @Parameter2 AND DATEADD(DAY,6,@Parameter2)
很简单的筛选条件,要获取订单日期在1998-01-01开始到1998-01-07内的值或者1998-01-04开始到1998-01-10内的值(不包含开始日期)
这里用的逻辑谓词为:OR...其实也就等同于我们前面写的IN
但是我们这里再分析一下,你会发现这两个时间段是重叠的
这个重复的区间值,如果用到前面的直接索引查找,在这段区间之内的搜索出来的范围值就是重复的,所以为了避免这种问题,SQL Server又引入了“合并间隔”这个运算符。
其实,经过上面的分析,我们已经分析出这种动态索引查找的优缺点了,有时候我们为了避免这种复杂的执行计划生成,使用最简单的方式就是直接传值进入语句中(当然这里需要重编译),当然大部分的情况我们写的程序都是只定义的参数,然后进行的运算。可能带来的麻烦就是上面的问题,当然有时候参数多了,为了合并间隔所应用的排序就消耗的内存就会增长。怎么使用,根据场景自己酌情分析。
二、索引联合
所谓的索引联合,就是根据就是根据筛选条件的不同,拆分成不同的条件,去匹配不同的索引项。
举个例子
SELECT OrderID
FROM ORDERS
WHERE OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
OR ShippedDate BETWEEN '1998-01-01' AND '1998-01-07'
这段代码是查询出订单中的订单日期在1998年1月1日到1998年1月7日的或者发货日期同样在1998年1月1日到1998年1月7日的。
逻辑很简单,我们知道在这种表里面这两个字段都有索引项。所以这个查询在SQL Server中就有了两个选择:
1、一次性的来个索引扫描根据匹配结果项输出,这样简单有效,但是如果订单表数据量比较大的话,性能就会很差,因为大部分数据就根本不是我们想要的,还要浪费时间去扫描。
2、就是通过两列的索引字段直接查找获取这部分数据,这样可以直接减少数据表的扫描量,但是带来的问题就是,如果分开扫描,有一部分数据就是重复的:那些同时在1998年1月1日到1998年1月7日的订单,发货日期也在这段时间内,因为两个扫描项都包含,所以再输出的时候需要将这部分重复数据去掉。
我们来看SQL Server如何选择
看来SQL Server经过评估选择了第2中方法。但是上面的方法也不尽完美,采用去重操作耗费了64%的资源。
其实,上面的方法,我们根据生成的查询计划可以变通的使用以下逻辑,其效果和上面的语句是一样的,并且生成的查询计划也一样
SELECT OrderID
FROM ORDERS
WHERE OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
UNION
SELECT OrderID
FROM ORDERS
WHERE ShippedDate BETWEEN '1998-01-01' AND '1998-01-07'
我们再来看一个索引联合的例子
SELECT OrderID
FROM ORDERS
WHERE OrderDate = '1998-01-01'
OR ShippedDate = '1998-01-01'
我们将上面的Between and不等式筛选条件改成等式筛选条件,我们来看一下这样形成的执行计划
基本相同的语句,只是我们改变了不同的查询条件,但是生成的查询计划还是变化蛮大的,有几点不同之处:
1、前面的用between...and 的筛选条件,通过索引查找返回的值进行组合是用的串联的方式,所谓的串联就是两个数据集拼凑在一起就行,无所谓顺序连接什么的。
2、前面的用between...and 的筛选条件,通过串联拼凑的结果集去重的方式,是排序去重(Sort Distinct)...并且耗费了大量的资源。这里采用了流聚合来干这个事,基本不消耗
我们来分析以下产生着两点不同的原因有哪些:
首先、这里改变了筛选条件为等式连接,所通过索引查找所产生的结果项是排序的,并且按照我们所要查询的OrderID列排序,因此在两个数据集进行汇总的时候,正适合合并连接的条件!需要提前排序。所以这里最优的方式就是采用合并连接!
那么前面我们用between...and 的筛选条件通过索引查找获取的结果项也是排序的,但是这里它没有按照OrderID排序,它是按照OrderDate或者ShippedDate列排序的,而我们的结果是要OrderID列,所以这里的排序是没用的......所以SQL Server只能选择一个串联操作,将结果汇聚到一起,然后在排序了......我希望这里我已经讲明白了...
其次、关于去重操作,毫无疑问采用流聚合(Aggregate)这种方式最好,消耗内存少,速度又快...但是前提是要提前排序...前面选用的排序去重(Sort Distinct)纯属无奈之举...
总结下:我们在写语句的时候能确定为等式连接,最好采用等式连接。还有就是如果能确定输出条件的最好能写入,避免多余的书签查找,还有万恶的SELEECT *....
如果写了万恶的SELECT *...那么你所写的语句基本上就可以和非聚集索引查找告别了....顶多就是聚集索引扫描或者RID查找...
瞅瞅以下语句
SELECT *
FROM ORDERS
WHERE OrderDate = '1998-01-01'
OR ShippedDate = '1998-01-01'
最后,奉上一个AND的一个连接谓词的操作方式,这个方式被称为:索引交叉,意思就是说如果两个或多个筛选条件如果采用的索引是交叉进行的,那么使用一个就可以进行查询。
来看个语句就明白了
SELECT OrderID
FROM ORDERS
WHERE OrderDate = '1998-01-01'
AND ShippedDate = '1998-03-05'
这里我们采用了的谓词连接方式为AND,所以在实际执行的时候,虽然两列都存在非聚集索引,理论都可以使用,但是我们只要选一个最优的索引进行查找,另外一个直接使用书签查找出来就可以。省去了前面介绍的各种神马排序去重....流聚合去重....等等不人性的操作。
看来AND连接符是一个很帅的运算符...所以很多时候我们在尝试写OR的情况下,不如换个思路改用AND更高效。
参考文献
微软联机丛书逻辑运算符和物理运算符引用
参照书籍《SQL.Server.2005.技术内幕》系列
结语
此篇文章主要介绍了索引运算的一些方式,主要是描述了我们平常在写语句的时候所应用的方式,并且举了几个例子,算作抛砖引玉吧,其实我们平常所写的语句中无非也就本篇文章中介绍的各种方式的更改,拼凑。而且根据此,我们该怎样建立索引也作为一个指导项。
下一篇我们介绍子查询一系列的内容,有兴趣可提前关注,关于SQL Server性能调优的内容涉及面很广,后续文章中依次展开分析。
有问题可以留言或者私信,随时恭候有兴趣的童鞋加入SQL SERVER的深入研究。共同学习,一起进步。
文章最后给出上几篇的连接,看来有必要整理一篇目录了.....
SQL Server调优系列基础篇
SQL Server调优系列基础篇(常用运算符总结)
SQL Server调优系列基础篇(联合运算符总结)
SQL Server调优系列基础篇(并行运算总结)
SQL Server调优系列基础篇(并行运算总结篇二)
如果您看了本篇博客,觉得对您有所收获,请不要吝啬您的“推荐”。
MaxCompute SQL 现状与展望
票选最美云上大数据暨大数据技术峰会上,阿里云飞天一部高级专家振禹为大家带来题为“MaxCompute SQL 现状与展望”的演讲。本文重点解析了MaxCompute SQL 现状,详细介绍了各种功能,其中包括编译器用户友好功能、复杂类型、CTE、参数化视图和SEMI JION等,接着说明了MaxCompute SQL即将完成与推进中的功能,最后作了简要总结。
以下是精彩内容整理:
MaxCompute SQL 现状
目前MaxCompute SQL能力不是很强,虽然在性能、安全和成本控制上得到了业界一直认定,很多用户利用它支撑自己的核心业务,但也有对其不满意的方面,MaxCompute SQL与大数据运算方面的Hive、Orcale、SQL Server等都有很大差异,在标准的SQL支持上也有改进的地方。
开源生态需求
在做SQL兼容或扩充时,考虑到优先级将功能分成三方面,具体如下:
横向功能。横向功能影响所有用户、所有场景,是现阶段重点问题;
–
数据类型与内建函数
– UDF二进制兼容
–
外部文件存储与不同格式支持
–
标准语言功能
纵向功能。纵向功能适应用户不同场景需求;
–
外表支持,多数据格式支持
– CLUSTERED TABLE/TRANSFORM/CUBE
特色功能
– MaxCompute Studio 等易用性改进
–
特色语言功能 – TABLE
VARIBLE, Parameterized View
编译器用户友好功能
对于分布式系统,性能、成本都非常重要,更重要的是作为开发者的时间,如果大家花大量时间在查各种语言功能、写错就要debug半天、发现某参数没有传对等琐碎事情上,在集中开发时会浪费大家大量时间,不论MaxCompute还是Hive,目前都只支持提交有一个语句,如果在一个文件中一次提交多个语句,实际上也是一句一句向服务器提交的,如果最后一句出现语法或语义错误,也不会在client报告,可能前面几句已经执行若干小时才跑到最后一句,然后通知你最后一句某函数参数传错,这种情况会让人沮丧。MaxCompute 基于新一代SQL引擎,提供了新数据开发的IDE,叫MaxCompute Studio,MaxCompute Studio作了编译器深度集成,方便解决上述问题。
图为MaxCompute Studio的两个窗口,左侧窗口中,第一个语句中有函数多传了一个参数,最后一个语句中有一列在原表中不存在,MaxCompute Studio在进行文本编辑时就可以将所有信息错误标注出来,并能告诉大家错误是怎样的,将鼠标放在红色部位即可显示,MaxCompute SQL是一个集成在开发环境中的插件,大家可以当即修正错误,确保在client端解决掉所有错误,而且MaxCompute SQL引擎可以对不安全转换发出警告;右侧窗口中,使用MaxCompute Studio,可以自动列出所有columns,该功能上下文相关,包括buliding function和keywords的提醒,随着敲击都可以计时提醒哪些东西是否合法,您只要使用这个功能,自然而然做到程序零错误。
该功能的目的是提高用户开发效率、降低服务负载;目前具备compiler错误恢复能力,提供强大多error, warning功能,赋能MaxCompute Studio;未来,我们会提供更强大与精准的提示能力,会推出代码重构能力,我们也会在集成代码MaxCompute Studio里向大家提供智能建议。
基本数据类型
目前MaxCompute1.0支持6个数据类型,对于绝大部分场景足够,可以减少迁移成本,作为连接第三方工具(Tableau,HiveHPL)。比如integer ,MaxCompute1.0提供BEGINT数据类型,简洁的好处是减少选择,但有时数据类型丰富也确实能够带来更强的表达能力,尤其是从其它系统向MaxCompute迁移时,可能需要将类型进行映射,所以在MaxCompute即将推出将基本数据类型扩充,支持全部Hive数据类型和常量表示,时间类型支持国际化
,时区可订制。未来我们会进一步扩充数据类型,修正decimal类型,既能改善性能、节省存储,也能够把业务场景里的行为表现精确。
复杂类型
复杂类型在广告等场景常用,方便UDF开发,复杂类型也是很常用的一些功能,Maxcompute1.0也支持复杂类型,array和map,但是会有些限制,比如array和map下标类型必须是常量,不能嵌套;到了2.0支持struct,没有任何限制,可以任意嵌套。比如广告商打广告,每个广告会有出价竞标keyywords,随着不同的出价可以拿到广告中impression click,形成几条曲线,每一个广告点性能的数据形成了struct,所有的出价点形成了array。我们支持除UNION(Hive不推荐使用)外全部Hive复杂数据类型,所有Hive配套函数。未来,我们会进一步扩充复杂类型支持,放松限制,排序去重,支持UDT。
SQL语法
- CTE
CTE为common table
expression,在各个数据库语言中比较常用,完全兼容Hive。左侧图所示,如果写复杂的SQL,要依赖层层嵌套的subquery,某些用户的脚本已经嵌套四五层时,书写、维护都很不方便,subquery需要反过来写,不容易处理,并且两个分支上的subquery的SQL一模一样,完全依赖subquery智能将SQL写的一模一样,必须备份两份,会给代码维护带来不方便。而右侧图是与左侧图完全等效的写法,with子句定义了一系列inners,每个inner对应SQL子句,后面就可以直接访问前面对应好的子句,每一个子句相当于定义一个变量,可供多次引用。
VALUES
VALUES最常用的地方是insert,当准备不是大量数据时,传统的database用法只需准备一个文本文件,将所有VALUES都准备好,执行有一个SQL语句即可将所有数据准备好,老版本的MaxCompute1.0不支持这种语句,准备数据的方式是通过tunnel上传,虽然方式没有问题,但会给迁移带来额外工作。而在新一代MaxCompute中,insert、VALUES可以支持了,支持Insert column list,Values table选取是MaxCompute的特色功能。
SEMI JION等其他改进
SEMIJOIN是各个数据库系统中常用的功能,常见的体现方式为IN subquery和EXISTS,像Orcale、SQLServer、Hive都会将其转成JOIN,称为半连接,半连接分为ANTI JOIN和SEMIJOIN,SEMIJOIN是指用右表数据过滤左表,右表有就返回左表数据,ANTI JOIN为右表没有即返回左表数据。SEMIJOIN兼容Hive,兼容Impala ANTI JOIN。
同时,MaxCompute还支持Implicit Join和UNION [DISTINCT]。
查询过程与参数化视图
在大数据查询时,会将所有语句编成统一一个执行计划运行,避免做一个一个语句的操作,对于Hive来说,也可以将一系列语句写到文件中提交,语句之间完全是分开提交的,服务器端每次看到的只是原本文本文件中的一个语句,中间的联系主要靠表实现,表达能力和性能方面都是有欠缺的。
图为MaxCompute Studio截图,通过查询过程写出一个程序,可以看到分成三个部分:首先set语句定义一些设定,其次DDL语句准备一些table,最后是一系列的DML查询语句,此查询语句与传统查询方式不同,每一个都是定义变量等同于查询语句,变量可以反复使用,它比CTE更加灵活,可以任意引用,多次insert。查询过程中会形成单一完整的一个执行计划,这与写一个复杂语句在性能上是没有区别的,整个程序会一次性提交到服务器端一次性执行,会在维护性和性能方面带来很大好处。
MaxCompute支持视图,根据数据表提供有意义的运算,这些运算不一定要每次计算出来,而是直接写SQL语句,这些语句就变成了视图,SQL语句就从准备好的表里抽取数据,做出一定运算后再提供给调用者调用,这样做的好处是封装保证了底层改变时不需要让所有调用者都做任何变化,只需将view更新,另外,代码可以反复使用。
图中可以看出,左侧有两个参数化view。第一个可以提供参数列表,表中有表变量和string变量,SQL语句可以直接引用这些变量;第二个begin-end里就是查询过程,写法完全一样,区别是它可以引用参数列表提供的参数,对于view来说,定义一个返回变量,对变量进行赋值即可。右边图中可以看到如何调用参数化的view,以后大家可以完全在MaxCompute上提供用查询语言写出的过程库和函数库,提供给别人去用。
内建函数
语言本身以及语言提供的函数库是否易用和丰富很重要,兼容性也是必须要考虑的问题。
我们大大新增了函数
,扩充接近一倍,具体包括以下函数:
–
数学函数 log2,log10,bin,
hex,unhex,crc32,sha1,shar2,degrees,nullif,radians,sign,e,pi,
factorial,cbrt, shiftleft, shiftright,
shiftrightunsigned
–
日期函数 unix_timestamp, to_date, year, quarter, month, day, dayofmonth,
hour, minute,
second,millisecond,nanosecond,date_add,
date_sub, from_utc_timestamp, current_date,
current_timestamp, add_months, last_day,
next_day, trunc, months_between
–
字符串函数 concat_ws, lpad, rpad, replace, soundex, substring_index
–
聚合函数 collect_list, collect_set
–
表操作函数 posexplode, stack, inline, parse_url_tuple
–
复杂类型操作函数 map,struct,named_struct, map_values,map_keys, sort_array
未来支持全部Hive Built-in函数(包括Window函数)与其他DBMS典型函数,目前有些函数调用了Java,改为Native提高性能。
UDF/UDAF/UDTF
目的
–
降低用户迁移成本
–
兼容生态工具
–
扩大MaxCompute自身能力,例如HPL
进展
–
二进制兼容Hive2.1 UDF/UDAF/UDTF, 无需迁移 ,注册成MaxCompute函数就能用
–
限制安全沙箱,很多第三方库因使用受限功能无法使用 (访问磁盘,使用反射等)
未来
–
安全支持虚拟化,第三方库可用
–
注册方式兼容(不一定需要,与Session支持统一考虑)
– UDT (User Defined Type) – 与Java的无缝集成
EXTERNAL TABLE / STORED AS
数据上云,兼容Hadoop/Hive现有数据。在Hadoop/Hive里,数据进入系统最常用的方式是将数据上传到HDFS,在Hive里有external table,可以指定location在哪,再指定数据文件格式,就可以使用了,每天数据往HDFS里上传,在MaxCompute里支持的方式是datahub和tunnel,为的就是方便大家迁移适应各种各样的场景。
目前MaxCompute的进展如下:
–
二进制兼容Hive所有内建文件格式与SerDe(行格式)
– TEXTFILE,SequenceFile,RCFile,AVRO,Par quet, ORC
–
文件按存储在OSS上,直接访问
未来将会支持STORED BY “StorageHandler”支持与OTS,Hbase类的DBMS的互通。
即将完成与推进中的功能
支持桶表提高兼容性与性能 – S27试用
– CREATE TABLE … [RANGE] CLUSTERED BY (col1,…) SORTED BY (col1, …)
INTO <n> Buckets ...
– hash cluster与hive兼容,提高性能与兼容性
– range cluster,MaxCompute特色,支持海量排序与交互式查询
支持Memory
Table,以更友好的方式提供类似Spark RDD的功能– S27试用
–
内存中cache热表,提高性能。
ALTER TABLE t SET TBLPROPERTIES(‘cache’=‘true’) ;t 的内容缓存在内存中,多次访问无需读盘
–
与table variable结合,缓存热点查询,提高性能。
@a := CACHE ON SELECT …; -- @a的结果缓存在内存中
@b := SELECT * from @a a join @a b on …; 多次访问 @a ,从内存中直接读取,无需重新计算。
SQL方面的其他计划中的改进
– UDJ (User Defined Join)
– GROUPING SET, TRANSFORM, session等,根据客户需要有选择的支持
总结
MaxCompute在提高性能,降低成本的同时,重视改善用户体验,提高开发与使用效率
基于ODPS2.0的SQL引擎,MaxCompute希望真正提供货架产品,适应广大客户需求
大幅降低迁移成本,提供良好兼容性,让用户轻松迁移,放心迁移
开启与开源世界连通的通道,充分利用优秀开源资源
MaxCompute常见问题(2019.04新版)
计量计费
购买开通
MaxCompute计费常见问题
现在公司有数据统计分析的需求,已经在用RDS数据库,还应该开通什么服务?
从MaxCompute上下载数据,使用华东2的ECS云主机使用内网,收取流量费用吗?
MaxCompute如何将后付费转换为预付费?
MaxCompute数据存储有3.5T,把相关几张大的表格都删除后,显示的总数还是3.5T,是什么原因?会增加ODPS使用费用吗?
续费变更
如何关闭MaxCompute服务
以IO后计费的方式开通了MaxCompute,如何停用不自动续费功能?
没有进行MaxCompute的计算为什么有扣费操作?
MaxCompute table有大小的阈值设置吗?
项目管理
项目操作
血缘信息上下游表的相关信息,多久会更新?为什么会有重名?
使用DataWorks提交任务时,${bdp.system.bizdate}这个时间,如果想取一年前、一个月前、半年前和一周前分别怎么操作?
如何删除MaxCompute项目
客户端运行odpscmd -f cmd_file,cmd_file中能有变量吗?
有类似ptkill之类的方法批量kill超时任务的方式吗?
mapjoin中大表和小表是否可以互换位置?
如何通过MaxCompute做分布式处理并访问外网?
MaxCompute客户端配置因本地时间不对导致超时
如何在客户端上查看任务信息?
MaxCompute支持快照吗?changelog的设置方式是什么?
ODPS中可以设置表的过期时间,是否有办法设置分区的过期时间?
MaxCompute会有lock-in问题吗?
MaxCompute是否支持restful接口?
运维中心补数据功能怎么使用?
新建子管理账号,但子账号不能访问MaxCompute的功能,是什么原因?
将开通数据保护的MaxCompute表数据导入另一项目空间
如何查看某个MaxCompute项目及每张数据表所使用的磁盘空间?
如何调用Package中的表?
项目Owner能否更换为子账号?
MaxCompute页面“运行任务”一类的栏目功能在哪里能看到?
使用Use Project命令进入项目空间时为什么会报错Failed?
如果不调用com.aliyun.odps.Instance中的waitForSuccess()方法,是否导致数据有遗漏?
MaxCompute在整个解决方案中的应用
项目资源
系统安全
用户授权
跨项目读取数据
子账号登录MaxCompute控制台看不到Project列表?
MaxCompute如何保证数据安全
子账号无法访问大数据开发平台,提示缺少access id
MaxCompute是否对外提供Xlib模块?
MaxCompute授权报错:lack of account provider
如何把早期的MaxCompute项目添加到现在已开通的数加平台中?
项目数据保护与共享
ODPS表为什么正在使用时找不到了?
数据上传到MaxCompute后的数据可靠性怎样?
审计脱敏
数据上传下载
Tunnel命令与SDK
MaxCompute之Tunnel命令相关问题
MaxCompute之Tunnel上传/下载相关问题
MaxCompute之Tunnel上传典型问题场景
MaxCompute的Web控制台的最大屏显行数
odpscmd tunnel目录文件支持中文吗?
odpscmd tunnel是否支持.dbf后缀非加密数据库文件?
odpscmd tunnel是否支持多并发?
Tunnel导入数据时候报错分区不存在
Tunnel上传数据报错Blocks not match
Tunnel SDK如何一次下载分区表里的所有分区
如何使用Tunnel下载指定的部分数据?
Tunnel上传数据如何实现Overwrite的功能
Tunnel SDK上传报错Error writing request body to server
MaxCompute tunnel 命令续传数据
MaxCompute控制台下载数据返回getTableDataCsv.json
MaxCompute 数据导出分别有几种格式?
同一Region内使用Tunnel下载数据为什么也可能产生费用
使用Tunnel SDK上传报错为重复提交
数据通道
使用Tunnel或dship下载数据时,如何设置Endpoint?
如何删除已上传的脏数据?
请问datahub地址无论在内网还是外网都使用:http://dh.odps.aliyun.com这个地址吗?
Fluented插件报错:ShardNotReady
调用 StreamWriter 向 MaxCompute 中写入数据时,报错:ErrorCode=MalformedDataStream?
上传数据的相关问题
如何从 MaxCompute 上批量导入数据到 ocs 业务场景需要定时从 MaxCompute 上将 k-v value 批量导入 ocs ?
hubtable数据上传必须用java sdk吗,能不能用新版客服端就完成?
MaxCompute 里存储的数据可以导给E-MapReduce吗?如果可以,怎么设置?
DataHub相关问题
实际数据里包含分隔符的解决方案
导入数据实现动态分区
Datahub和Tunnel应用场景的区别
DataHub上传数据的限制
多线程上传数据时报错
SQL
SQL语句
报错If you really want to perform this join, try mapjoin
能否增加/更改分区?
分区数量是否越多越好?
如何用Mapjoin缓存多张小表?
如何查看MaxCompute数据量
INSERT语句执行过程中出现错误,会损坏原有数据吗?
如何添加/删除列?
报错Table xx has n columns, but query has m columns
如何更新和删除数据?
MaxCompute 里分区和分区列的区别
如何往MaxCompute表插入记录?
如何使用 not in,实现上万级别数据量的子查询?
MaxCompute表如何设置自增长列?
如何查看某一天ODPS上执行的所有sql?
使用coalesce函数只要超过一个expression,报错FAILED: ODPS-0130071:Semantic analysis exception
设置MaxCompute表的主键
Double类型数据精度问题
执行TO_DATE函数报错没有分钟部分
隐式类型转换错误
用SQL对Double类型数据进行比较
输入表过多
输出表的分区过多
执行SQL报错 FAILED: ODPS-0010000:System internal error - OTS filtering exception - Ots read range partitions exceeds the specified limit:10000
执行SQL报错:Repeated key in GROUP BY
报错:FAILED:ODPS-0130089 Invalid UDF reference - class not found for function
外关联后发现数据条数增加
删除分区报错
如何删除非分区表中的重复数据?
Float类型数据应如何插入MaxCompute表
相同数据运行insert select 语句的结果和直接select的结果为什么不一致?
补数据的时候选择“写入前清理已有数据Insert Overwrite”,导致原库里面30G的数据被清理了,可以恢复吗?
已经指定了分区条件,为何还是会提示”禁止全表扫描”?
在ODPS中执行一个简单的SQL一直处于Job Quening...状态
查询SQL报错“ExceptionBase: ValidateJsonSize error: the size of compressed plan is larger than 1024KB”
MYSQL中的SUBSTRING_INDEX函数在MaxCompute里没有
插入动态分区报错
报错:Expression not in GROUP BY key
使用odpscmd -e执行SQL语句是否有长度限制?
odpscmd支持并行download表吗?
在odpscmd客户端执行的SQL能用到自己的ECS调度资源吗?如果有限制,如何增加资源?
MaxCompute的列数限制
MaxCompute中查询结果的排序
MaxCompute如何非交互式运行MaxCompute SQL?
使用MaxCompute SQL自定义函数查询时,提示内存不够?
MaxCompute与关系型数据库的区别
MaxCompute支持虚拟表吗?
product项目中运行Insert语句并使用动态分区,产生大量分区和记录数,一直没有运行完成,是什么原因?
MaxCompute能否像MySQL一样灵活使用用户变量(即MySQL的@变量名)?
[regexp_count(string source, string pattern[, bigint start_position]) 的第二个参数 pattern是否支持嵌入查询语句?](https://help.aliyun.com/knowledge_detail/101781.html)
SELECT a.id as id > , IFNULL( concat('phsxxx', a.insy, 'xxxbxxx', IFNULL()报错; Semantic analysis exception - Invalid function : line 1:41 'ifnull'
所有的MaxCompute的配置、SQL能转移到另一个阿里云账号上吗?
MaxCompute SQL执行提示输入的数据超过100G,怎么解决?
MaxCompute如何将一条数据转多条?
可以一次add多个partition吗?
设置表的生命周期为3天,每个分区的存储量也很大,如果清理分区表旧数据?
如何查询才能少用分区计算量?分区设置能调整吗?
是否能将rds中的表一次性导入到MaxCompute中?
Read Table及Select * From Table的屏显限制项
对于查询出的结果,目前看到提供了复制和下载功能,是否有哪些设置可以把这两个功能关闭掉?
使用SQLTask进行SQL查询时,如何获取所有数据?
SQL Task返回结果集的数据量是否有限制?
使用SQLTask配合Tunnel实现超出1万行的运行结果导出
与标准SQL的主要区别及解决方法
SQLTask查询数据和DownloadSession有何不同?
在MaxCompute里运行SQL命令,怎样能下载超过一万行的数据?
MaxCompute为什么不能查看每条sql执行的费用?
MaxCompute sql语句中like模糊查询的where条件支持正则表达式吗?
sql执行报错ODPS-0121145:Data overflow - param convert to Double result is nan,input param is NaN,是什么原因?
多路输出的情况下,能否在reduce函数中拿到每一个label的输出表的表结构?
select * from xxxx where to_char(xxx,'yyyy-mm-dd') = '2017-03-01' ;无法执行,是什么原因?
用SQL对Double类型数据进行round四舍五入,结果存在偏差
如果只同步100条数据,在where处应该怎样写limit?
做数据同步如何删除非分区表中的重复数据?
对一张表A做group by成表B,结果表B比原来表A的行数要少了,但是物理存储量表B却是表A的10倍,请问这个什么原因?
如果一个表下面有很多分区,需要清空这个表所有的分区,应该怎么操做?
MaxCompute客户端SQL语句执行成功,但是会打印出异常信息
报错:FAILED: ODPS-0130071:Semantic analysis exception - line 6:0 Top level UNION is not supported
UDF
没有权限编写UDF
使用fastjson自定义函数时报错java.lang.NoClassDefFoundError: java/io/File
编写UDAF,报错:Resolve annotation not found
ODPS上,有没有什么函数,可以把'2017-01-23'字符串转化为'20170123'
MaxCompute表的decimal怎么设置成保留2位小数?
MaxCompute有类似group_concat的函数吗?
odps执行定时任务某个节点运行失败,log报错"skynet_packageid is null"
MaxCompute是否支持Scipy?
如何通过自定义日志打印对UDAF进行线上调试
UDAF函数参数的输入类型能否像内置函数一样接受任意参数类型?
外部表
查询OSS外部表报错java.lang.OutOfMemoryError: Java heap space
MapReduce
write(Record key, Record value) 与 write(Record record) 的区别
Main方法中如何判断一个表为空表?
如何在本地调用MaxCompute服务器运行Mapreduce任务?
报错:BufferOverflowException
MaxCompute 上的 mapreduce 任务是否会对分区的数据进行覆盖?
MapReduce常见问题
在MapOnly例子中,为什么程序没有指定输出Table的Schema格式
报错:Resource not found.
Hadoop MapReduce源码能否直接应用于MaxCompute MapReduce?
使用MR报:class not found
Mapper和Reducer相关问题
MaxCompute MapReduce进行分布处理时,如何设置node?
如何打印MR/UDF中的日志?MR中是否可以只有Map?
Reduce刚执行,就报错为内存溢出
MR中指定两个jar,libjars和classpath
报错:Exception in thread “main“ java.io.IOException
报错:ODPS-0010000: System internal error - get input pangu dir meta fail
报错:Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name
报错:FAILED: ODPS-0123144: Fuxi job failed - WorkerRestart
MR读取资源次数超过限制
报错:java.security.AccessControlException: access denied
MapReduce实现排序顺序
MapReduce中的Backups是什么?
在MapReduce程序中使用第三方类,打了一个assembly的jar包,运行时报找不到类的错误,应该怎样配置?
结果表中会保留两个MR计算之后的重复数据吗?
[在DataWorks上件执行时logview总是显示Exceed maximum read times [256] per resource: 'RES_META_DICT_CITY'会对结果有影响吗?](https://help.aliyun.com/knowledge_detail/101808.html)
在MapReduce过程中OOM内存溢出应该调整什么参数?
运行MapReduce报错java.lang.OutOfMemoryError: Java heap space
SDK
JAVA SDK
MaxCompute Java SDK执行任务卡顿如何处理?
MaxCompute如何下载SDK的DOC?
报错:java.lang.ClassNotFoundException
报错:OpenJDK 64-Bit Server VM warning: Insufficient space for shared memory
MaxCompute分析的结果如何传输到PHP开发的WEB应用中?
Python SDK(PyODPS)
PyODPS安装常见问题
PyODPS开发最佳实践
PyODPS常见问题
Dataframe如何获得count实际数字?
MaxCompute对Python的支持
使用SQL"from odps import options options.sql.settings"设置ODPS运行环境不成功是什么原因?
Shell或Python脚本中,如何执行MaxCompute命令?
优化诊断
小文件优化
MaxCompute小文件有关场景及解决方案
作业诊断
双击客户端工具闪退
进行并发插入等操作报错
FAILED: ODPS-0130121:Invalid argument type
创建的shell任务执行失败,运维中心无法查看失败原因
DataWorks-运维中心-任务管理中查看某个任务属性,显示的状态是暂停,在数据开发-调度配置中有勾选暂停按钮吗?
数据集成操作时消息框提示order字段已经删除
odpscmd -f 执行任务失败
日志服务同步日志到MaxCompute失败
同样的SQL语句查询同一个表为什么在不同项目里执行结果不一致?
数据同步报错可以配置用户邮件列表把出错的表发送给用户吗?
使用DataWorks时很多数据同步任务处于等待状态是什么原因?
shell任务执行问题:调度资源管理添加的其中一台服务器一直显示“停止”