ホームページ データベース mysql チュートリアル Access分页及效率分析(MSSQL Server、Oracle分页)

Access分页及效率分析(MSSQL Server、Oracle分页)

Jun 07, 2016 pm 03:50 PM
access mssql o server 分析する ページネーション 効率

在实际过运用过程中,我们开发的项目有时需要支持多种数据库,那么在开发中我们会遇到不同的数据库在SQL语句方面还有区别,导致我们有些细节需要去调整,下面就分页功能在不同的数据库中的具体使用详细说明。 一、Access数据库分页与效率分析 由于Access操作

 在实际过运用过程中,我们开发的项目有时需要支持多种数据库,那么在开发中我们会遇到不同的数据库在SQL语句方面还有区别,导致我们有些细节需要去调整,下面就分页功能在不同的数据库中的具体使用详细说明。

 

一、Access数据库分页与效率分析
        由于Access操作简单,调用,迁移方便,节省费用,对于搭建者的能力要求也会低些,对于较小量的数据,我们使用Access数据库是比较适合的,但是随着数据量增加,达到几十万、几百万甚至更多的时候,那么数据库的效率就会出现问题了,这个时候比如像分页功能可能就出现问题了,下面我们就看看常见的Access分页有哪些方式?

        方案一:使用ADO.NET本身的结果集,使用PageSize,AbsolutePage的属性来进行分页
                        当然我一般不推荐使用拖控件进行快速开发,拖控件会导致产生大量的垃圾代码,是网站效率低下,当然在后台可以使用部分控件,今天就不说.NET拖控件效率低下的问题了,使用ADO.NE的结果集方式,每次都要读入符合条件的所有记录,然后再定位于对应页的记录。当数据量大的时候,效率就十分的低下。
        方案二:使用not in 方式

                       select top 3 * from Article where Id not in(select top 6 Id from Article)
                       使用not in 方式,其中的top效率很高,但是not in 呢? 测试发现,当数据量比较小时还是挺快的,但是当到达10万条数据是,单击查询就慢了,如果使用该分页方式,当数据量很大时,估计天天有人在骂:这是哪个SB开发的系统啊,这么垃圾!
       方案三:使用select top pageSize * from (select top pageindex*pageSize * from ywgl_news order by id desc) order by id
                       在实际过程中发现,当数据量比较大是,使用这种方式分页,Access的效率还可以,比not in 方式效率高多了,但是此处也需要注意的是:很多人喜欢使用select * from 表名, 实际中发现这不是一个好习惯,我们应该需要什么字段查询什么字段,这样能够极大的节省服务器资源。

 

二、MSSQL Server和Oracle数据库的分页
        当然MSSQL Server和Oracle数据库的分页可以选择的方式更多,除了使用ADO.NET数据集、Not in 方式、Select top方式外,还有row_number方式等更好的分页实现方式,
                  select * from
                               (select * ,row_number() over(order by Id) rownumber from T_Users) as t
                  where t.rownumber>4 and t.rownumber         需要注意的是:在MSSQL Server和Oracle中使用row_number还有些细节不同,下面就是Oracle和MS SqlServer中的具体分页方式:
                  int start = (pageindex - 1) * pageSize;
                  int end = pageindex * pageSize;
       Oracle的分页T-SQL语句:
                 string sql = "select * from(select a.*,rownum row_num from(select * from ywgl_news t {0} order by t.Id desc) a)b where b.row_num>" + start.ToString() + " and b.row_num         MSSQL Server的分页T-SQL语句:
                 string sql = "select * from(select * ,row_number() over(order by Id) rownumber from ywgl_news {0}) as t where t.rownumber>"+start.ToString()+" and t.rownumber

 

三、附录存储过程的写法(MSSQL SERVER为例)      
        --创建存储过程row_number方式
        alter proc GetPageForRownumber
        (
               @pageIndex int,--当前页
               @pageSize int,--页容量
               @rowCount int out,--总行数
               @pageCount int out --总页数
         )
         as
         begin
         declare @sql nvarchar(225)
         select @rowCount=count(Id),@pageCount=ceiling((count(Id)+0.0)/@pageSize) from T_Users
         set @sql='select * from
                                        (select * ,row_number() over(order by Id) rownumber from T_Users) as t
                          where t.rownumber>'+str((@pageIndex-1)*@pageSize)+' and t.rownumber           exec(@sql)
          end

         ---测试row_number 方式的存储过程
         declare @rc int,@pc int
         exec GetPageForRownumber 3,2,@rc out,@pc out
         select @rc,@pc

 

