Ⅰ Quicksql——更簡單,更安全,更快速的跨數據源統一SQL查詢引擎
SQL,全稱Structured Query Language,是當今使用最廣泛的數據查詢語言。最初的設計僅僅是適用於RDBMS,可是隨著數據底層存儲結構設計的大爆發,越來越多的數據存儲引擎支持SQL查詢。甚至於支持SQL查詢幾乎可以定義為這個數據存儲引擎能否廣泛應用於生產環境的一種標准,最典型的案例就是Hive。Elasticsearch和Druid雖然原生不支持,但從官網發布的消息來看,SQL支持正在計劃中。
只可惜ANSI針對SQL僅僅是提供了一種標准,數據存儲引擎均在此基礎上做了不同的發展演化。發展至今,不同引擎的SQL差異化愈發明顯,數據分析人員必須學習使用不同的SQL語言來適應不同的數據存儲生產環境,這本身就違背了SQL設計的初衷。另一方面來說,不同數據存儲引擎間因數據結構的差異,不能將數據放在一起進行計算 探索 ,這也極大的限制了數據分析人員的分析成果可能性。
於是,Quicksql(簡稱QSQL)誕生啦!
上面四張圖展示了 QuickSQL 統一查詢的性能比較,由於 QuickSQL 會犧牲一次解析的時間輔助查詢,所以在 MySQL 和 Elasticsearch 的查詢中會慢 0.5 s,在 Hive 查詢中由於底層使用了 Spark-Hive 作引擎,因此性能會稍優於 Hive 原生查詢。
最後一張圖展示了在混查場景下的性能比較,可以看到在處理 MySQL 和 Elasticsearch 的關聯查詢時,由於數據源自身具備索引,QuickSQL 能夠充分利用數據源本身的能力實現下推執行,性能會遠遠優於 Hive 數據源與其他數據源在同等規模數據下關聯的性能。
Ⅱ 同數據源,並行方式提交的sql查詢語句,資料庫中是並行執行這些sql語句,還是以隊列的方式執行的
你可以寫三個需要運行時行很長的sql語句,中間不用go分隔,就是你要的現象了,我試過,是一齊運行的。
Ⅲ sql 登陸不了 數據源運行程序的問題
從連接方式上,你使用了ODBC數據源的方式登錄,具體為在你的程序中,資料庫連接字元串里邊只是寫了「DSN=<ODBC數據源名稱>」之類的一堆東西,那你應該到「控制面板」->「管理工具」->「數據源(ODBC)」里看看設置,里邊的每個數據源都是設置了帳號密碼,不是資料庫自己的帳號密碼就是WINDOWS的帳號密碼。我估計你的情況就是後者。
Ⅳ sql語句能不能作為查詢的數據源
sql語句能作為查詢的數據源。一個查詢可以作為另一個查詢的數據源,而且是必須的,這是編寫sql語句時常用到的手段之一,否則sql查詢解決問題的能力會被大打折扣,這樣的資料庫管理系統是不會有市場的。可以這樣說市面上流行的資料庫管理系統都支持將一個查詢作為另一個查詢的數據源。
Ⅳ spark3.0.0版本中sparksql中創建dataframe和執行sql的入口是
在Spark SQL中SparkSession是創建DataFrame和執行SQL的入口,創建DataFrame有三種方式:通過Spark的數據源進行創建;從一個存在的RDD進行轉換;還可以從Hive Table進行查詢返回。
1)從Spark數據源進行創建
(1)查看Spark數據源進行創建的文件格式
scala> spark.read.
csv format jdbc json load option options orc parquet schema table text textFile
(2)讀取json文件創建DataFrame
scala> val df = spark.read.json(「/opt/mole/spark/examples/src/main/resources/people.json」)
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
(3)展示結果
2)從RDD進行轉換
3)從Hive Table進行查詢返回。
Ⅵ 遠程連接SQL數據源
// S6_1Dlg.cpp : 實現文件
//
#include "stdafx.h"
#include "S6_1.h"
#include "S6_1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用於應用程序「關於」菜單項的 CAboutDlg 對話框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 對話框數據
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CS6_1Dlg 對話框
CS6_1Dlg::CS6_1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CS6_1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//初始化資料庫操作
ifbegin=TRUE;//第一次打開
CString m_dbstr,m_errmsg,m_SQLstr;
m_dbstr.Format("DSN=%s;UID=%s;PWD=%s","SampleDB","","");//資料庫名稱,用戶,口令
TRY{
if(m_db.IsOpen())
m_db.Close();
m_db.OpenEx(m_dbstr);//通過ODBC來打開資料庫
m_record=new CRecordset(&m_db);
m_SQLstr="select * from CustomerTable;";//准備要執行的SQL語句
if(m_record->IsOpen())
m_record->Close();
m_record->Open(CRecordset::dynaset,m_SQLstr);//執行SQL語句,得到記錄集
if(m_record->IsBOF())
AfxMessageBox("NO RECORD IN TABLE");//報告記錄集是否為空
}
CATCH_ALL(e){
e->GetErrorMessage(m_errmsg.GetBuffer(128),128);
AfxMessageBox(m_errmsg);
return;
}
END_CATCH_ALL
}
void CS6_1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_userID);
DDX_Control(pDX, IDC_EDIT2, m_pwd);
DDX_Control(pDX, IDC_EDIT3, m_sex);
DDX_Control(pDX, IDC_EDIT4, m_old);
DDX_Control(pDX, IDC_EDIT5, m_Email);
DDX_Control(pDX, IDC_BUTTON1, m_button1);
DDX_Control(pDX, IDC_BUTTON2, m_button2);
}
BEGIN_MESSAGE_MAP(CS6_1Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
// CS6_1Dlg 消息處理程序
BOOL CS6_1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 將\「關於...\」菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令范圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO:在此添加額外的初始化代碼
return TRUE; // 除非設置了控制項的焦點,否則返回 TRUE
}
void CS6_1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。對於使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void CS6_1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪制的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪制圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//當用戶拖動最小化窗口時系統調用此函數取得游標顯示。
HCURSOR CS6_1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CS6_1Dlg::OnBnClickedButton1()//查詢下一條記錄
{
// TODO:在此添加控制項通知處理程序代碼
CString m_errmsg;
CDBVariant m_value;//存放記錄中的欄位值
TRY{
if(ifbegin)
{
m_record->MoveFirst();
ifbegin=FALSE;
}
else
m_record->MoveNext();//移向下一條記錄
if(!m_record->IsEOF())
{
m_record->GetFieldValue("UserID",m_value);
m_userID.SetWindowText(*m_value.m_pstring);//得到userID
m_record->GetFieldValue("UserPassword",m_value);
m_pwd.SetWindowText(*m_value.m_pstring);//得到密碼
m_record->GetFieldValue("Sex",m_value);
m_sex.SetWindowText(*m_value.m_pstring);//得到用戶的性別
m_record->GetFieldValue("Old",m_value);
CString str;
str.Format("%d",m_value.m_iVal);
m_old.SetWindowText(str);//得到用戶的年齡
m_record->GetFieldValue("Email",m_value);
m_Email.SetWindowText(*m_value.m_pstring);//得到用戶的電子郵件地址
}
else
{
AfxMessageBox("已經到達記錄集尾,單擊『清除』按鈕可以返回記錄集頂端");
m_button1.EnableWindow(FALSE);//禁止再繼續查詢
}
}
CATCH_ALL(e){
e->GetErrorMessage(m_errmsg.GetBuffer(128),128);
AfxMessageBox(m_errmsg);
return;
}
END_CATCH_ALL
}
void CS6_1Dlg::OnBnClickedButton2()//清空編輯控制項中的數據
{
// TODO:在此添加控制項通知處理程序代碼
m_Email.SetWindowText("");
m_userID.SetWindowText("");
m_old.SetWindowText("");
m_pwd.SetWindowText("");
m_sex.SetWindowText("");
ifbegin=TRUE;//將資料庫重新置成新打開的狀態
m_button1.EnableWindow(TRUE);//允許重新開始查看記錄
}
void CS6_1Dlg::OnBnClickedCancel()
{
// TODO: 在此添加控制項通知處理程序代碼
OnCancel();
}
Ⅶ 數據源如果為sql
1、進入數據源管理頁面。
2、在數據源管理頁面,單擊右上角的新增數據源。
3、在新增數據源對話框中,選擇數據源類型為SQLServer。
4、在新增SQLServer數據源對話框中,配置各項參數。
5、以新增SQLServer>連接串模式類型的數據源為例。
6、選擇資源組連通性類型為數據集成。
7、在資源組列表,單擊相應資源組後的測試連通性。
8、測試連通性通過後,單擊完成。
Ⅷ VC中如何執行SQL語句(用SQLServer的數據源)
使用 ADODB.Command 來調用存儲過程,如:
Dim adoComm As Object
'// 創建一個對象,我們用來調用存儲過程
Set adoComm = CreateObject("ADODB.Command")
With adoComm
'// 設置連接,假設 adoConn 為已經連接的 ADODB.Connection 對象
.ActiveConnection = adoConn
'// 類型為存儲過程,adCmdStoredProc = 4
.CommandType = 4
'// 存儲過程名稱
.CommandText = "你的存儲過程名稱"
'// 設置輸入參數
.Parameters.Item("@輸入參數").Value = "值"
'// 執行存儲過程
.Execute
If .Parameters.Item("@返回參數名稱").Value = True Then
Else
End If
End With
'// 釋放對象
Set adoComm = Nothing
Ⅸ c#訪問資料庫用的是什麼協議
ado.net協議
Connection對象:與數據源建立連接,連接sql server7.0 或更新版本資料庫用SqlConnection,連接OLEDB數據源使用OledbConnection.
Command 對象:對數據源執行SQL命令並返回結果,SQL Server7.0或更新版本用SqlCommand,OLE DB數據源使用OledbCommand.
DataReader對象: 讀取數據源的數據,只能將數據源的數據從頭到尾依次讀出,Sql server7.0或以上版本使用SqlDataReader,Oledb數據源使用OledbReader
DataAdapter對象:對數據源執行操作並返回結果,在DataSet與數據源之間建立通信,將數據源中的數據寫入DataSet ,或根據DataSet中的數據必定數據源。Sql server7.0或以上版本使用SqlDataAdapter,Oledb 數據源使用OledbAdpater.
DataSet對象: 伺服器內存中的資料庫
DataView對象: 用於顯示DataSet中的數據