當幸福來敲門

          我就會牢牢抓住!
          隨筆 - 50, 文章 - 3, 評論 - 8, 引用 - 0
          數據加載中……

          Java方法導出Excel數據

          public ActionForward exportExcel(ActionMapping mapping,
             ActionForm form, HttpServletRequest request,
             HttpServletResponse response) {  
            String sfile = this.getServlet().getServletContext().getRealPath("/upload/")+ File.separator +"data.xls";// 服務器端名字
            String filename ="data.xls";// 客戶端名字
            OutputStream os = null;
            WritableWorkbook wwb = null;
            try {
             os = new FileOutputStream(savePath);
             wwb = Workbook.createWorkbook(os);//第一步,創建一個webbook,對應一個Excel文件
             WritableSheet ws = wwb.createSheet("statistics", 0); //第二步,在webbook中添加一個sheet,對應Excel文件中的sheet
                 for (int i = 0; i < titleList.size(); i++) {
              String title = (String) titleList.get(i);
              Label titleLabel = new Label(i+1, 0, title);//從第二列   第一行 開始
              ws.addCell(titleLabel);
             }
             for (int i = 0; i < dataList.size(); i++) {
              Map  obj= (HashMap) dataList.get(i);
              String areaName = (String) obj.get("時間");//價格
              Label areaNameLabel = new Label(0, i+1, areaName);
              ws.addCell(areaNameLabel);//第一行的值
              for (int k = 0; k < str.length; k++) {
               if(db != null&& db.trim().equals("0")&&i>2){
                Label label = new Label(1+(k*3), i + 1, "xxx");
                ws.addCell(label);
                   label = new Label(2+(k*3), i + 1, "xxx");
                ws.addCell(label);
                label = new Label(3+(k*3), i + 1, "xxx");
                ws.addCell(label); 
               }else{
               String number = (String) obj.get(str[k][0] + "n");//數量
                     String sum = (String) obj.get(str[k][0] + "s");//金額
                     String cif = (String) obj.get(str[k][0] + "c");//價格
                Label label = new Label(1+(k*3), i + 1, number==null?"0":number);
               ws.addCell(label);
                  label = new Label(2+(k*3), i + 1, sum==null?"0":sum);
               ws.addCell(label);
               label = new Label(3+(k*3), i + 1, cif==null?"0":cif);
               ws.addCell(label);
               }
                  }
             }
             wwb.write();
            } catch (Exception ex) {
             ex.printStackTrace();
            } finally {
             try {
              wwb.close();
              os.close();
             } catch (Exception e) {
              e.printStackTrace();
             }
            }
          try {
              response.setHeader("Content-Disposition", "attachment;filename="
               + filename);
             response.setContentType("application/vnd.ms-excel");
             BufferedOutputStream out = new BufferedOutputStream(
               new DataOutputStream(response.getOutputStream()));
             BufferedInputStream in = new BufferedInputStream(
               new FileInputStream(sfile));
             byte[] b = new byte[in.available()];
             in.read(b);
             out.write(b);
             out.close();
             in.close();
             } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
            }


          }

          posted @ 2011-12-30 13:45 wyx 閱讀(178) | 評論 (0)編輯 收藏

          JSP下載txt 和 Excel兩種文件

          jsp 下載txt文件和excel文件

          最近做了個用jsp下載的頁面 將代碼貼出來 權作記錄吧

          1 下載txt文件 

          這個花了我不少時間 原因是用ie下載txt文件時是在頁面中直接打開了文件.雖然查了一些資料,也看了別人的解決方案,可還是解決不了問題,最后發現是一個字母惹的禍:少寫一個字母 嘿嘿 夠馬虎!!!

          代碼如下:

          OutputStream o=response.getOutputStream();
             byte b[]=new byte[500];
             File fileLoad=new File("e:/test.txt");
              response.setContentType("application/octet-stream");

             response.setHeader("content-disposition","attachment; filename=text.txt");
             long fileLength=fileLoad.length();
             String length1=String.valueOf(fileLength);
             response.setHeader("Content_Length",length1);
             FileInputStream in=new FileInputStream(fileLoad);
             int n;
             while((n=in.read(b))!=-1){
              o.write(b,0,n);
             }
            
             in.close();
             out.clear();
             out = pageContext.pushBody();

          2 下載excel文件 

          跟下載txt文件時的唯一區別是ContentType值的設置不同:

          OutputStream o=response.getOutputStream();
             byte b[]=new byte[500];
             File fileLoad=new File("e:/text.xls");
             response.reset();
            

              response.setContentType("application/vnd.ms-excel");

             response.setHeader("content-disposition","attachment; filename=text.xls");
             long fileLength=fileLoad.length();
             String length1=String.valueOf(fileLength);
             response.setHeader("Content_Length",length1);
             FileInputStream in=new FileInputStream(fileLoad);
             int n;
             while((n=in.read(b))!=-1){
              o.write(b,0,n);
             }
            
             in.close();
             out.clear();
             out = pageContext.pushBody();

           

           

          這兩個本來是放在一起的,因為我的頁面中需要判斷是下載的txt文件還是xls文件  在這里給分開了 需要注意的是,最后兩句一定要加上,否則會出現getOutputStream()錯誤的!!!!

           

           

           

           

           

           

           

           

          實例:

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
          %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
              <base href="<%=basePath%>">
              <title>My JSP 'index.jsp' starting page</title>
              <script type="text/javascript">
                 function download(filename){
                   var url = encodeURI("down2.jsp?filename="+filename);
                   window.location.href= url;
                 }
              </script>
          </head>

          <body>
          普通測試:
          <a href="javascript:void(0)" onclick="download('a.txt');">Down a.txt</a>  
          中文文件名測試:
          <a href="javascript:void(0)" onclick="download('中文.txt');">Down 中文.txt</a>  
          普通轉向:
          <a href="a.txt">down.txt</a>  
          </body>
          </html>

           

          down2.jsp:
          <%@ page language="java" import="java.util.*,java.io.* " pageEncoding="UTF-8"%>
          <%
          request.setCharacterEncoding("utf-8");
          String filename = request.getParameter("filename");
          filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
          System.out.println(filename);
          OutputStream o=response.getOutputStream();
          byte b[]=new byte[500];
          /** * 得到文件的當前路徑 * @param args */
          String   serverpath=request.getRealPath("\\");
          File fileLoad=new File(serverpath+filename);
          response.setContentType("application/octet-stream");
          response.setHeader("content-disposition","attachment; filename="+filename);
          long fileLength=fileLoad.length();
          String length1=String.valueOf(fileLength);
          response.setHeader("Content_Length",length1);
          FileInputStream in=new FileInputStream(fileLoad);
          int n;
          while((n=in.read(b))!=-1){
             o.write(b,0,n);
          }
          in.close();
          out.clear();
          out = pageContext.pushBody();
          %>

          posted @ 2011-12-21 10:53 wyx 閱讀(4834) | 評論 (0)編輯 收藏

          JS導出Excel

           JS導出EXCEL的兩種方法

          function method1(tableid) {//整個表格拷貝到EXCEL中
              var curTbl = document.getElementById(tableid);
              var oXL = new ActiveXObject("Excel.Application");
              //創建AX對象excel
              var oWB = oXL.Workbooks.Add();
              //獲取workbook對象
                  var oSheet = oWB.ActiveSheet;
              //激活當前sheet
              var sel = document.body.createTextRange();
              sel.moveToElementText(curTbl);
              //把表格中的內容移到TextRange中
              sel.select();
              //全選TextRange中內容
              sel.execCommand("Copy");
              //復制TextRange中內容
              oSheet.Paste();
              //粘貼到活動的EXCEL中      
              oXL.Visible = true;
              //設置excel可見屬性
          }
          function method2(tableid) //讀取表格中每個單元到EXCEL中
          {
              var curTbl = document.getElementById(tableid);
               var oXL = new ActiveXObject("Excel.Application");
               //創建AX對象excel
               var oWB = oXL.Workbooks.Add();
               //獲取workbook對象
              var oSheet = oWB.ActiveSheet;
              //激活當前sheet
               var Lenr = curTbl.rows.length;
               //取得表格行數
               for (i = 0; i < Lenr; i++)
               {
                   var Lenc = curTbl.rows(i).cells.length;
                   //取得每行的列數
                   for (j = 0; j < Lenc; j++)
                   {
                       oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText;
                       //賦值
                   }
               }
               oXL.Visible = true;
               //設置excel可見屬性
          }

           

          <input type="button" onclick="javascript:method1('TableExcel');" value="第一種方法導入到EXCEL">
          <input type="button" onclick="javascript:method2('TableExcel');" value="第二種方法導入到EXCEL">

           

          posted @ 2011-12-20 11:27 wyx 閱讀(4791) | 評論 (2)編輯 收藏

          分享示例Lucene.NET 2.9版本基本用法

          5. 排序

          通過 SortField 的構造參數,我們可以設置排序字段,排序條件,以及倒排。
          Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false)); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query, sort);
          排序對搜索速度影響還是很大的,盡可能不要使用多個排序條件。

          6. 過濾

          使用 Filter 對搜索結果進行過濾,可以獲得更小范圍內更精確的結果。

          舉個例子,我們搜索上架時間在 2005-10-1 到 2005-10-30 之間的商品。
          對于日期時間,我們需要轉換一下才能添加到索引庫,同時還必須是索引字段。
          // index document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED); //... // search Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-1"), DateTime.Parse("2005-10-30")); Hits hits = searcher.Search(query, filter);
          除了日期時間,還可以使用整數。比如搜索價格在 100 ~ 200 之間的商品。
          Lucene.Net NumberTools 對于數字進行了補位處理,如果需要使用浮點數可以自己參考源碼進行。
          // index document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED)); //... // search Filter filter = new RangeFilter(FieldNumber, NumberTools.LongToString(100L), NumberTools.LongToString(200L), true, true); Hits hits = searcher.Search(query, filter);
          使用 Query 作為過濾條件。
          QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));
          我們還可以使用 FilteredQuery 進行多條件過濾。
          Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15")); Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true); Query query = QueryParser.Parse("name*", FieldName, analyzer); query = new FilteredQuery(query, filter); query = new FilteredQuery(query, filter2); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
          7. 分布搜索

          我們可以使用 MultiReader 或 MultiSearcher 搜索多個索引庫。
          MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:\index"), IndexReader.Open(@"\\server\index") }); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);

          IndexSearcher searcher1 = new IndexSearcher(reader1); IndexSearcher searcher2 = new IndexSearcher(reader2); MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 }); Hits hits = searcher.Search(query);
          還可以使用 ParallelMultiSearcher 進行多線程并行搜索。

          8. 合并索引庫

          將 directory1 合并到 directory2 中。
          Directory directory1 = FSDirectory.GetDirectory("index1", false); Directory directory2 = FSDirectory.GetDirectory("index2", false); IndexWriter writer = new IndexWriter(directory2, analyzer, false); writer.AddIndexes(new Directory[] { directory }); Console.WriteLine(writer.DocCount()); writer.Close();
          9. 顯示搜索語法字符串

          我們組合了很多種搜索條件,或許想看看與其對等的搜索語法串是什么樣的。
          BooleanQuery query = new BooleanQuery(); query.Add(query1, true, false); query.Add(query2, true, false); //... Console.WriteLine("Syntax: {0}", query.ToString());
          輸出:
          Syntax: +(name:name* value:name*) +number:[0000000000000000b TO 0000000000000000d]

          呵呵,就這么簡單。

          10. 操作索引庫

          刪除 (軟刪除,僅添加了刪除標記。調用 IndexWriter.Optimize() 后真正刪除。)
          IndexReader reader = IndexReader.Open(directory); // 刪除指定序號(DocId)的 Document。 reader.Delete(123); // 刪除包含指定 Term 的 Document。 reader.Delete(new Term(FieldValue, "Hello")); // 恢復軟刪除。 reader.UndeleteAll(); reader.Close();
          增量更新 (只需將 create 參數設為 false,即可往現有索引庫添加新數據。)
          Directory directory = FSDirectory.GetDirectory("index", false); IndexWriter writer = new IndexWriter(directory, analyzer, false); writer.AddDocument(doc1); writer.AddDocument(doc2); writer.Optimize(); writer.Close();
          11. 優化

          批量向 FSDirectory 增加索引時,增大合并因子(mergeFactor )和最小文檔合并數(minMergeDocs)有助于提高性能,減少索引時間。
          IndexWriter writer = new IndexWriter(directory, analyzer, true);  writer.maxFieldLength = 1000; // 字段最大長度 writer.mergeFactor = 1000; writer.minMergeDocs = 1000;  for (int i = 0; i < 10000; i++) { // Add Documentes... }  writer.Optimize(); writer.Close();
          文章來自學IT網:http://www.xueit.com/LuceneNet/show-10315-2.aspx


          轉自《深入 Lucene 索引機制》

          利用 Lucene,在創建索引的工程中你可以充分利用機器的硬件資源來提高索引的效率。當你需要索引大量的文件時,你會注意到索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個問題, Lucene 在內存中持有一塊緩沖區。但我們如何控制 Lucene 的緩沖區呢?幸運的是,Lucene 的類 IndexWriter 提供了三個參數用來調整緩沖區的大小以及往磁盤上寫索引文件的頻率。

          1.合并因子 (mergeFactor)

          這個參數決定了在 Lucene 的一個索引塊中可以存放多少文檔以及把磁盤上的索引塊合并成一個大的索引塊的頻率。比如,如果合并因子的值是 10,那么當內存中的文檔數達到 10 的時候所有的文檔都必須寫到磁盤上的一個新的索引塊中。并且,如果磁盤上的索引塊的隔數達到 10 的話,這 10 個索引塊會被合并成一個新的索引塊。這個參數的默認值是 10,如果需要索引的文檔數非常多的話這個值將是非常不合適的。對批處理的索引來講,為這個參數賦一個比較大的值會得到比較好的索引效果。

          2.最小合并文檔數 (minMergeDocs)

          這個參數也會影響索引的性能。它決定了內存中的文檔數至少達到多少才能將它們寫回磁盤。這個參數的默認值是10,如果你有足夠的內存,那么將這個值盡量設的比較大一些將會顯著的提高索引性能。

          3.最大合并文檔數 (maxMergeDocs)

          這個參數決定了一個索引塊中的最大的文檔數。它的默認值是 Integer.MAX_VALUE,將這個參數設置為比較大的值可以提高索引效率和檢索速度,由于該參數的默認值是整型的最大值,所以我們一般不需要改動這個參數。

           

          文章來自學IT網:http://www.xueit.com/LuceneNet/show-10315-2.aspx



          posted @ 2011-12-14 14:05 wyx 閱讀(1926) | 評論 (0)編輯 收藏

          Lucence學習記錄

           

          一、創建索引 TDictionaryIndex.java 例子

          二、實用Lucene收索

          A.      普通查詢

              if (pname != null && !("").equals(pname)) {

                                   queryParser = new QueryParser("name", analyzer);

                                   query = queryParser.parse(pname);

                                   booleanQuery.add(query, BooleanClause.Occur.MUST);

                              }

          B.      In 范圍查詢

           if(datavarsor.trim().equals("30,22,4,14,12,2,7,15,21,1,6,8,5,28")){

                         datavarsor="30 22 4 14 12 2 7 15 21 1 6 8 5 28";

                        queryParser = new QueryParser("datavarsort", analyzer);

               queryParser.setDefaultOperator(QueryParser.Operator.OR);//

                        query = queryParser.parse(datavarsor);// 多選擇產品稅號

                        booleanQuery.add(query, BooleanClause.Occur.MUST);

                   }

          C.      選擇查詢 關鍵字

           if (wd != null && !wd.equals("")) {

                        queryParser = new MultiFieldQueryParser(new String[] {// 查詢條件是或的關系。。。

                               "department", "isorno", "filename" }, analyzer);

                        query = queryParser.parse(wd);

                        booleanQuery.add(query, BooleanClause.Occur.MUST);

                        HeighlighterQuery = query;

          D.準確查詢

             注意創建索引的時候:

          if (typename != null && !typename.equals(""))

                            document.add(new Field("typename", typename, Field.Store.YES,

                                   Field.Index.UN_TOKENIZED));

              查詢的時候:

            query = new TermQuery(new Term("typename", typename));     

                        booleanQuery.add(query, BooleanClause.Occur.MUST);

          E.時間排序

              org.apache.lucene.search.Sort sort2 = new org.apache.lucene.search.Sort(new SortField("endtime", SortField.STRING,

                        true));// 完成按照時間來排序

           

                     hits = search.search(booleanQuery, null, toIndex,sort2).scoreDocs;

           }

          posted @ 2011-12-09 17:38 wyx 閱讀(277) | 評論 (0)編輯 收藏

          HTML標簽學習

          不用jquery實現$.val(), $.html(), $.css(), $.attr()

          jquery寫久了,發現val, html,attr, 和css這些函數非常的實用,但是沒有jquery的環境呢?可以使用以下代碼來分別代替。

          Code: $("#id1").val();
          $("#id1").val("test");

          對應為

          document.getElementById("id1").value;
          document.getElementById("id1").value = "test";

           

          Code: $("#id1").html();
          $("#id1").html("test");
          $("#id1").append("test");

          對應為

          document.getElementById("id1").innerHTML;
          document.getElementById("id1").innerHTML = "test";
          document.getElementById("id1").innerHTML += "test";

           

          Code: $("#id1").css("background","green");

          對應為

          document.getElementById("id1").style.background = "green";

           

          Code: $("#id1").attr('onclick','alert(1);');

          對應為

          document.getElementById("id1").setAttribute('onclick','alert(1);');

          posted @ 2011-12-08 14:48 wyx 閱讀(186) | 評論 (0)編輯 收藏

          Ecside學習記錄


          toolbarLocation="top"  設置導出、翻頁在表格開頭

          ---------------擴展行可以任意添加內容
          <ec:extendbar  before="top">
          <tr style="background-color:#ffeedd" title="擴展行">
          <td colspan="2"><a>導出</a></td>
          <td>任意信息0</td>
          <td>任意信息1</td>
          <td>任意信息2</td>
          </tr>
          </ec:extendbar>

          posted @ 2011-12-02 14:25 wyx 閱讀(134) | 評論 (0)編輯 收藏

          JS 兩個時間之間相關問題


              var OneMonth = start.substring(5,start.lastIndexOf ('-'));  
              var OneDay = start.substring(start.length,start.lastIndexOf ('-')+1);  
              var OneYear = start.substring(0,start.indexOf ('-'));  
            
              var TwoMonth = end.substring(5,end.lastIndexOf ('-'));  
              var TwoDay = end.substring(end.length,end.lastIndexOf ('-')+1);  
              var TwoYear = end.substring(0,end.indexOf ('-'));  
            
              var cha=((Date.parse(OneMonth+'/'+OneDay+'/'+OneYear)- Date.parse(TwoMonth+'/'+TwoDay+'/'+TwoYear))/86400000);   
               alert(cha);


          var date1=new Date("2008/7/29");
          var date2=new Date();
          var nDiff=date2-date1;
          var nHour,nMini,nSecond;

          nHour=parseInt(nDiff/3600000);
          nMini=parseInt((nDiff%3600000)/60000);
          alert("今天距離昨天零點:\n"
            +nHour+":小時\n"
            +nMini+":分鐘");

          http://blog.csdn.net/xuStanly/article/details/2186411

          posted @ 2011-11-09 17:32 wyx 閱讀(158) | 評論 (0)編輯 收藏

          sql語句技巧 值得一看

          以下并非本人整理,但是看后感覺相當不錯,特此收藏共享。


          1、應用程序中,保證在實現功能的基礎上,盡量減少對數據庫的訪問次數;通過
          搜索參數,盡量減少對表的訪問行數,最小化結果集,從而減輕網絡負擔;能夠分
          開的操作盡量分開處理,提高每次的響應速度;在數據窗口使用SQL時,盡量把使
          用的索引放在選擇的首列;算法的結構盡量簡單;在查詢時,不要過多地使用通配
          符如SELECT * FROM T1語句,要用到幾列就選擇幾列如:SELECT COL1,COL2 FROM
          T1;在可能的情況下盡量限制盡量結果集行數如:SELECT TOP 300
          COL1,COL2,COL3 FROM T1,因為某些情況下用戶是不需要那么多的數據的。不要在
          應用中使用數據庫游標,游標是非常有用的工具,但比使用常規的、面向集的SQL
          語句需要更大的開銷;按照特定順序提取數據的查找。 

          2、 避免使用不兼容的數據類型。例如float和int、char和varchar、binary和
          varbinary是不兼容的。數據類型的不兼容可能使優化器無法執行一些本來可以進
          行的優化操作。例如: 
          SELECT name FROM employee WHERE salary > 60000 
          在這條語句中,如salary字段是money型的,則優化器很難對其進行優化,因為60000
          是個整型數。我們應當在編程時將整型轉化成為錢幣型,而不要等到運行時轉化。 

          3、 盡量避免在WHERE子句中對字段進行函數或表達式操作,這將導致引擎放棄
          使用索引而進行全表掃描。如: 
          SELECT * FROM T1 WHERE F1/2=100
          應改為: 
          SELECT * FROM T1 WHERE F1=100*2

          SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
          應改為:
          SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’

          SELECT member_number, first_name, last_name FROM members
          WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
          應改為:
          SELECT member_number, first_name, last_name FROM members
          WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
          即:任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢
          時要盡可能將操作移至等號右邊。

          4、 避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等這樣的操作符,
          因為這會使系統無法使用索引,而只能直接搜索表中的數據。例如: 
          SELECT id FROM employee WHERE id != 'B%' 
          優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。
           
          5、 盡量使用數字型字段,一部分開發人員和數據庫管理人員喜歡把包含數值信
          息的字段
          設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在
          處理查詢和連接回逐個比較字符串中每一個字符,而對于數字型而言只需要比較一
          次就夠了。

          6、 合理使用EXISTS,NOT EXISTS子句。如下所示:
          1.SELECT SUM(T1.C1)FROM T1 WHERE(
          (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
          2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
            SELECT * FROM T2 WHERE T2.C2=T1.C2)
          兩者產生相同的結果,但是后者的效率顯然要高于前者。因為后者不會產生大量鎖
          定的表掃描或是索引掃描。
          如果你想校驗表里是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費服
          務器資源。可以用EXISTS代替。如:
          IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
          可以寫成:
          IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')

          經常需要寫一個T_SQL語句比較一個父結果集和子結果集,從而找到是否存在在父
          結果集中有而在子結果集中沒有的記錄,如:
          1.SELECT a.hdr_key FROM hdr_tbl a---- tbl a 表示tbl用別名a代替
          WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key) 

          2.SELECT a.hdr_key FROM hdr_tbl a
          LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key WHERE b.hdr_key IS NULL 

          3.SELECT hdr_key FROM hdr_tbl
          WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl) 
            三種寫法都可以得到同樣正確的結果,但是效率依次降低。

          7、 盡量避免在索引過的字符數據中,使用非打頭字母搜索。這也使得引擎無法
          利用索引。  
          見如下例子:
          SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
          SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
          SELECT * FROM T1 WHERE NAME LIKE ‘L%’
          即使NAME字段建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不
          對全表所有數據逐條操作來完成任務。而第三個查詢能夠使用索引來加快操作。

          8、 分利用連接條件,在某種情況下,兩個表之間可能不只一個的連接條件,這
          時在 WHERE 子句中將連接條件完整的寫上,有可能大大提高查詢速度。
          例:
          SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO 
          SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
          AND A.ACCOUNT_NO=B.ACCOUNT_NO
          第二句將比第一句執行快得多。

          9、 消除對大型表行數據的順序存取
            盡管在所有的檢查列上都有索引,但某些形式的WHERE子句強迫優化器使用
          順序存取。如:
          SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR 
          order_num=1008
          解決辦法可以使用并集來避免順序存取:
          SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 
          UNION 
          SELECT * FROM orders WHERE order_num=1008 
          這樣就能利用索引路徑處理查詢。

          10、 避免困難的正規表達式
            LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時
          間。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” 
          即使在zipcode字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如
          果把語句改為SELECT * FROM customer WHERE zipcode >“98000”,在執行查詢
          時就會利用索引來查詢,顯然會大大提高速度。
          11、 使用視圖加速查詢
          把表的一個子集進行排序并創建視圖,有時能加速查詢。它有助于避免多重排序
          操作,而且在其他方面還能簡化優化器的工作。例如: 
          SELECT cust.name,rcvbles.balance,……other columns 
          FROM cust,rcvbles 
          WHERE cust.customer_id = rcvlbes.customer_id 
          AND rcvblls.balance>0 
          AND cust.postcode>“98000” 
          ORDER BY cust.name 
          如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個
          視圖中,并按客戶的名字進行排序: 
          CREATE VIEW DBO.V_CUST_RCVLBES
          AS 
          SELECT cust.name,rcvbles.balance,……other columns 
          FROM cust,rcvbles 
          WHERE cust.customer_id = rcvlbes.customer_id 
          AND rcvblls.balance>0 
          ORDER BY cust.name 

          然后以下面的方式在視圖中查詢: 
          SELECT * FROM V_CUST_RCVLBES
          WHERE postcode>“98000” 
          視圖中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤
          I/O,所以查詢工作量可以得到大幅減少。

          12、 能夠用BETWEEN的就不要用IN
          SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
          改成:
          SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
          因為IN會使系統無法使用索引,而只能直接搜索表中的數據。

          13、 DISTINCT的就不用GROUP BY
            SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
            可改為:
            SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
             

          14、 部分利用索引
            1.SELECT employeeID, firstname, lastname
          FROM names
          WHERE dept = 'prod' or city = 'Orlando' or division = 'food'

            2.SELECT employeeID, firstname, lastname FROM names WHERE dept =
          'prod'
          UNION ALL
          SELECT employeeID, firstname, lastname FROM names WHERE city = 'Orlando'
          UNION ALL
          SELECT employeeID, firstname, lastname FROM names WHERE division =
          'food'
          如果dept 列建有索引則查詢2可以部分利用索引,查詢1則不能。

          15、 能用UNION ALL就不要用UNION
          UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源

          16、 不要寫一些不做任何事的查詢
          如:SELECT COL1 FROM T1 WHERE 1=0
            SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2
          這類死碼不會返回任何結果集,但是會消耗系統資源。

          17、 盡量不要用SELECT INTO語句。
          SELECT INTO 語句會導致表鎖定,阻止其他用戶訪問該表。

          18、 必要時強制查詢優化器使用某個索引
            SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45) 
          改成:
          SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND
          processid IN (8,32,45)
          則查詢優化器將會強行利用索引IX_ProcessID 執行查詢。
             
          19、 雖然UPDATE、DELETE語句的寫法基本固定,但是還是對UPDATE語句給點建
          議:
          a) 盡量不要修改主鍵字段。
          b) 當修改VARCHAR型字段時,盡量使用相同長度內容的值代替。
          c) 盡量最小化對于含有UPDATE觸發器的表的UPDATE操作。
          d) 避免UPDATE將要復制到其他數據庫的列。
          e) 避免UPDATE建有很多索引的列。
          f) 避免UPDATE在WHERE子句條件中的列。


          上面我們提到的是一些基本的提高查詢速度的注意事項,但是在更多的情況下,往往
          需要反復試驗比較不同的語句以得到最佳方案。最好的方法當然是測試,看實現相
          同功能的SQL語句哪個執行時間最少,但是數據庫中如果數據量很少,是比較不出
          來的,這時可以用查看執行計劃,即:把實現相同功能的多條SQL語句考到查詢分
          析器,按CTRL+L看查所利用的索引,表掃描次數(這兩個對性能影響最大),總體
          上看詢成本百分比即可。
          簡單的存儲過程可以用向導自動生成:在企業管理器工具欄點擊運行向導圖標,點
          擊”數據庫”、”創建存儲過程向導”。復雜存儲過程的調試:在查詢分析器左邊
          的對象瀏覽器(沒有?按F8)選擇要調試的存儲過程,點右鍵,點調試,輸入參數
          執行,出現一個浮動工具條,上面有單步執行,斷點設置等。

          posted @ 2011-11-09 10:47 wyx 閱讀(203) | 評論 (0)編輯 收藏

          jsp頁面輸出類型選擇(HTML或EXCEL)

               摘要:   閱讀全文

          posted @ 2011-11-03 10:56 wyx 閱讀(617) | 評論 (0)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 
          主站蜘蛛池模板: 长岭县| 喀喇沁旗| 深水埗区| 孟州市| 麦盖提县| 开阳县| 巢湖市| 鄂尔多斯市| 霍林郭勒市| 鸡东县| 龙里县| 河津市| 上虞市| 大关县| 渭源县| 靖州| 晋江市| 湖南省| 凌云县| 周宁县| 张北县| 鄂托克旗| 抚顺市| 峨山| 寻甸| 丹江口市| 肇州县| 定西市| 海丰县| 汕尾市| 石渠县| 湖南省| 静安区| 东城区| 那坡县| 康保县| 中山市| 昌黎县| 西充县| 台东市| 舞钢市|