四、开发中遇到的小问题
       1、报错"标准表达式中数据类型不匹配。"
             Access在进行参数化查询的时候老是报错,这让哥很纳闷啊,看着SQL语句也是对的,参数的值也是对的,为什么老是提示报错呢?如下图代码就会报该错误。
                          string sql = "UPDATE ywgl_News set New_Title=@New_Title, New_Source=@New_Source ,New_ReadCount=@New_ReadCount,New_Content=@New_Content,New_Summary=@New_Summary,New_Author=@New_Author,New_ClassId=@New_ClassId where Id=@Id";
                        OleDbParameter[] para = new OleDbParameter[]
                        {
                     
                                 new OleDbParameter("@Id",model.New_id),
                                 new OleDbParameter("@New_Title",ToDBValue(model.New_title)),
                                 new OleDbParameter("@New_Source",ToDBValue(model.New_source)),
                                 new OleDbParameter("@New_ReadCount",ToDBValue(model.New_readcount)),
                                 new OleDbParameter("@New_Content",ToDBValue(model.New_content)),
                                 new OleDbParameter("@New_Summary",ToDBValue(model.New_summary)),
                                 new OleDbParameter("@New_Author", ToDBValue(model.New_author)),
                                 new OleDbParameter("@New_ClassId",ToDBValue(model.New_class.Id))  
                         };
                         num = AccessHelper.ExecuteNonQuery(sql, para);
         经过查找原因,原来问题出在”@“符号上了,我们可以用”?“占位符替换,这个MSSQL Server有点小不同,如果使用了”@“那么就要确保各个参数的顺序一致。否则就报该错误。
         2、在删除操作时删除不了
               各个数据库具体T-SQL语句还有些不同,在Oracle中中 string sql = "Delete ywgl_news where Id=:Id";可以删除,没问题,但是在Access中这样写就不行了应该这样写:
                string sql = "Delete from ywgl_news where Id=@Id";

 

五、总结三种不同数据库的分页方式及效率
        那么我们在实际应用中,到底该选择哪种类型的数据库呢?使用Access,还是MSSQL Server,还是Oracle?不要觉得Oracle就觉得你的系统很牛B,这个需要根据系统的定位和使用者来进行确定,如果说是一个很小的政府门户网站,数据量也很小,那么用一个Access完全够了,而且数据量很小的时候,Access的速度还更快,当然如果说是做GIS的国土数据整合系统,那像这样的海量的数据,那就肯定需要用像Oracle大型数据库了。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 でバックグラウンド アプリケーションを無効にする方法_バックグラウンド アプリケーションを無効にする Windows 11 チュートリアル Windows 11 でバックグラウンド アプリケーションを無効にする方法_バックグラウンド アプリケーションを無効にする Windows 11 チュートリアル May 07, 2024 pm 04:20 PM

1. Windows 11で設定を開きます。 Win+I ショートカットまたはその他の方法を使用できます。 2. 「アプリ」セクションに移動し、「アプリと機能」をクリックします。 3. バックグラウンドでの実行を禁止したいアプリケーションを見つけます。三点ボタンをクリックして、[詳細オプション] を選択します。 4. [バックグラウンド アプリケーションのアクセス許可] セクションを見つけて、目的の値を選択します。デフォルトでは、Windows 11 は電力最適化モードを設定します。これにより、Windows はアプリケーションがバックグラウンドでどのように動作するかを管理できるようになります。たとえば、バッテリーを節約するためにバッテリー セーバー モードを有効にすると、システムはすべてのアプリを自動的に終了します。 5. アプリケーションがバックグラウンドで実行されないようにするには、[なし] を選択します。プログラムが通知を送信していない、データの更新に失敗しているなどに気付いた場合は、次のことができることに注意してください。

DeepSeek PDFを変換する方法 DeepSeek PDFを変換する方法 Feb 19, 2025 pm 05:24 PM

DeepSeekはファイルを直接PDFに変換できません。ファイルの種類に応じて、異なる方法を使用できます。一般的なドキュメント(Word、Excel、PowerPoint):Microsoft Office、Libreoffice、その他のソフトウェアを使用してPDFとしてエクスポートします。画像:画像ビューアまたは画像処理ソフトウェアを使用してPDFとして保存します。 Webページ:ブラウザの「Print into PDF」関数を使用するか、PDFツールに専用のWebページを使用します。 UNCOMMONフォーマット:適切なコンバーターを見つけて、PDFに変換します。適切なツールを選択し、実際の状況に基づいて計画を作成することが重要です。

Oracleでdbfファイルを読み取る方法 Oracleでdbfファイルを読み取る方法 May 10, 2024 am 01:27 AM

Oracle は、次の手順で dbf ファイルを読み取ることができます。外部テーブルを作成し、その dbf ファイルを参照し、データを Oracle テーブルにインポートします。

PHP で配列のページネーションを実装する最良の方法 PHP で配列のページネーションを実装する最良の方法 May 04, 2024 pm 02:39 PM

PHP 配列のページネーションを行う最も一般的な方法は 2 つあります。array_slice() 関数を使用します。スキップする要素の数を計算し、指定された範囲の要素を抽出します。組み込みイテレータを使用する: Iterator インターフェイスを実装し、rewind()、key()、current()、next()、および valid() メソッドを使用して、指定された範囲内の要素を走査します。

Botanix の解釈: ネットワーク資産管理のための分散型 BTC L2 (対話型チュートリアル付き) Botanix の解釈: ネットワーク資産管理のための分散型 BTC L2 (対話型チュートリアル付き) May 08, 2024 pm 06:40 PM

昨日、BotanixLabs は、Polychain Capital、Placeholder Capital などの参加を得て、総額 1,150 万米ドルの資金調達を完了したと発表しました。資金は、BTCL2Botanix に相当する分散型 EVM を構築するために使用されます。スパイダーチェーンは、EVM の使いやすさとビットコインのセキュリティを組み合わせています。 2023 年 11 月にテストネットが稼働して以来、アクティブなアドレスは 200,000 を超えています。 Odaily では、この記事で Botanix の特徴的なメカニズムとテストネットの相互作用プロセスを分析します。 Botanix 公式定義によると、Botanix はビットコイン上に構築された分散型チューリング完全 L2EVM であり、2 つのコア コンポーネントで構成されています: イーサリアム仮想マシン

アクセス違反エラーの解決方法 アクセス違反エラーの解決方法 May 07, 2024 pm 05:18 PM

アクセス違反エラーは、プログラムがメモリ割り当てを超えたメモリ位置にアクセスしたときに発生する実行時エラーで、プログラムがクラッシュまたは異常終了します。解決策としては、配列境界のチェック、適切なメモリ割り当て関数の使用、ドライバとシステムの更新、ソフトウェア ベンダーへの問い合わせが挙げられます。 。

Win11 でリモート デスクトップ コントロールを有効にする方法_Win11 でリモート デスクトップ コントロールを有効にする方法 Win11 でリモート デスクトップ コントロールを有効にする方法_Win11 でリモート デスクトップ コントロールを有効にする方法 May 08, 2024 pm 12:19 PM

1. [スタート] メニューで [コントロール パネル] ページを検索します。 2. 次に、コントロール パネルでビューを [カテゴリ] に変更し、[システムとセキュリティ] をクリックします。 3. 「システム」の下にある「Allowremoteaccess」ボタンを見つけてクリックします。 4. ポップアップ ウィンドウで、[リモート システムのプロパティ] 列をクリックし、[このコンピュータへのリモート接続を許可する] ボタンをオンにして、[OK] をクリックして保存します。

Java リフレクション メカニズムはクラスの動的ロードをどのように実装しますか? Java リフレクション メカニズムはクラスの動的ロードをどのように実装しますか? May 04, 2024 pm 03:42 PM

Java リフレクション メカニズムを使用すると、実行時にクラスを動的にロードしてインスタンス化でき、クラス、メソッド、フィールドなどの java.lang.reflect パッケージ内のクラスを通じてクラスのメタデータを操作できます。 Example クラスのロード、オブジェクトのインスタンス化、メソッドの取得と呼び出しの実際のケースを通じて、動的にロードされるクラスでのアプリケーションをデモンストレーションすることで、プログラミングの問題を解決し、柔軟性を向上させることができます。

See all articles